|
| 1 | +name: Build |
| 2 | + |
| 3 | +env: |
| 4 | + APP_NAME: CMS-BACKEND-API |
| 5 | + PROJECT_NAME: CMS-BACKEND-API |
| 6 | + DOCKER_COMPOSE_PATH: /root/app/docker-compose.yml |
| 7 | + REGISTRY: ghcr.io |
| 8 | + DOCKER_REGISTRY: ghcr.io/code4govtech/dmp-cms-backend-api |
| 9 | + DOT_ENV_FILE_NAME: env.dmp-cms-backend-api |
| 10 | + |
| 11 | + |
| 12 | +on: |
| 13 | + workflow_dispatch: |
| 14 | + push: |
| 15 | + branches: |
| 16 | + - devops |
| 17 | + - dev |
| 18 | + - main |
| 19 | + |
| 20 | +permissions: |
| 21 | + contents: write |
| 22 | + packages: write |
| 23 | + |
| 24 | + |
| 25 | +jobs: |
| 26 | + set_vars: |
| 27 | + name: Set Environment Variables |
| 28 | + runs-on: ubuntu-latest |
| 29 | + outputs: |
| 30 | + TAG_LATEST: ${{ steps.tag_values.outputs.TAG_LATEST }} |
| 31 | + TAG_ENV_COMMIT: ${{ steps.tag_values.outputs.TAG_ENV_COMMIT }} |
| 32 | + APP_ENV: ${{ steps.tag_values.outputs.APP_ENV }} |
| 33 | + steps: |
| 34 | + - name: Set Docker Image Tags |
| 35 | + id: tag_values |
| 36 | + run: | |
| 37 | + case "${{ github.ref }}" in |
| 38 | + 'refs/heads/main') |
| 39 | + echo "TAG_LATEST=prod-latest" >> $GITHUB_OUTPUT |
| 40 | + echo "TAG_ENV_COMMIT=prod-${GITHUB_SHA:0:5}" >> $GITHUB_OUTPUT |
| 41 | + echo "APP_ENV=PROD" >> $GITHUB_OUTPUT |
| 42 | + ;; |
| 43 | + 'refs/heads/devops') |
| 44 | + echo "TAG_LATEST=dev-latest" >> $GITHUB_OUTPUT |
| 45 | + echo "TAG_ENV_COMMIT=dev-${GITHUB_SHA:0:5}" >> $GITHUB_OUTPUT |
| 46 | + echo "APP_ENV=DEV" >> $GITHUB_OUTPUT |
| 47 | + ;; |
| 48 | + 'refs/heads/dev') |
| 49 | + echo "TAG_LATEST=dev-latest" >> $GITHUB_OUTPUT |
| 50 | + echo "TAG_ENV_COMMIT=dev-${GITHUB_SHA:0:5}" >> $GITHUB_OUTPUT |
| 51 | + echo "APP_ENV=DEV" >> $GITHUB_OUTPUT |
| 52 | + ;; |
| 53 | + esac |
| 54 | +
|
| 55 | + build: |
| 56 | + name: Build |
| 57 | + runs-on: ubuntu-latest |
| 58 | + needs: [set_vars] |
| 59 | + permissions: |
| 60 | + contents: read |
| 61 | + packages: write |
| 62 | + env: |
| 63 | + TAG_LATEST: ${{ needs.set_vars.outputs.TAG_LATEST }} |
| 64 | + TAG_ENV_COMMIT: ${{ needs.set_vars.outputs.TAG_ENV_COMMIT }} |
| 65 | + SUPABASE_URL: ${{ vars[format('APP_{0}_SUPABASE_URL', needs.set_vars.outputs.APP_ENV)] }} |
| 66 | + SUPABASE_KEY: ${{ secrets[format('APP_{0}_SUPABASE_KEY', needs.set_vars.outputs.APP_ENV)] }} |
| 67 | + SECRET_KEY: ${{ secrets[format('APP_{0}_SECRET_KEY', needs.set_vars.outputs.APP_ENV)] }} |
| 68 | + steps: |
| 69 | + - name: Checkout code |
| 70 | + uses: actions/checkout@v2 |
| 71 | + |
| 72 | + # - name: Login to GitHub Packages |
| 73 | + # run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin |
| 74 | + |
| 75 | + - name: Log in to the Container registry |
| 76 | + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 |
| 77 | + with: |
| 78 | + registry: ${{ env.REGISTRY }} |
| 79 | + username: ${{ github.actor }} |
| 80 | + password: ${{ secrets.GITHUB_TOKEN }} |
| 81 | + |
| 82 | + - name: Set Docker Tags |
| 83 | + uses: actions/setup-node@v2 |
| 84 | + |
| 85 | + - name: Read Secrets |
| 86 | + run: | |
| 87 | + echo "SUPABASE_URL=${SUPABASE_URL}" >> .env |
| 88 | + echo "SUPABASE_KEY=${SUPABASE_KEY}" >> .env |
| 89 | + echo "SECRET_KEY=${SECRET_KEY}" >> .env |
| 90 | + mv .env ${{ env.DOT_ENV_FILE_NAME }} |
| 91 | +
|
| 92 | + - name: Copy env file to DEV Server |
| 93 | + |
| 94 | + if: needs.set_vars.outputs.APP_ENV == 'DEV' |
| 95 | + with: |
| 96 | + host: ${{ vars.DEV_SERVER_HOST }} |
| 97 | + username: ${{ vars.DEV_SERVER_USERNAME }} |
| 98 | + key: ${{ secrets.DEV_SSH_PRIVATE_KEY }} |
| 99 | + port: ${{ vars.DEV_SERVER_PORT }} |
| 100 | + source: "${{ env.DOT_ENV_FILE_NAME }}" |
| 101 | + target: /root/app/ |
| 102 | + |
| 103 | + - name: Build ${{ env.APP_NAME }} Docker image |
| 104 | + run: | |
| 105 | + docker build -t ${{ env.DOCKER_REGISTRY }}:${{ env.TAG_LATEST }} . |
| 106 | + |
| 107 | + - name: Add tag to Docker image |
| 108 | + run: | |
| 109 | + echo ${{ github.sha }} |
| 110 | + docker tag ${{ env.DOCKER_REGISTRY }}:${{ env.TAG_LATEST }} ${{ env.DOCKER_REGISTRY }}:${{ env.TAG_ENV_COMMIT }} |
| 111 | + |
| 112 | + - name: Push Docker image to GitHub Packages |
| 113 | + run: | |
| 114 | + docker push ${{ env.DOCKER_REGISTRY }}:${{ env.TAG_LATEST }} |
| 115 | + docker push ${{ env.DOCKER_REGISTRY }}:${{ env.TAG_ENV_COMMIT }} |
| 116 | +
|
| 117 | + deploy: |
| 118 | + name: Deployment |
| 119 | + runs-on: ubuntu-latest |
| 120 | + needs: build |
| 121 | + if: github.event_name == 'push' && github.ref_type == 'branch' |
| 122 | + |
| 123 | + steps: |
| 124 | + - name: Deploy to DevOps/Dev Environment |
| 125 | + if: github.ref == 'refs/heads/devops' || github.ref == 'refs/heads/dev' |
| 126 | + |
| 127 | + env: |
| 128 | + DOCKER_COMPOSE_PATH: ${{ env.DOCKER_COMPOSE_PATH }} |
| 129 | + APP_NAME: ${{ env.APP_NAME }} |
| 130 | + DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }} |
| 131 | + with: |
| 132 | + host: ${{ vars.DEV_SERVER_HOST }} |
| 133 | + username: ${{ vars.DEV_SERVER_USERNAME }} |
| 134 | + key: ${{ secrets.DEV_SSH_PRIVATE_KEY }} |
| 135 | + port: ${{ vars.DEV_SERVER_PORT }} |
| 136 | + allenvs: true |
| 137 | + script_stop: true |
| 138 | + envs: DOCKER_COMPOSE_PATH,APP_NAME,DOCKER_REGISTRY |
| 139 | + script: | |
| 140 | + echo "Docker Compose Path $DOCKER_COMPOSE_PATH" |
| 141 | + docker compose -f $DOCKER_COMPOSE_PATH pull |
| 142 | + docker compose -f $DOCKER_COMPOSE_PATH up -d |
| 143 | +
|
| 144 | + - name: Deploy to Prod environment |
| 145 | + if: github.ref == 'refs/heads/main' |
| 146 | + run: echo "Deploying to Kubernetes" |
0 commit comments