Files
TheGame/.github/workflows/gcp-deploy.yaml
2022-01-27 20:42:50 +05:30

205 lines
8.4 KiB
YAML

name: Deploy Preview to Cloud Run
on:
pull_request:
types:
- opened
- reopened
- synchronize
env:
PROJECT_ID: metagame-thegame
REGISTRY_REGION: us-east4
REGISTRY_REPO: thegame
DEPLOYMENT_DOMAIN: a.run.app
CLOUDRUN_SUFFIX: mjhnbmqqna-uk
DB_NAME: hasura-pr-${{github.event.number}}
BACKEND_SERVICE: backend-pr-${{github.event.number}}
FRONTEND_SERVICE: frontend-pr-${{github.event.number}}
BACKEND_PORT: 4000
HASURA_PORT: 8080
FRONTEND_PORT: 3000
jobs:
build-and-deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: First Intepolation of Variables
run: |
echo "CLOUDRUN_REGION=${{env.REGISTRY_REGION}}" >> $GITHUB_ENV
echo "CLOUDSQL_INSTANCE_NAME=${{env.REGISTRY_REPO}}" >> $GITHUB_ENV
echo "CLOUDSQL_CONNECTION_NAME=${{env.PROJECT_ID}}:${{env.REGISTRY_REGION}}:${{env.REGISTRY_REPO}}" >> $GITHUB_ENV
echo "HASURA_SERVICE=${{env.DB_NAME}}" >> $GITHUB_ENV
echo "DOCKER_REGISTRY=${{env.REGISTRY_REGION}}-docker.pkg.dev" >> $GITHUB_ENV
echo "BACKEND_HOST=${{env.BACKEND_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}" >> $GITHUB_ENV
- name: Those Varaiables May Now Be Interpolated
run: |
echo "HASURA_HOST=${{env.HASURA_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}" >> $GITHUB_ENV
echo "DOCKER_PATH=${{env.DOCKER_REGISTRY}}/${{env.PROJECT_ID}}/${{env.REGISTRY_REPO}}" >> $GITHUB_ENV
echo "SC_MIGRATE_URL=https://${{env.BACKEND_HOST}}/actions/migrateSourceCredAccounts?force=true" >> $GITHUB_ENV
echo "FRONTEND_URL=https://${{env.FRONTEND_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}" >> $GITHUB_ENV
- name: And Again In Another Step
run: |
echo "GRAPHQL_URL=https://${{env.HASURA_HOST}}/v1/graphql" >> $GITHUB_ENV
echo "BACKEND_TAG=${{env.DOCKER_PATH}}/backend:pr-${{github.event.number}}" >> $GITHUB_ENV
echo "HASURA_TAG=${{env.DOCKER_PATH}}/hasura:pr-${{github.event.number}}" >> $GITHUB_ENV
echo "FRONTEND_TAG=${{env.DOCKER_PATH}}/frontend:pr-${{github.event.number}}" >> $GITHUB_ENV
echo "DB_PASSWORD=$(cat /dev/urandom | tr -cd [:alnum:] | head -c 16)" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v2
with:
ref: ${{github.event.pull_request.head.sha}}
- name: Login to Registry
uses: docker/login-action@v1
with:
registry: ${{env.DOCKER_REGISTRY}}
username: _json_key
password: ${{secrets.GCP_SA_KEY}}
- name: Set up gcloud CLI
uses: google-github-actions/setup-gcloud@v0.2.1
with:
project_id: ${{env.PROJECT_ID}}
service_account_key: ${{secrets.GCP_SA_KEY}}
export_default_credentials: true
- name: Delete Database of Hasura
continue-on-error: true
run: |
wget -q https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
chmod u+x cloud_sql_proxy
./cloud_sql_proxy -instances ${{env.CLOUDSQL_CONNECTION_NAME}} -dir /tmp/cloudsql &
PID=$!
sleep 10
PGPASSWORD=${{secrets.GCP_POSTGRES_PASSWORD}} dropdb -h /tmp/cloudsql/${{env.CLOUDSQL_CONNECTION_NAME}} -U postgres ${{env.DB_NAME}} -f
kill $PID
- name: Create User and Database for Hasura
run: |
gcloud -q sql users create ${{env.DB_NAME}} -i ${{env.CLOUDSQL_INSTANCE_NAME}} --password ${{env.DB_PASSWORD}}
gcloud -q sql databases create ${{env.DB_NAME}} -i ${{env.CLOUDSQL_INSTANCE_NAME}}
- name: Undeploy Backend
continue-on-error: true
run: gcloud -q run services delete ${{env.BACKEND_SERVICE}} --region ${{env.CLOUDRUN_REGION}}
- name: Delete Backend Image
continue-on-error: true
run: gcloud -q artifacts docker images delete ${{env.BACKEND_TAG}}
- name: Build Backend Container
uses: mattes/cached-docker-build-action@v1
with:
args: '. -f ./docker/backend/Dockerfile --tag ${{env.BACKEND_TAG}} --build-arg GRAPHQL_URL=${{env.GRAPHQL_URL}}'
cache_key: "${{hashFiles('packages/backend/**')}}"
- name: Push Backend Container
run: docker push ${{env.BACKEND_TAG}}
- name: Deploy Backend
run: |
gcloud -q run deploy ${{env.BACKEND_SERVICE}} \
--image ${{env.BACKEND_TAG}} \
--region ${{env.CLOUDRUN_REGION}} \
--port ${{env.BACKEND_PORT}} \
--cpu 1 \
--memory 512Mi \
--ingress all \
--allow-unauthenticated \
--max-instances 1 \
--set-env-vars HASURA_GRAPHQL_ADMIN_SECRET=metagame_secret \
--set-env-vars GITHUB_API_TOKEN=${{secrets.GH_API_TOKEN}} \
--set-env-vars SOURCECRED_LEDGER_BRANCH=master \
--set-env-vars GRAPHQL_URL=${{env.GRAPHQL_URL}}
- name: Undeploy Hasura
continue-on-error: true
run: gcloud -q run services delete ${{env.HASURA_SERVICE}} --region ${{env.CLOUDRUN_REGION}}
- name: Delete Hasura Image
continue-on-error: true
run: gcloud -q artifacts docker images delete ${{env.HASURA_TAG}}
- name: Build Hasura Container
uses: mattes/cached-docker-build-action@v1
with:
args: './hasura -f ./hasura/Dockerfile --tag ${{env.HASURA_TAG}} --build-arg BACKEND_HOST=${{env.BACKEND_HOST}} --build-arg BACKEND_PROTOCOL=https'
cache_key: "${{hashFiles('hasura/**')}}"
- name: Push Hasura Container
run: docker push ${{env.HASURA_TAG}}
- name: Deploy Hasura
run: |
gcloud -q run deploy ${{env.HASURA_SERVICE}} \
--image ${{env.HASURA_TAG}} \
--region ${{env.CLOUDRUN_REGION}} \
--port ${{env.HASURA_PORT}} \
--cpu 1 \
--memory 512Mi \
--ingress all \
--allow-unauthenticated \
--add-cloudsql-instances ${{env.CLOUDSQL_CONNECTION_NAME}} \
--max-instances 1 \
--set-env-vars HASURA_GRAPHQL_DATABASE_URL=postgres://${{env.DB_NAME}}:${{env.DB_PASSWORD}}@/${{env.DB_NAME}}?host=/cloudsql/${{env.CLOUDSQL_CONNECTION_NAME}} \
--set-env-vars HASURA_GRAPHQL_ADMIN_SECRET=metagame_secret \
--set-env-vars HASURA_GRAPHQL_SERVER_PORT=${{env.HASURA_PORT}} \
--set-env-vars HASURA_GRAPHQL_ENABLE_CONSOLE=true
- name: Undeploy Frontend
continue-on-error: true
run: gcloud -q run services delete ${{env.FRONTEND_SERVICE}} --region ${{env.CLOUDRUN_REGION}}
- name: Delete Frontend Image
continue-on-error: true
run: gcloud -q artifacts docker images delete ${{env.FRONTEND_TAG}}
- name: Build Frontend Container
uses: mattes/cached-docker-build-action@v1
with:
args: '. -f ./docker/frontend/Dockerfile --tag ${{env.FRONTEND_TAG}} --build-arg GRAPHQL_URL=${{env.GRAPHQL_URL}}'
cache_key: "${{hashFiles('packages/web/**', 'packages/design-system/**')}}"
- name: Push Frontend Container
run: docker push ${{env.FRONTEND_TAG}}
- name: Deploy Frontend
run: |
gcloud -q run deploy ${{env.FRONTEND_SERVICE}} \
--image ${{env.FRONTEND_TAG}} \
--region ${{env.CLOUDRUN_REGION}} \
--port ${{env.FRONTEND_PORT}} \
--cpu 1 \
--memory 512Mi \
--ingress all \
--max-instances 1 \
--allow-unauthenticated \
--set-env-vars NEXT_PUBLIC_GRAPHQL_URL=${{env.GRAPHQL_URL}} \
--set-env-vars WEB3_STORAGE_TOKEN=${{secrets.WEB3_STORAGE_TOKEN}} \
--set-env-vars NEXT_PUBLIC_IMGIX_TOKEN=${{secrets.IMGIX_TOKEN}}
- name: Seed Database
run: |
mv package.json package.json.temp
npm install --no-package-lock --no-save node-fetch bottleneck
mv package.json.temp package.json
LOCAL_GRAPHQL_URL="${{env.GRAPHQL_URL}}" \
LOCAL_BACKEND_ACCOUNT_MIGRATION_URL="${{env.SC_MIGRATE_URL}}" \
yarn hasura:seed-local-db
- name: Comment on Pull Request
uses: thollander/actions-comment-pull-request@v1
with:
message: |
Successfully deployed a preview of this pull request:
* [Frontend](${{env.FRONTEND_URL}})
* [Hasura](//${{env.HASURA_HOST}})
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}