Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save nurmdrafi/c9dca6bd667698e5ed306af41dc34da4 to your computer and use it in GitHub Desktop.
Save nurmdrafi/c9dca6bd667698e5ed306af41dc34da4 to your computer and use it in GitHub Desktop.
Update docker image tags with dynamic version
name: Docker Image CI/CD for Staging

on:
  push:
    branches: ["staging"]

env: 
  DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
  DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
  DOCKER_ORG: ${{ secrets.DOCKER_ORG }}
  SSH_HOST_STAGING: ${{ secrets.SSH_HOST_STAGING }}
  SSH_USER_STAGING: ${{ secrets.SSH_USER_STAGING }}
  SSH_KEY_STAGING: ${{ secrets.SSH_KEY_STAGING }}
  DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Branch name
        run: echo running on branch ${GITHUB_REF##*/}

      - name: Store variables
        id: get-store
        run: |
          echo version=$(jq -r '.version' package.json) >> $GITHUB_OUTPUT
          echo branch=${GITHUB_REF##*/} >> $GITHUB_OUTPUT

      - name: DockerHub Login
        uses: docker/login-action@v3
        with:
          username: ${{ env.DOCKER_USERNAME }}
          password: ${{ env.DOCKER_PASSWORD }}

      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag ${{ env.DOCKER_ORG }}/jti-dashboard:${GITHUB_REF##*/}-${{ steps.get-store.outputs.version }}

      - name: Docker Push
        run: docker push ${{ env.DOCKER_ORG }}/jti-dashboard:${GITHUB_REF##*/}-${{ steps.get-store.outputs.version }}

      - name: Run deployment command
        uses: appleboy/[email protected]
        with:
          host: ${{ env.SSH_HOST_STAGING }}
          username: ${{ env.SSH_USER_STAGING }}
          key: ${{ env.SSH_KEY_STAGING }}
          script: |
            cd /var/www/html/jti-dashboard-docker
            docker compose down
            docker image prune -af

            # Update docker compose file
            sudo sed -i "s|image: .*|image: ${{ env.DOCKER_ORG }}/jti-dashboard:${{ steps.get-store.outputs.branch }}-${{ steps.get-store.outputs.version }}|g" docker-compose.yaml
            
            docker compose pull
            docker compose up -d

      - name: Workflow Success
        uses: rjstone/discord-webhook-notify@v1
        if: success()
        with:
          username: JTI Dashboard Staging
          severity: info
          details: "The deployment was successful without any issues."
          webhookUrl: ${{ env.DISCORD_WEBHOOK }}

      - name: Workflow Failure
        uses: rjstone/discord-webhook-notify@v1
        if: failure()
        with:
          username: JTI Dashboard Staging
          severity: error
          details: Workflow Failed!
          webhookUrl: ${{ env.DISCORD_WEBHOOK }}

      - name: Workflow Cancelled
        uses: rjstone/discord-webhook-notify@v1
        if: cancelled()
        with:
          username: JTI Dashboard Staging
          severity: warn
          details: Workflow Cancelled!
          webhookUrl: ${{ env.DISCORD_WEBHOOK }}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment