Files
cloud-configuration/.github/workflows/deploy.yaml
T

103 lines
4.0 KiB
YAML

name: Deploy to Swarm
on:
workflow_dispatch:
inputs:
deploy:
description: 'Should we deploy?'
required: true
type: boolean
push:
branches:
- main
paths:
- 'docker/**'
env:
REGISTRY: ghcr.io
IMAGE_NAME: 2martens/docker-nginx
jobs:
fact-finding:
name: Detect changed environments
runs-on: ubuntu-latest
outputs:
changed_envs: ${{ steps.detect.outputs.changed_envs }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Determine which environments changed
id: detect
run: |
echo "changed_envs=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^docker/' | cut -d/ -f2 | sort -u | tr '\n' ' ')" >> "$GITHUB_OUTPUT"
update-nginx:
name: Update Nginx image
uses: 2martens/cloud-configuration/.github/workflows/create-nginx.yaml@main
permissions:
contents: read
packages: write
attestations: write
id-token: write
deploy:
name: Deploy
runs-on: ubuntu-latest
needs:
- fact-finding
- update-nginx
strategy:
matrix:
env: [ test ]
environment: ${{ matrix.env }}
steps:
- uses: actions/checkout@v4
- name: Exit if this environment wasn't changed
id: check
run: |
echo "Changed envs: '${{ needs.fact-finding.outputs.changed_envs }}'"
if [[ (${{ github.event_name }} == 'workflow_dispatch' && "${{ github.event.inputs.deploy }}" == 'true') || "${{ needs.fact-finding.outputs.changed_envs }}" =~ "${{ matrix.env }}" ]]; then
echo "should_deploy=true" >> $GITHUB_OUTPUT
else
echo "should_deploy=false" >> $GITHUB_OUTPUT
fi
shell: bash
- name: Insert secrets
if: steps.check.outputs.should_deploy == 'true'
env:
WAHLRECHT_MONGODB_CONNECTION_STRING: ${{ secrets.WAHLRECHT_MONGODB_CONNECTION_STRING }}
TIMETABLE_MONGODB_CONNECTION_STRING: ${{ secrets.TIMETABLE_MONGODB_CONNECTION_STRING }}
TIMETABLE_DB_CLIENT_ID: ${{ secrets.TIMETABLE_DB_CLIENT_ID }}
TIMETABLE_DB_CLIENT_SECRET: ${{ secrets.TIMETABLE_DB_CLIENT_SECRET }}
run: |
ESCAPED=$(printf '%s' "$WAHLRECHT_MONGODB_CONNECTION_STRING" | sed 's/&/\\&/g')
sed -i "s|<wahlrecht_mongodb_connection_string>|$ESCAPED|g" docker/${{ matrix.env }}/stack-config/wahlrecht.yaml
ESCAPED=$(printf '%s' "$TIMETABLE_MONGODB_CONNECTION_STRING" | sed 's/&/\\&/g')
sed -i "s|<timetable_mongodb_connection_string>|$ESCAPED|g" docker/${{ matrix.env }}/stack-config/timetable.yaml
ESCAPED=$(printf '%s' "$TIMETABLE_DB_CLIENT_ID" | sed 's/&/\\&/g')
sed -i "s|<timetable_db_client_id>|$ESCAPED|g" docker/${{ matrix.env }}/stack-config/timetable.yaml
ESCAPED=$(printf '%s' "$TIMETABLE_DB_CLIENT_SECRET" | sed 's/&/\\&/g')
sed -i "s|<timetable_db_client_secret>|$ESCAPED|g" docker/${{ matrix.env }}/stack-config/timetable.yaml
- name: Copy files to remote
if: steps.check.outputs.should_deploy == 'true'
uses: burnett01/rsync-deployments@7.0.2
with:
switches: -az -r --del
path: docker/${{ matrix.env }}/stack-config/.
remote_path: ~/stack-config
remote_host: ${{ secrets.DEPLOY_HOST }}
remote_port: ${{ secrets.DEPLOY_PORT }}
remote_user: ${{ secrets.DEPLOY_USER }}
remote_key: ${{ secrets.DEPLOY_KEY }}
- name: Deploy applications
if: steps.check.outputs.should_deploy == 'true'
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ matrix.env }}
for f in ~/stack-config/*.yaml; do
NAME=$(basename "$f" .yaml)
docker stack deploy -c "$f" "$NAME" --detach=false
done