GitHub Action and Docker image used to deploy a Docker stack on a Docker Swarm.
GitHub Action Input | Environment Variable | Summary | Required | Default Value |
---|---|---|---|---|
registry |
REGISTRY |
Specify which container registry to login to. | ||
username |
USERNAME |
Container registry username. | ||
password |
PASSWORD |
Container registry password. | ||
remote_host |
REMOTE_HOST |
Hostname or address of the machine running the Docker Swarm manager node | ✅ | |
remote_port |
REMOTE_PORT |
SSH port to connect on the the machine running the Docker Swarm manager node. | 22 | |
remote_user |
REMOTE_USER |
User with SSH and Docker privileges on the machine running the Docker Swarm manager node. | ✅ | |
remote_private_key |
REMOTE_PRIVATE_KEY |
Private key used for ssh authentication. | ✅ | |
deploy_timeout |
DEPLOY_TIMEOUT |
Seconds, to wait until the deploy finishes | 600 | |
stack_file |
STACK_FILE |
Path to the stack file used in the deploy. | ✅ | |
stack_name |
STACK_NAME |
Name of the stack to be deployed. | ✅ | |
stack_param |
STACK_PARAM |
Additional parameter (env var) to be passed to the stack. | ||
env_file |
ENV_FILE |
Additional environment variables to be passed to the stack. | ||
debug |
DEBUG |
Verbose logging | 0 |
Add, or edit an existing, yaml
file inside .github/actions
and use the configuration options listed above.
name: Deploy Staging
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout codebase
uses: actions/checkout@v2
- name: Deploy
uses: shockhs/docker-stack-deploy@v1.2
with:
remote_host: ${{ secrets.REMOTE_HOST }}
remote_user: ${{ secrets.REMOTE_USER }}
remote_private_key: ${{ secrets.REMOTE_PRIVATE_KEY }}
stack_file: "stacks/plone.yml"
stack_name: "plone-staging"
First, follow the steps to create a Personal Access Token.
name: Deploy Live
on:
push:
tags:
- '*.*.*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout codebase
uses: actions/checkout@v2
- name: Deploy
uses: shockhs/docker-stack-deploy@v1.2
with:
registry: "ghcr.io"
username: ${{ secrets.GHCR_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
remote_host: ${{ secrets.REMOTE_HOST }}
remote_user: ${{ secrets.REMOTE_USER }}
remote_private_key: ${{ secrets.REMOTE_PRIVATE_KEY }}
stack_file: "stacks/plone.yml"
stack_name: "plone-live"
stack_param: "foo"
It is possible to directly use the ghcr.io/shockhs/docker-stack-deploy
Docker image, passing the configuration options as environment variables.
Considering you have a local file named .env_deploy
with content:
REGISTRY=hub.docker.com
USERNAME=foo_usr
PASSWORD=averylargepasswordortoken
REMOTE_HOST=192.168.17.2
REMOTE_PORT=22
REMOTE_USER=user
STACK_FILE=path/to/stack.yml
STACK_NAME=mystack
DEBUG=1
Run the following command:
docker run --rm
-v "$(pwd)":/github/workspace
-v /var/run/docker.sock:/var/run/docker.sock
--env-file=.env_deploy
-e REMOTE_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
ghcr.io/shockhs/docker-stack-deploy:latest
On your GitLab project, go to Settings -> CI/CD
and add the environment variables under Variables.
Then edit your .gitlab-cy.yml
to include the deploy
step:
image: busybox:latest
services:
- docker:20.10.16-dind
before_script:
- docker info
deploy:
stage: deploy
varibles:
REGISTRY: ${REGISTRY}
USERNAME: ${REGISTRY_USER}
PASSWORD: ${REGISTRY_PASSWORD}
REMOTE_HOST: ${DEPLOY_HOST}
REMOTE_PORT: 22
REMOTE_USER: ${DEPLOY_USER}
REMOTE_PRIVATE_KEY: "${DEPLOY_KEY}"
STACK_FILE: stacks/app.yml
STACK_NAME: app
DEPLOY_IMAGE: ghcr.io/shockhs/docker-stack-deploy:latest
script:
- docker pull ${DEPLOY_IMAGE}
- docker run --rm
-v "$(pwd)":/github/workspace
-v /var/run/docker.sock:/var/run/docker.sock
-e REGISTRY=${REGISTRY}
-e USERNAME=${USERNAME}
-e PASSWORD=${PASSWORD}
-e REMOTE_HOST=${REMOTE_HOST}
-e REMOTE_PORT=${REMOTE_PORT}
-e REMOTE_USER=${REMOTE_USER}
-e REMOTE_PRIVATE_KEY="${REMOTE_PRIVATE_KEY}"
-e STACK_FILE=${STACK_FILE}
-e STACK_NAME=${STACK_NAME}
-e DEBUG=1
${DEPLOY_IMAGE}
Please DO NOT commit to version branches directly. Even for the smallest and most trivial fix.
ALWAYS open a pull request and ask somebody else to merge your code. NEVER merge it yourself.
This repository also uses the docker-stack-wait
script, available at GitHub.
The logo is based on rocket icon.
The project is licensed under MIT License