name: Build & Deploy on: push: branches: - main - staging - dev env: REGISTRY: git.severostudio.ru IMAGE_NAME: ${{ github.repository }} jobs: build: name: Build & Push runs-on: master-builder steps: - name: Checkout uses: actions/checkout@v4 - name: Login to Gitea Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and Push uses: docker/build-push-action@v6 with: context: . push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} deploy: name: Deploy runs-on: master-builder needs: build steps: - name: Checkout uses: actions/checkout@v4 - name: Encode Docker Stack id: stack run: | echo "content=$(base64 -w 0 docker-stack.yml)" >> "$GITHUB_OUTPUT" - name: Deploy via SSH uses: appleboy/ssh-action@v1 env: BRANCH: ${{ github.ref_name }} REGISTRY: ${{ env.REGISTRY }} IMAGE_NAME: ${{ env.IMAGE_NAME }} REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} STACK_FILE: ${{ steps.stack.outputs.content }} with: host: ${{ secrets.DEPLOY_HOST }} username: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_SSH_KEY }} envs: BRANCH,REGISTRY,IMAGE_NAME,REGISTRY_USERNAME,REGISTRY_PASSWORD,STACK_FILE script: | set -e IMAGE="${REGISTRY}/${IMAGE_NAME}:${BRANCH}" DEPLOY_DIR="/opt/${IMAGE_NAME}/${BRANCH}" STACK_NAME="$(echo "${IMAGE_NAME}" | tr '/' '-')-${BRANCH}" echo "=== Deployment ===" echo "Branch: ${BRANCH}" echo "Image: ${IMAGE}" echo "Directory: ${DEPLOY_DIR}" echo "Stack: ${STACK_NAME}" mkdir -p "${DEPLOY_DIR}" echo "${STACK_FILE}" | base64 -d > "${DEPLOY_DIR}/docker-stack.yml" echo "${REGISTRY_PASSWORD}" | docker login "${REGISTRY}" \ -u "${REGISTRY_USERNAME}" \ --password-stdin docker pull "${IMAGE}" export IMAGE="${IMAGE}" docker stack deploy \ --compose-file "${DEPLOY_DIR}/docker-stack.yml" \ --with-registry-auth \ "${STACK_NAME}" echo "=== Services ===" docker stack services "${STACK_NAME}" gc: name: Docker GC runs-on: master-builder needs: - build - deploy if: always() steps: - name: Cleanup builder run: | docker container prune -f docker image prune -af docker builder prune -af || true echo "=== Docker disk usage ===" docker system df df -h /