name: "Publish and deploy"
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  push:
    branches: [ "master", "deploy-test" ]

jobs:
  upload-image:
    name: Upload Octobot Docker image
    runs-on: ubuntu-latest
    permissions:
      packages: write
    environment: production

    steps:
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          push: true
          tags: ghcr.io/${{vars.NAMESPACE}}/${{vars.IMAGE_NAME}}:latest
          build-args: |
            BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
            PUBLISH_OPTIONS=${{vars.PUBLISH_OPTIONS}}

  update-production:
    name: Update Octobot on production
    runs-on: ubuntu-latest
    environment: production
    needs: upload-image

    steps:
      - name: Copy SSH key
        run: |
          install -m 600 -D /dev/null ~/.ssh/id_ed25519
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
        shell: bash
        env:
          SSH_PRIVATE_KEY: ${{secrets.SSH_PRIVATE_KEY}}
          
      - name: Generate SSH known hosts file
        run: |
          ssh-keyscan -H -p $SSH_PORT $SSH_HOST > ~/.ssh/known_hosts
        shell: bash
        env:
          SSH_HOST: ${{secrets.SSH_HOST}}
          SSH_PORT: ${{secrets.SSH_PORT}}
          
      - name: Stop currently running instance
        run: |
          ssh -p $SSH_PORT $SSH_USER@$SSH_HOST $STOP_COMMAND
        shell: bash
        env:
          SSH_PORT: ${{secrets.SSH_PORT}}
          SSH_USER: ${{secrets.SSH_USER}}
          SSH_HOST: ${{secrets.SSH_HOST}}
          STOP_COMMAND: ${{vars.STOP_COMMAND}}

      - name: Update Docker image
        run: |
          ssh -p $SSH_PORT $SSH_USER@$SSH_HOST docker pull ghcr.io/$NAMESPACE/$IMAGE_NAME:latest
        shell: bash
        env:
          SSH_PORT: ${{secrets.SSH_PORT}}
          SSH_USER: ${{secrets.SSH_USER}}
          SSH_HOST: ${{secrets.SSH_HOST}}
          NAMESPACE: ${{vars.NAMESPACE}}
          IMAGE_NAME: ${{vars.IMAGE_NAME}}

      - name: Start new instance
        run: |
          ssh -p $SSH_PORT $SSH_USER@$SSH_HOST $START_COMMAND
        shell: bash
        env:
          SSH_PORT: ${{secrets.SSH_PORT}}
          SSH_USER: ${{secrets.SSH_USER}}
          SSH_HOST: ${{secrets.SSH_HOST}}
          START_COMMAND: ${{vars.START_COMMAND}}