Add db support to GitHub workflow #54
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build and deploy with Database | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
workflow_dispatch: | |
inputs: | |
environment: | |
description: 'Environment to deploy to' | |
type: environment | |
required: true | |
env: | |
OUTPUT_PATH_ENGINE_NODE: './build/engine/' | |
OUTPUT_PATH_MS_SERVER: './src/management-system-v2/.next/' | |
DOCKER_PATH_MS_SERVER: './src/management-system-v2' | |
jobs: | |
# install: | |
# runs-on: ubuntu-latest | |
# steps: | |
# - uses: actions/checkout@v4 | |
# - name: Set up Node.js | |
# uses: actions/setup-node@v4 | |
# with: | |
# node-version: 20 | |
# check-latest: true | |
# cache: 'yarn' | |
# - run: yarn install --frozen-lockfile --ignore-engines | |
# - uses: actions/cache@v4 | |
# timeout-minutes: 2 | |
# id: cache-install | |
# with: | |
# path: ./* | |
# key: ${{ github.sha }}-${{ github.run_number }} | |
# lint: | |
# runs-on: ubuntu-latest | |
# needs: install | |
# steps: | |
# - uses: actions/cache@v4 | |
# timeout-minutes: 2 | |
# id: restore-install | |
# with: | |
# path: ./* | |
# key: ${{ github.sha }}-${{ github.run_number }} | |
# - name: Set up Node.js | |
# uses: actions/setup-node@v4 | |
# with: | |
# node-version: 20 | |
# check-latest: true | |
# cache: 'yarn' | |
# - run: yarn prettier --check . | |
# buildMS: | |
# runs-on: ubuntu-latest | |
# env: | |
# IMAGE_TAG: ${{ inputs.environment == 'Production' && 'latest' || 'edge' }} | |
# outputs: | |
# tag: ${{ steps.set_tag.outputs.tag }} | |
# needs: lint | |
# steps: | |
# - uses: actions/cache@v4 | |
# timeout-minutes: 2 | |
# id: restore-install | |
# with: | |
# path: ./* | |
# key: ${{ github.sha }}-${{ github.run_number }} | |
# - name: Set up Node.js | |
# uses: actions/setup-node@v4 | |
# with: | |
# node-version: 20 | |
# check-latest: true | |
# cache: 'yarn' | |
# - run: yarn build-ms | |
# - id: set_tag | |
# run: | | |
# TAG=$(git describe --tags --always --dirty --abbrev=7) | |
# if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then | |
# echo "tag=${{ env.IMAGE_TAG }}" >> $GITHUB_OUTPUT | |
# else | |
# echo "tag=$TAG" >> $GITHUB_OUTPUT | |
# fi | |
# - name: Kaniko build | |
# uses: aevea/action-kaniko@master | |
# with: | |
# image: proceed/ms-server | |
# username: ${{ secrets.DOCKERHUB_USERNAME }} | |
# password: ${{ secrets.DOCKERHUB_PASSWORD }} | |
# path: ${{ env.DOCKER_PATH_MS_SERVER }} | |
# tag: ${{ steps.set_tag.outputs.tag }} | |
check-migration-files: | |
runs-on: ubuntu-latest | |
#needs: buildMS | |
outputs: | |
main_diff: ${{ steps.compare-migration-main.outputs.diff }} | |
branch_diff: ${{ steps.check-migration-changes.outputs.diff }} | |
steps: | |
- name: Checkout the Repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 2 | |
- name: Check migration changes with main | |
id: check-migration-changes-main | |
run: | | |
git fetch origin main:main | |
# Get migration files from main and current branch | |
MAIN_MIGRATIONS=$(git ls-tree -r main --name-only src/management-system-v2/prisma/migrations/ | grep '\.sql$' || echo "") | |
CURRENT_MIGRATIONS=$(git ls-tree -r HEAD --name-only src/management-system-v2/prisma/migrations/ | grep '\.sql$' || echo "") | |
if [ "$MAIN_MIGRATIONS" != "$CURRENT_MIGRATIONS" ]; then | |
echo "diff detected between main and branch" | |
echo "diff=true" >> $GITHUB_OUTPUT | |
else | |
echo "NO diff detected between main and branch" | |
echo "diff=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Check migration changes within branch | |
id: check-migration-changes-branch | |
run: | | |
if git diff --name-only HEAD~1 HEAD | grep 'src/management-system-v2/prisma/migrations/.*\.sql'; then | |
echo "diff detected within branch" | |
echo "diff=true" >> $GITHUB_OUTPUT | |
else | |
echo "NO diff detected within branch" | |
echo "diff=false" >> $GITHUB_OUTPUT | |
fi | |
generate-db-name: | |
runs-on: ubuntu-latest | |
needs: [check-migration-files] | |
outputs: | |
dbname: ${{ steps.gen-db-name.outputs.DB_NAME }} | |
environment: Research | |
env: | |
ENV: Research | |
steps: | |
- name: Generate database name | |
id: gen-db-name | |
run: | | |
BRANCH_NAME="${{ github.ref_name }}" | |
BRANCH_NAME_SANITIZED=$(echo "$BRANCH_NAME" | sed 's|/|_|g') | |
if [ "${{ needs.check-migration-files.outputs.main_diff }}" = "false" ]; then | |
# No changes between main and branch - use main suffix | |
DB_NAME="proceed_db_${BRANCH_NAME_SANITIZED}_main" | |
else | |
# Changes exist - use branch name | |
DB_NAME="proceed_db_${BRANCH_NAME_SANITIZED}" | |
fi | |
echo "DB_NAME=$DB_NAME" >> $GITHUB_OUTPUT | |
- name: Configure SSH | |
run: | | |
mkdir -p ~/.ssh/ | |
echo "$SSH_KEY" > ~/.ssh/$ENV.key | |
chmod 600 ~/.ssh/$ENV.key | |
cat >>~/.ssh/config <<END | |
Host $ENV | |
HostName $SSH_HOST | |
User $SSH_USER | |
IdentityFile ~/.ssh/$ENV.key | |
StrictHostKeyChecking no | |
END | |
env: | |
SSH_USER: ${{ secrets.SSH_USER }} | |
SSH_KEY: ${{ secrets.SSH_KEY }} | |
SSH_HOST: ${{ secrets.SSH_HOST }} | |
- name: Check and handle database | |
run: | | |
DB_EXISTS=$(ssh $ENV "sudo docker exec ${{vars.DB_CONTAINER_NAME}} psql -U ${{secrets.DB_USER}} -d ${{vars.DB_DEFAULT_DB}} -tAc \"SELECT 1 FROM pg_database WHERE datname='${{ steps.gen-db-name.outputs.DB_NAME }}'\"") | |
if [ "${{ needs.check-migration-files.outputs.main_diff }}" = "true" ] && [ "${{ needs.check-migration-files.outputs.branch_diff }}" = "true" ]; then | |
# Changes detected - drop existing DB if it exists | |
ssh $ENV 'sudo docker exec ${{vars.DB_CONTAINER_NAME}} psql -U ${{secrets.DB_USER}} -d ${{vars.DB_DEFAULT_DB}} -c "DROP DATABASE IF EXISTS ${{ steps.gen-db-name.outputs.DB_NAME }};"' | |
elif [ "$DB_EXISTS" != "1" ]; then | |
# DB doesn't exist - no action needed (will be created in create-db job) | |
echo "Database doesn't exist, will be created in next step" | |
else | |
# DB exists and no changes detected - keep existing DB | |
echo "Reusing existing database" | |
fi | |
create-db: | |
needs: [generate-db-name, check-migration-files] | |
runs-on: ubuntu-latest | |
outputs: | |
database_url: ${{ steps.set-db-url.outputs.DATABASE_URL }} | |
environment: Research | |
env: | |
ENV: Research | |
steps: | |
- name: Configure SSH | |
run: | | |
mkdir -p ~/.ssh/ | |
echo "$SSH_KEY" > ~/.ssh/$ENV.key | |
chmod 600 ~/.ssh/$ENV.key | |
cat >>~/.ssh/config <<END | |
Host $ENV | |
HostName $SSH_HOST | |
User $SSH_USER | |
IdentityFile ~/.ssh/$ENV.key | |
StrictHostKeyChecking no | |
END | |
env: | |
SSH_USER: ${{ secrets.SSH_USER }} | |
SSH_KEY: ${{ secrets.SSH_KEY }} | |
SSH_HOST: ${{ secrets.SSH_HOST }} | |
- name: Check if database needs to be created | |
id: check-db | |
run: | | |
DB_EXISTS=$(ssh $ENV "sudo docker exec ${{vars.DB_CONTAINER_NAME}} psql -U ${{secrets.DB_USER}} -d ${{vars.DB_DEFAULT_DB}} -tAc \"SELECT 1 FROM pg_database WHERE datname='${{ needs.generate-db-name.outputs.dbname }}'\"") | |
if [ "$DB_EXISTS" != "1" ]; then | |
echo "create_db=true" >> $GITHUB_OUTPUT | |
else | |
echo "create_db=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Create database if needed | |
if: steps.check-db.outputs.create_db == 'true' | |
run: | | |
ssh $ENV 'sudo docker exec ${{vars.DB_CONTAINER_NAME}} psql -U ${{secrets.DB_USER}} -d ${{vars.DB_DEFAULT_DB}} -c "CREATE DATABASE ${{ needs.generate-db-name.outputs.dbname }};"' | |
- name: Set DATABASE_URL as an output | |
id: set-db-url | |
run: echo "DATABASE_URL=postgresql://${{secrets.DB_USER}}:UiIpWxw8Usegfsl7LP8%2FuWrKiCyJbU2nLE9wBvW7gSE%3D@${{secrets.SSH_HOST}}:5433/${{ needs.generate-db-name.outputs.dbname }}?schema=public" >> $GITHUB_OUTPUT | |
- name: Restore Cache | |
uses: actions/cache@v4 | |
timeout-minutes: 2 | |
id: restore-install | |
with: | |
path: ./* | |
key: ${{ github.sha }}-${{ github.run_number }} | |
- name: Apply Prisma Migrations | |
if: steps.check-db.outputs.create_db == 'true' | |
env: | |
DATABASE_URL: ${{ steps.set-db-url.outputs.DATABASE_URL }} | |
run: | | |
yarn dev-ms-db-deploy | |
# deploy: | |
# runs-on: ubuntu-latest | |
# needs: [buildMS, create-db, generate-db-name] | |
# permissions: | |
# contents: read | |
# id-token: write | |
# pull-requests: write | |
# issues: write | |
# environment: Research | |
# env: | |
# MS_TAG: ${{ needs.buildMS.outputs.tag }} | |
# SERVICE_NAME: ${{ inputs.environment == 'Production' && 'ms-server-production' || 'ms-server-staging' }} | |
# SUBDOMAIN: ${{ inputs.environment == 'Production' && 'app' || 'staging' }} | |
# DATABASE_URL: postgresql://${{ secrets.DB_USER }}:UiIpWxw8Usegfsl7LP8%2FuWrKiCyJbU2nLE9wBvW7gSE%3D@${{ secrets.SSH_HOST }}:5433/${{ needs.generate-db-name.outputs.dbname }}?schema=public | |
# steps: | |
# - uses: 'google-github-actions/auth@v2' | |
# with: | |
# project_id: 'proceed-bpms' | |
# workload_identity_provider: 'projects/1062024918148/locations/global/workloadIdentityPools/github-ci/providers/github' | |
# service_account: '[email protected]' | |
# - id: 'deploy' | |
# if: ${{ github.ref == 'refs/heads/main' }} | |
# uses: 'google-github-actions/deploy-cloudrun@v2' | |
# with: | |
# service: ${{ env.SERVICE_NAME }} | |
# image: 'docker.io/proceed/ms-server:${{ env.MS_TAG }}' | |
# env_vars: | | |
# NEXTAUTH_URL=https://${{ env.SUBDOMAIN }}.proceed-labs.org | |
# DATABASE_URL=${{ env.DATABASE_URL }} | |
# region: 'europe-west1' | |
# revision_traffic: LATEST=100 | |
# - id: 'deploy-preview' | |
# if: ${{ github.event_name == 'pull_request' }} | |
# name: Preview Cloud Run Deployment | |
# uses: anishsapkota/preview-cloudrun@main | |
# with: | |
# service: ${{ env.SERVICE_NAME }} | |
# image: docker.io/proceed/ms-server:${{ env.MS_TAG }} | |
# token: ${{ secrets.GITHUB_TOKEN }} | |
# region: 'europe-west1' | |
# env_vars: '{"DATABASE_URL": "${{env.DATABASE_URL}}", "PROCEED_PUBLIC_DEPLOYMENT_ENV":"local", "PROCEED_PUBLIC_ENABLE_EXECUTION": "true"}' | |
# githubEnvironment: | |
# runs-on: ubuntu-latest | |
# needs: deploy | |
# if: ${{ github.ref == 'refs/heads/main' }} | |
# environment: | |
# name: ${{ inputs.environment || 'Staging' }} | |
# url: ${{ inputs.environment == 'Production' && 'https://app.proceed-labs.org' || 'https://staging.proceed-labs.org' }} | |
# steps: | |
# - run: echo "${{ inputs.environment || 'Staging' }}" |