mirror of
https://github.com/MetaFam/TheGame.git
synced 2026-04-24 03:00:09 -04:00
Break GitHub Deployment Action Into Jobs (#1103)
This commit is contained in:
50
.github/workflows/PR-CI.yml
vendored
50
.github/workflows/PR-CI.yml
vendored
@@ -49,53 +49,3 @@ jobs:
|
||||
run: yarn test --ci --coverage
|
||||
env:
|
||||
CI: true
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Cancel Previous Runs
|
||||
uses: styfle/cancel-workflow-action@0.4.0
|
||||
with:
|
||||
access_token: ${{ github.token }}
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 16.x
|
||||
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: '**/node_modules'
|
||||
key: nodeModules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
|
||||
|
||||
- name: Install packages
|
||||
run: yarn --frozen-lockfile
|
||||
env:
|
||||
CI: true
|
||||
|
||||
- name: Build Backend
|
||||
run: yarn backend:build
|
||||
env:
|
||||
CI: true
|
||||
|
||||
# Spin up the backend / hasura / DB for the web build to point to
|
||||
- name: Run docker-compose
|
||||
run: docker-compose up --build -d
|
||||
env:
|
||||
DATABASE_USER: metagame
|
||||
DATABASE_PASSWORD: postgres
|
||||
DATABASE_DB: metagame-db
|
||||
HASURA_GRAPHQL_ADMIN_SECRET: so-secretish
|
||||
HASURA_PORT: 8080
|
||||
|
||||
- name: Wait for Hasura
|
||||
run: yarn wait-on --timeout 60000 http-get://localhost:8080/healthz || (docker-compose ps hasura && docker-compose logs --tail 20 hasura)
|
||||
|
||||
- name: Build Web
|
||||
run: yarn web:build
|
||||
env:
|
||||
CI: true
|
||||
NEXT_PUBLIC_GRAPHQL_URL: http://localhost:8080/v1/graphql
|
||||
|
||||
521
.github/workflows/gcp-deploy.yaml
vendored
521
.github/workflows/gcp-deploy.yaml
vendored
@@ -19,186 +19,513 @@ env:
|
||||
BACKEND_PORT: 4000
|
||||
HASURA_PORT: 8080
|
||||
FRONTEND_PORT: 3000
|
||||
HASURA_SECRET: metagame_secret
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
name: Build and Deploy
|
||||
start-deployment:
|
||||
name: Generate Deployment Start Message
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
deployment_id: ${{steps.create-message.outputs.deployment_id}}
|
||||
|
||||
steps:
|
||||
- name: Start Deployment
|
||||
uses: bobheadxi/deployments@v0.6.2
|
||||
id: create-message
|
||||
with:
|
||||
step: start
|
||||
token: ${{github.token}}
|
||||
env: test
|
||||
desc: |
|
||||
"Test instance deployment for PR #${{github.event.number}} \
|
||||
of ${{github.event.pull_request.head.label}} \
|
||||
by ${{github.event.pull_request.user.login}}"
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
|
||||
cancel-previous:
|
||||
name: Cancel Existing Runs
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Cancel Existing Runs
|
||||
uses: styfle/cancel-workflow-action@0.4.0
|
||||
with:
|
||||
access_token: ${{github.token}}
|
||||
|
||||
env:
|
||||
name: Environment Variables
|
||||
runs-on: ubuntu-latest
|
||||
needs: [cancel-previous]
|
||||
|
||||
outputs:
|
||||
PROJECT_ID: ${{env.PROJECT_ID}}
|
||||
REGISTRY_REGION: ${{env.REGISTRY_REGION}}
|
||||
REGISTRY_REPO: ${{env.REGISTRY_REPO}}
|
||||
DEPLOYMENT_DOMAIN: ${{env.DEPLOYMENT_DOMAIN}}
|
||||
CLOUDRUN_SUFFIX: ${{env.CLOUDRUN_SUFFIX}}
|
||||
DB_NAME: ${{env.DB_NAME}}
|
||||
BACKEND_SERVICE: ${{env.BACKEND_SERVICE}}
|
||||
FRONTEND_SERVICE: ${{env.FRONTEND_SERVICE}}
|
||||
BACKEND_PORT: ${{env.BACKEND_PORT}}
|
||||
HASURA_PORT: ${{env.HASURA_PORT}}
|
||||
FRONTEND_PORT: ${{env.FRONTEND_PORT}}
|
||||
HASURA_SECRET: ${{env.HASURA_SECRET}}
|
||||
CLOUDRUN_REGION: ${{steps.first.outputs.CLOUDRUN_REGION}}
|
||||
CLOUDSQL_INSTANCE_NAME: ${{steps.first.outputs.CLOUDSQL_INSTANCE_NAME}}
|
||||
CLOUDSQL_CONNECTION_NAME: ${{steps.first.outputs.CLOUDSQL_CONNECTION_NAME}}
|
||||
HASURA_SERVICE: ${{steps.first.outputs.HASURA_SERVICE}}
|
||||
DOCKER_REGISTRY: ${{steps.first.outputs.DOCKER_REGISTRY}}
|
||||
BACKEND_HOST: ${{steps.first.outputs.BACKEND_HOST}}
|
||||
FRONTEND_URL: ${{steps.first.outputs.FRONTEND_URL}}
|
||||
DB_PASSWORD: ${{steps.first.outputs.DB_PASSWORD}}
|
||||
HASURA_HOST: ${{steps.second.outputs.HASURA_HOST}}
|
||||
DOCKER_PATH: ${{steps.second.outputs.DOCKER_PATH}}
|
||||
SC_MIGRATE_URL: ${{steps.second.outputs.SC_MIGRATE_URL}}
|
||||
DB_HOST: ${{steps.second.outputs.DB_HOST}}
|
||||
GRAPHQL_URL: ${{steps.third.outputs.GRAPHQL_URL}}
|
||||
BACKEND_TAG: ${{steps.third.outputs.BACKEND_TAG}}
|
||||
HASURA_TAG: ${{steps.third.outputs.HASURA_TAG}}
|
||||
FRONTEND_TAG: ${{steps.third.outputs.FRONTEND_TAG}}
|
||||
|
||||
steps:
|
||||
- name: First Intepolation of Variables
|
||||
id: first
|
||||
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
|
||||
echo "::set-output name=CLOUDRUN_REGION::${{env.REGISTRY_REGION}}"
|
||||
echo "::set-output name=CLOUDSQL_INSTANCE_NAME::${{env.REGISTRY_REPO}}"
|
||||
echo "::set-output name=CLOUDSQL_CONNECTION_NAME::\
|
||||
${{env.PROJECT_ID}}:${{env.REGISTRY_REGION}}:${{env.REGISTRY_REPO}}"
|
||||
echo "::set-output name=HASURA_SERVICE::${{env.DB_NAME}}"
|
||||
echo "::set-output name=DOCKER_REGISTRY::${{env.REGISTRY_REGION}}-docker.pkg.dev"
|
||||
echo "::set-output name=BACKEND_HOST::\
|
||||
${{env.BACKEND_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}"
|
||||
echo "::set-output name=FRONTEND_URL::\
|
||||
https://${{env.FRONTEND_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}"
|
||||
echo "::set-output name=DB_PASSWORD::$(head -c 48 /dev/urandom | tr -cd [:alnum:])"
|
||||
|
||||
- name: Those Varaiables May Now Be Interpolated
|
||||
- name: Those Variables May Now Be Interpolated
|
||||
id: second
|
||||
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
|
||||
echo "::set-output name=HASURA_HOST::\
|
||||
${{steps.first.outputs.HASURA_SERVICE}}-${{env.CLOUDRUN_SUFFIX}}.${{env.DEPLOYMENT_DOMAIN}}"
|
||||
echo "::set-output name=DOCKER_PATH::\
|
||||
${{steps.first.outputs.DOCKER_REGISTRY}}/${{env.PROJECT_ID}}/${{env.REGISTRY_REPO}}"
|
||||
echo "::set-output name=SC_MIGRATE_URL::\
|
||||
https://${{steps.first.outputs.BACKEND_HOST}}/actions/migrateSourceCredAccounts?force=true"
|
||||
echo "::set-output name=DB_HOST::\
|
||||
/${{env.DB_NAME}}?host=/cloudsql/${{steps.first.outputs.CLOUDSQL_CONNECTION_NAME}}"
|
||||
|
||||
- name: And Again In Another Step
|
||||
- name: And That Result Again In Another Step
|
||||
id: third
|
||||
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
|
||||
echo "::set-output name=GRAPHQL_URL::\
|
||||
https://${{steps.second.outputs.HASURA_HOST}}/v1/graphql"
|
||||
echo "::set-output name=BACKEND_TAG::\
|
||||
${{steps.second.outputs.DOCKER_PATH}}/backend:pr-${{github.event.number}}"
|
||||
echo "::set-output name=HASURA_TAG::\
|
||||
${{steps.second.outputs.DOCKER_PATH}}/hasura:pr-${{github.event.number}}"
|
||||
echo "::set-output name=FRONTEND_TAG::\
|
||||
${{steps.second.outputs.DOCKER_PATH}}/frontend:pr-${{github.event.number}}"
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
delete-db:
|
||||
name: Delete SQL User & Database
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
- 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
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{env.PROJECT_ID}}
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: Delete Database of Hasura
|
||||
- name: "Delete SQL User: ${{needs.env.outputs.DB_NAME}}"
|
||||
continue-on-error: true
|
||||
run: |
|
||||
gcloud -q sql users delete ${{needs.env.outputs.DB_NAME}} \
|
||||
-i ${{needs.env.outputs.CLOUDSQL_INSTANCE_NAME}}
|
||||
|
||||
- name: "Delete Database: ${{needs.env.outputs.DB_NAME}}"
|
||||
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 &
|
||||
./cloud_sql_proxy -instances ${{needs.env.outputs.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
|
||||
PGPASSWORD=${{secrets.GCP_POSTGRES_PASSWORD}} \
|
||||
dropdb -h /tmp/cloudsql/${{needs.env.outputs.CLOUDSQL_CONNECTION_NAME}} \
|
||||
-U postgres ${{needs.env.outputs.DB_NAME}} -f
|
||||
kill $PID
|
||||
|
||||
- name: Create User and Database for Hasura
|
||||
create-db:
|
||||
name: Create New SQL User & Database
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, delete-db]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Create SQL User: ${{needs.env.outputs.DB_NAME}}"
|
||||
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}}
|
||||
gcloud -q sql users create ${{needs.env.outputs.DB_NAME}} \
|
||||
-i ${{needs.env.outputs.CLOUDSQL_INSTANCE_NAME}} \
|
||||
--password ${{needs.env.outputs.DB_PASSWORD}}
|
||||
|
||||
- name: Undeploy Backend
|
||||
- name: "Create Database: ${{needs.env.outputs.DB_NAME}}"
|
||||
run: |
|
||||
gcloud -q sql databases create ${{needs.env.outputs.DB_NAME}} \
|
||||
-i ${{needs.env.outputs.CLOUDSQL_INSTANCE_NAME}}
|
||||
|
||||
undeploy-backend:
|
||||
name: Undeploy Backend
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Delete Service: ${{needs.env.outputs.BACKEND_SERVICE}}"
|
||||
continue-on-error: true
|
||||
run: gcloud -q run services delete ${{env.BACKEND_SERVICE}} --region ${{env.CLOUDRUN_REGION}}
|
||||
run: |
|
||||
gcloud -q run services delete ${{needs.env.outputs.BACKEND_SERVICE}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}}
|
||||
|
||||
- name: Delete Backend Image
|
||||
delete-backend:
|
||||
name: Delete Backend Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
steps:
|
||||
- name: "Login to Registry: ${{needs.env.outputs.DOCKER_REGISTRY}}"
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{needs.env.outputs.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: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Delete Container Image: ${{needs.env.outputs.BACKEND_TAG}}"
|
||||
continue-on-error: true
|
||||
run: gcloud -q artifacts docker images delete ${{env.BACKEND_TAG}}
|
||||
run: gcloud -q artifacts docker images delete ${{needs.env.outputs.BACKEND_TAG}}
|
||||
|
||||
- name: Build Backend Container
|
||||
build-backend:
|
||||
name: Build Backend Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, delete-backend, undeploy-backend]
|
||||
|
||||
steps:
|
||||
- name: "Checkout: ${{github.event.pull_request.head.label}}"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
|
||||
- name: "Build Container Image: ${{needs.env.outputs.BACKEND_TAG}}"
|
||||
uses: mattes/cached-docker-build-action@v1
|
||||
with:
|
||||
args: '. -f ./docker/backend/Dockerfile --tag ${{env.BACKEND_TAG}} --build-arg GRAPHQL_URL=${{env.GRAPHQL_URL}}'
|
||||
args: |
|
||||
. -f docker/backend/Dockerfile \
|
||||
--tag ${{needs.env.outputs.BACKEND_TAG}} \
|
||||
--build-arg GRAPHQL_URL=${{needs.env.outputs.GRAPHQL_URL}}
|
||||
cache_key: "${{hashFiles('packages/backend/**')}}"
|
||||
|
||||
- name: Push Backend Container
|
||||
run: docker push ${{env.BACKEND_TAG}}
|
||||
- name: "Login to Registry: ${{needs.env.outputs.DOCKER_REGISTRY}}"
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{needs.env.outputs.DOCKER_REGISTRY}}
|
||||
username: _json_key
|
||||
password: ${{secrets.GCP_SA_KEY}}
|
||||
|
||||
- name: Deploy Backend
|
||||
- name: "Push Container Image: ${{needs.env.outputs.BACKEND_TAG}}"
|
||||
run: docker push ${{needs.env.outputs.BACKEND_TAG}}
|
||||
|
||||
deploy-backend:
|
||||
name: Deploy Backend
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, create-db, build-backend]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Deploy Container Image: ${{needs.env.outputs.BACKEND_TAG}}"
|
||||
run: |
|
||||
gcloud -q run deploy ${{env.BACKEND_SERVICE}} \
|
||||
--image ${{env.BACKEND_TAG}} \
|
||||
--region ${{env.CLOUDRUN_REGION}} \
|
||||
--port ${{env.BACKEND_PORT}} \
|
||||
gcloud -q run deploy ${{needs.env.outputs.BACKEND_SERVICE}} \
|
||||
--image ${{needs.env.outputs.BACKEND_TAG}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}} \
|
||||
--port ${{needs.env.outputs.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 HASURA_GRAPHQL_ADMIN_SECRET=${{needs.env.outputs.HASURA_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}}
|
||||
--set-env-vars GRAPHQL_URL=${{needs.env.outputs.GRAPHQL_URL}}
|
||||
|
||||
- name: Undeploy Hasura
|
||||
undeploy-hasura:
|
||||
name: Undeploy Hasura
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Delete Service: ${{needs.env.outputs.HASURA_SERVICE}}"
|
||||
continue-on-error: true
|
||||
run: gcloud -q run services delete ${{env.HASURA_SERVICE}} --region ${{env.CLOUDRUN_REGION}}
|
||||
run: |
|
||||
gcloud -q run services delete ${{needs.env.outputs.HASURA_SERVICE}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}}
|
||||
|
||||
- name: Delete Hasura Image
|
||||
delete-hasura:
|
||||
name: Delete Hasura Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
steps:
|
||||
- name: "Login to Registry: ${{needs.env.outputs.DOCKER_REGISTRY}}"
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{needs.env.outputs.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: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Delete Container Image: ${{needs.env.outputs.HASURA_TAG}}"
|
||||
continue-on-error: true
|
||||
run: gcloud -q artifacts docker images delete ${{env.HASURA_TAG}}
|
||||
run: gcloud -q artifacts docker images delete ${{needs.env.outputs.HASURA_TAG}}
|
||||
|
||||
- name: Build Hasura Container
|
||||
build-hasura:
|
||||
name: Build Hasura Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, delete-hasura, undeploy-hasura]
|
||||
|
||||
steps:
|
||||
- name: "Checkout: ${{github.event.pull_request.head.label}}"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
|
||||
- name: "Build Container Image: ${{needs.env.outputs.HASURA_TAG}}"
|
||||
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'
|
||||
args: |
|
||||
./hasura -f hasura/Dockerfile \
|
||||
--tag ${{needs.env.outputs.HASURA_TAG}} \
|
||||
--build-arg BACKEND_HOST=${{needs.env.outputs.BACKEND_HOST}} \
|
||||
--build-arg BACKEND_PROTOCOL=https
|
||||
cache_key: "${{hashFiles('hasura/**')}}"
|
||||
|
||||
- name: Push Hasura Container
|
||||
run: docker push ${{env.HASURA_TAG}}
|
||||
- name: "Login to Registry: ${{needs.env.outputs.DOCKER_REGISTRY}}"
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{needs.env.outputs.DOCKER_REGISTRY}}
|
||||
username: _json_key
|
||||
password: ${{secrets.GCP_SA_KEY}}
|
||||
|
||||
- name: Deploy Hasura
|
||||
- name: "Push Container Image: ${{needs.env.outputs.HASURA_TAG}}"
|
||||
run: docker push ${{needs.env.outputs.HASURA_TAG}}
|
||||
|
||||
deploy-hasura:
|
||||
name: Deploy Hasura
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, build-hasura, deploy-backend]
|
||||
|
||||
env:
|
||||
db: ${{needs.env.outputs.DB_NAME}}
|
||||
pass: ${{needs.env.outputs.DB_PASSWORD}}
|
||||
host: ${{needs.env.outputs.DB_HOST}}
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Deploy Container Image: ${{needs.env.outputs.HASURA_TAG}}"
|
||||
run: |
|
||||
gcloud -q run deploy ${{env.HASURA_SERVICE}} \
|
||||
--image ${{env.HASURA_TAG}} \
|
||||
--region ${{env.CLOUDRUN_REGION}} \
|
||||
--port ${{env.HASURA_PORT}} \
|
||||
gcloud -q run deploy ${{needs.env.outputs.HASURA_SERVICE}} \
|
||||
--image ${{needs.env.outputs.HASURA_TAG}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}} \
|
||||
--port ${{needs.env.outputs.HASURA_PORT}} \
|
||||
--cpu 1 \
|
||||
--memory 512Mi \
|
||||
--ingress all \
|
||||
--allow-unauthenticated \
|
||||
--add-cloudsql-instances ${{env.CLOUDSQL_CONNECTION_NAME}} \
|
||||
--add-cloudsql-instances ${{needs.env.outputs.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_DATABASE_URL=postgres://${{env.db}}:${{env.pass}}@${{env.host}} \
|
||||
--set-env-vars HASURA_GRAPHQL_ADMIN_SECRET=${{needs.env.outputs.HASURA_SECRET}} \
|
||||
--set-env-vars HASURA_GRAPHQL_SERVER_PORT=${{needs.env.outputs.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}}
|
||||
undeploy-frontend:
|
||||
name: Undeploy Frontend
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
- name: Delete Frontend Image
|
||||
continue-on-error: true
|
||||
run: gcloud -q artifacts docker images delete ${{env.FRONTEND_TAG}}
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: Build Frontend Container
|
||||
- name: "Delete Service: ${{needs.env.outputs.FRONTEND_SERVICE}}"
|
||||
continue-on-error: true
|
||||
run: |
|
||||
gcloud -q run services delete ${{needs.env.outputs.FRONTEND_SERVICE}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}}
|
||||
|
||||
delete-frontend:
|
||||
name: Delete Frontend Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Delete Container Image: ${{needs.env.outputs.FRONTEND_TAG}}"
|
||||
continue-on-error: true
|
||||
run: gcloud -q artifacts docker images delete ${{needs.env.outputs.FRONTEND_TAG}}
|
||||
|
||||
build-frontend:
|
||||
name: Build Frontend Container Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, delete-frontend, undeploy-frontend, deploy-hasura, seed-db]
|
||||
|
||||
steps:
|
||||
- name: "Checkout: ${{github.event.pull_request.head.label}}"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
|
||||
- name: "Build Container Image: ${{needs.env.outputs.FRONTEND_TAG}}"
|
||||
uses: mattes/cached-docker-build-action@v1
|
||||
with:
|
||||
args: '. -f ./docker/frontend/Dockerfile --tag ${{env.FRONTEND_TAG}} --build-arg GRAPHQL_URL=${{env.GRAPHQL_URL}}'
|
||||
args: |
|
||||
. -f docker/frontend/Dockerfile \
|
||||
--tag ${{needs.env.outputs.FRONTEND_TAG}} \
|
||||
--build-arg GRAPHQL_URL=${{needs.env.outputs.GRAPHQL_URL}}
|
||||
cache_key: "${{hashFiles('packages/web/**', 'packages/design-system/**')}}"
|
||||
|
||||
- name: Push Frontend Container
|
||||
run: docker push ${{env.FRONTEND_TAG}}
|
||||
- name: "Login to Registry: ${{needs.env.outputs.DOCKER_REGISTRY}}"
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{needs.env.outputs.DOCKER_REGISTRY}}
|
||||
username: _json_key
|
||||
password: ${{secrets.GCP_SA_KEY}}
|
||||
|
||||
- name: Deploy Frontend
|
||||
- name: "Push Container Image: ${{needs.env.outputs.FRONTEND_TAG}}"
|
||||
run: docker push ${{needs.env.outputs.FRONTEND_TAG}}
|
||||
|
||||
deploy-frontend:
|
||||
name: Deploy Frontend
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, build-frontend]
|
||||
|
||||
steps:
|
||||
- name: Set Up gcloud CLI
|
||||
uses: google-github-actions/setup-gcloud@v0.2.1
|
||||
with:
|
||||
project_id: ${{needs.env.outputs.PROJECT_ID}}
|
||||
service_account_key: ${{secrets.GCP_SA_KEY}}
|
||||
export_default_credentials: true
|
||||
|
||||
- name: "Deploy Container Image: ${{needs.env.outputs.FRONTEND_SERVICE}}"
|
||||
run: |
|
||||
gcloud -q run deploy ${{env.FRONTEND_SERVICE}} \
|
||||
--image ${{env.FRONTEND_TAG}} \
|
||||
--region ${{env.CLOUDRUN_REGION}} \
|
||||
--port ${{env.FRONTEND_PORT}} \
|
||||
gcloud -q run deploy ${{needs.env.outputs.FRONTEND_SERVICE}} \
|
||||
--image ${{needs.env.outputs.FRONTEND_TAG}} \
|
||||
--region ${{needs.env.outputs.CLOUDRUN_REGION}} \
|
||||
--port ${{needs.env.outputs.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 NEXT_PUBLIC_GRAPHQL_URL=${{needs.env.outputs.GRAPHQL_URL}} \
|
||||
--set-env-vars WEB3_STORAGE_TOKEN=${{secrets.WEB3_STORAGE_TOKEN}} \
|
||||
--set-env-vars NEXT_PUBLIC_IMGIX_TOKEN=${{secrets.IMGIX_TOKEN}}
|
||||
|
||||
seed-db:
|
||||
name: Seed Database
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, deploy-hasura]
|
||||
|
||||
steps:
|
||||
- name: "Checkout: ${{github.event.pull_request.head.label}}"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{github.event.pull_request.head.sha}}
|
||||
|
||||
- name: Seed Database
|
||||
continue-on-error: true
|
||||
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
|
||||
SOURCE_GRAPHQL_URL="${{needs.env.outputs.GRAPHQL_URL}}" \
|
||||
ACCOUNT_MIGRATION_URL="${{needs.env.outputs.SC_MIGRATE_URL}}" \
|
||||
yarn hasura:seed-db
|
||||
|
||||
- name: Comment on Pull Request
|
||||
uses: thollander/actions-comment-pull-request@v1
|
||||
finish-deployment:
|
||||
name: Finish Deployment
|
||||
runs-on: ubuntu-latest
|
||||
needs: [env, start-deployment, deploy-frontend]
|
||||
if: always()
|
||||
|
||||
env:
|
||||
result: ${{needs.deploy-frontend.result}}
|
||||
|
||||
steps:
|
||||
- name: Finish Deployment
|
||||
uses: bobheadxi/deployments@v0.6.2
|
||||
with:
|
||||
message: |
|
||||
Successfully deployed a preview of this pull request:
|
||||
|
||||
* [Frontend](${{env.FRONTEND_URL}})
|
||||
* [Hasura](//${{env.HASURA_HOST}})
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
step: finish
|
||||
token: ${{github.token}}
|
||||
env_url: ${{needs.env.outputs.FRONTEND_URL}}
|
||||
status: ${{env.result == 'skipped' && 'cancelled' || env.result}}
|
||||
deployment_id: ${{needs.start-deployment.outputs.deployment_id}}
|
||||
|
||||
@@ -105,7 +105,7 @@ are running you have two options to populate the database:
|
||||
1. Populate the database with the production dataset:
|
||||
|
||||
```shell script
|
||||
yarn hasura:seed-local-db
|
||||
yarn hasura:seed-db
|
||||
```
|
||||
|
||||
2. Populate the database with the initial dataset:
|
||||
|
||||
@@ -82,7 +82,7 @@ backend_1 | @metafam/backend: [0] Listening on port 4000
|
||||
After which you can run:
|
||||
|
||||
```bash
|
||||
yarn hasura:seed-local-db
|
||||
yarn hasura:seed-db
|
||||
```
|
||||
|
||||
Which populates it with testing data.
|
||||
|
||||
@@ -7,11 +7,11 @@ const PRODUCTION_GRAPHQL_URL = (
|
||||
process.env.PRODUCTION_GRAPHQL_URL
|
||||
|| 'https://api.metagame.wtf/v1/graphql'
|
||||
);
|
||||
const LOCAL_GRAPHQL_URL = (
|
||||
process.env.LOCAL_GRAPHQL_URL || 'http://localhost:8080/v1/graphql'
|
||||
const SOURCE_GRAPHQL_URL = (
|
||||
process.env.SOURCE_GRAPHQL_URL || 'http://localhost:8080/v1/graphql'
|
||||
);
|
||||
const LOCAL_BACKEND_ACCOUNT_MIGRATION_URL = (
|
||||
process.env.LOCAL_BACKEND_ACCOUNT_MIGRATION_URL
|
||||
const ACCOUNT_MIGRATION_URL = (
|
||||
process.env.ACCOUNT_MIGRATION_URL
|
||||
|| 'http://localhost:4000/actions/migrateSourceCredAccounts?force=true'
|
||||
);
|
||||
const HASURA_GRAPHQL_ADMIN_SECRET = (
|
||||
@@ -106,7 +106,7 @@ const getPlayerIdsAndSkillsQuery = /* GraphQL */`
|
||||
|
||||
async function fetchPlayerIdsAndSkills(addresses) {
|
||||
const { errors, data } = await fetchGraphQL(
|
||||
LOCAL_GRAPHQL_URL,
|
||||
SOURCE_GRAPHQL_URL,
|
||||
getPlayerIdsAndSkillsQuery,
|
||||
'GetPlayerIds',
|
||||
{ addresses },
|
||||
@@ -134,7 +134,7 @@ const deleteSkillsMutation = /* GraphQL */`
|
||||
|
||||
async function deleteSkills() {
|
||||
const { errors } = await fetchGraphQL(
|
||||
LOCAL_GRAPHQL_URL,
|
||||
SOURCE_GRAPHQL_URL,
|
||||
deleteSkillsMutation,
|
||||
'DeleteSkills',
|
||||
{},
|
||||
@@ -200,7 +200,7 @@ const upsertPlayerMutation = /* GraphQL */`
|
||||
|
||||
async function upsertPlayer(variables) {
|
||||
const { errors, data } = await fetchGraphQL(
|
||||
LOCAL_GRAPHQL_URL,
|
||||
SOURCE_GRAPHQL_URL,
|
||||
upsertPlayerMutation,
|
||||
'UpsertPlayer',
|
||||
variables,
|
||||
@@ -228,7 +228,7 @@ function getSkillId(skills, { Skill: { category, name } }) {
|
||||
}
|
||||
|
||||
async function forceMigrateAccounts() {
|
||||
const result = await fetch(LOCAL_BACKEND_ACCOUNT_MIGRATION_URL, {
|
||||
const result = await fetch(ACCOUNT_MIGRATION_URL, {
|
||||
method: 'POST',
|
||||
});
|
||||
const json = await result.json();
|
||||
@@ -236,13 +236,13 @@ async function forceMigrateAccounts() {
|
||||
}
|
||||
|
||||
async function startSeeding() {
|
||||
console.debug(`Force migrating sourcecred users with: ${LOCAL_BACKEND_ACCOUNT_MIGRATION_URL}`);
|
||||
console.debug(`Force migrating sourcecred users with: ${ACCOUNT_MIGRATION_URL}`);
|
||||
const result = await forceMigrateAccounts();
|
||||
console.debug(result);
|
||||
console.debug(`Fetching players from: ${PRODUCTION_GRAPHQL_URL}`);
|
||||
const players = await fetchTopPlayers();
|
||||
const addresses = players.map(({ ethereum_address }) => ethereum_address);
|
||||
console.debug(`Fetching player ids for players from ${LOCAL_GRAPHQL_URL} for ${addresses.length} addresses`);
|
||||
console.debug(`Fetching player ids for players from ${SOURCE_GRAPHQL_URL} for ${addresses.length} addresses`);
|
||||
const { ids, skills } = await fetchPlayerIdsAndSkills(addresses);
|
||||
console.debug(`Fetched ${Object.keys(ids).length} player ids for players from addresses.`);
|
||||
const mutations = (
|
||||
@@ -271,7 +271,7 @@ async function startSeeding() {
|
||||
.filter(m => !!m)
|
||||
);
|
||||
console.debug(
|
||||
`Updating ${mutations.length} players information in ${LOCAL_GRAPHQL_URL}`,
|
||||
`Updating ${mutations.length} players information in ${SOURCE_GRAPHQL_URL}`,
|
||||
);
|
||||
await deleteSkills();
|
||||
const limiter = new Bottleneck({
|
||||
@@ -284,7 +284,7 @@ async function startSeeding() {
|
||||
return limiter.schedule(() => upsertPlayer(variables))
|
||||
}
|
||||
));
|
||||
console.debug(`Successfully seeded local db with ${updated.length} players`);
|
||||
console.debug(`Successfully seeded db with ${updated.length} players`);
|
||||
}
|
||||
|
||||
startSeeding()
|
||||
@@ -20,7 +20,7 @@
|
||||
"hasura": "hasura --project ./hasura",
|
||||
"hasura:console": "yarn hasura console --no-browser",
|
||||
"hasura:migrate:init": "yarn hasura migrate create \"init\" --from-server",
|
||||
"hasura:seed-local-db": "node hasura/seed-local-db.mjs",
|
||||
"hasura:seed-db": "node hasura/seed-db.mjs",
|
||||
"test": "lerna run test --parallel --",
|
||||
"generate": "lerna run generate --parallel --",
|
||||
"test:full": "yarn lint && yarn typecheck && yarn test",
|
||||
|
||||
Reference in New Issue
Block a user