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" deploy: name: Deploy runs-on: ubuntu-latest needs: - fact-finding 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 }} run: | ESCAPED=$(printf '%s' "$WAHLRECHT_MONGODB_CONNECTION_STRING" | sed 's/&/\\&/g') sed -i "s||$ESCAPED|g" docker/${{ matrix.env }}/stack-config/wahlrecht.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" done