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}}