feature: add monorepo tooling to minimize maintenance #472
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: Snackager | |
defaults: | |
run: | |
working-directory: snackager | |
concurrency: | |
group: snackager-${{ github.ref }} | |
cancel-in-progress: true | |
on: | |
workflow_dispatch: | |
inputs: | |
deploy: | |
description: What environment should be deployed | |
type: choice | |
default: no-deploy | |
options: | |
- no-deploy | |
- staging | |
- production | |
pull_request: | |
paths: | |
- .github/actions/setup-google-cloud/** | |
- .github/actions/setup-secrets/** | |
- .github/actions/setup-snackager/** | |
- .github/workflows/snackager.yml | |
- snackager/** | |
- packages/snack-content/** | |
- packages/snack-sdk/** | |
- .eslint* | |
- .prettier* | |
- yarn.lock | |
push: | |
branches: [main] | |
paths: | |
- .github/actions/setup-google-cloud/** | |
- .github/actions/setup-secrets/** | |
- .github/actions/setup-snackager/** | |
- .github/workflows/snackager.yml | |
- snackager/** | |
- packages/snack-content/** | |
- packages/snack-sdk/** | |
- .eslint* | |
- .prettier* | |
- yarn.lock | |
jobs: | |
review: | |
runs-on: ubuntu-latest | |
steps: | |
- name: π Setup repository | |
uses: actions/checkout@v3 | |
- name: π Setup secrets | |
uses: ./.github/actions/setup-secrets | |
with: | |
git-crypt-key: ${{ secrets.GIT_CRYPT_KEY }} | |
- name: π Setup snackager | |
uses: ./.github/actions/setup-snackager | |
- name: π¨ Lint snackager | |
run: yarn lint --max-warnings 0 | |
- name: π§ͺ Unit test snackager | |
run: yarn test --ci --maxWorkers 1 --testPathIgnorePatterns=__integration-tests__ | |
- name: π§ͺ E2E test snackager | |
run: yarn test --ci --maxWorkers 1 --testPathPattern=__integration-tests__ | |
# Takes a long time, best to only run this on PRs | |
if: ${{ github.event_name == 'pull_request' }} | |
build: | |
if: ${{ github.event_name == 'pull_request' }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: π Setup repository | |
uses: actions/checkout@v3 | |
- name: π Setup secrets | |
uses: ./.github/actions/setup-secrets | |
with: | |
git-crypt-key: ${{ secrets.GIT_CRYPT_KEY }} | |
- name: π Setup Google Cloud SDK | |
uses: ./.github/actions/setup-google-cloud | |
with: | |
project-id: exponentjs | |
project-zone: us-central1 | |
project-cluster: general-central | |
service-key: ${{ secrets.GCLOUD_KEY }} | |
- name: π Build snackager | |
run: skaffold build --filename snackager/skaffold.yaml --file-output snackager/build.json | |
working-directory: ./ | |
deploy-staging: | |
if: ${{ (github.event.inputs.deploy == 'staging' && github.event_name != 'pull_request') || (github.event_name == 'push' && github.ref == 'refs/heads/main') }} | |
needs: review | |
runs-on: ubuntu-latest | |
environment: | |
name: snackager-staging | |
url: https://staging.snackager.expo.io/status | |
steps: | |
- name: π Setup repository | |
uses: actions/checkout@v3 | |
- name: π Setup secrets | |
uses: ./.github/actions/setup-secrets | |
with: | |
git-crypt-key: ${{ secrets.GIT_CRYPT_KEY }} | |
- name: π Setup Google Cloud SDK | |
uses: ./.github/actions/setup-google-cloud | |
with: | |
project-id: exponentjs | |
project-zone: us-central1 | |
project-cluster: general-central | |
service-key: ${{ secrets.GCLOUD_KEY }} | |
- name: π Build snackager | |
run: skaffold build --filename snackager/skaffold.yaml --file-output snackager/build.json | |
working-directory: ./ | |
env: | |
SKAFFOLD_PUSH_IMAGE: 'true' | |
- name: π§Ή Dry-run prune docker image | |
run: ./bin/prune-gcr snackager --dry-run | |
working-directory: ./ | |
- name: π Add change cause | |
run: kustomize edit add annotation kubernetes.io/change-cause:"Github Actions deploying $GITHUB_SHA at $(date)" | |
working-directory: snackager/k8s/staging | |
- name: π Deploy snackager | |
run: skaffold deploy --filename snackager/skaffold.yaml --status-check --build-artifacts snackager/build.json | |
working-directory: ./ | |
env: | |
SKAFFOLD_PUSH_IMAGE: 'true' | |
- name: π¬ Notify Slack | |
uses: 8398a7/action-slack@v3 | |
if: always() | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_SNACK }} | |
with: | |
channel: '#snack' | |
status: ${{ job.status }} | |
author_name: Deploy Snackager to Staging | |
fields: message,commit,author,job,took | |
deploy-production: | |
if: ${{ github.event.inputs.deploy == 'production' && github.ref == 'refs/heads/main' }} | |
needs: review | |
runs-on: ubuntu-latest | |
environment: | |
name: snackager-production | |
url: https://snackager.expo.io/status | |
steps: | |
- name: π Setup repository | |
uses: actions/checkout@v3 | |
- name: π Setup secrets | |
uses: ./.github/actions/setup-secrets | |
with: | |
git-crypt-key: ${{ secrets.GIT_CRYPT_KEY }} | |
- name: π Setup Google Cloud SDK | |
uses: ./.github/actions/setup-google-cloud | |
with: | |
project-id: exponentjs | |
project-zone: us-central1 | |
project-cluster: general-central | |
service-key: ${{ secrets.GCLOUD_KEY }} | |
- name: π Build snackager | |
run: skaffold build --filename snackager/skaffold.yaml --file-output snackager/build.json | |
working-directory: ./ | |
env: | |
ENVIRONMENT: production | |
SKAFFOLD_PUSH_IMAGE: 'true' | |
- name: π Add change cause | |
run: kustomize edit add annotation kubernetes.io/change-cause:"Github Actions deploying $GITHUB_SHA at $(date)" | |
working-directory: snackager/k8s/production | |
- name: π Deploy snackager | |
run: skaffold deploy --filename snackager/skaffold.yaml --status-check --build-artifacts snackager/build.json | |
working-directory: ./ | |
env: | |
ENVIRONMENT: production | |
SKAFFOLD_PUSH_IMAGE: 'true' | |
- name: π§Ή Prune docker image | |
if: ${{ success() }} | |
run: ./bin/prune-gcr snackager | |
working-directory: ./ | |
- name: π¬ Notify Slack | |
if: ${{ always() }} | |
uses: 8398a7/action-slack@v3 | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_SNACK }} | |
with: | |
channel: '#snack' | |
status: ${{ job.status }} | |
author_name: Deploy Snackager to Production | |
fields: message,commit,author,job,took | |