fix(native-app): Add typecheck to native app into our pipeline #56449
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: Monorepo pipeline - pull request | |
on: | |
pull_request: {} | |
workflow_dispatch: {} | |
defaults: | |
run: | |
shell: bash | |
concurrency: | |
# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-using-a-fallback-value | |
group: pullrequest-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
env: | |
COMPOSE_HTTP_TIMEOUT: 180 | |
GITHUB_ACTIONS_CACHE_URL: https://cache.dev01.devland.is/ | |
SKIP_GENERATED_CACHE: ${{ contains(github.event.pull_request.labels.*.name, 'skip-generated-cache') }} | |
NX_AFFECTED_ALL: ${{ contains(github.event.pull_request.labels.*.name, 'nx-affected-all') }} | |
jobs: | |
prepare: | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 35 | |
env: | |
AFFECTED_ALL: ${{ secrets.AFFECTED_ALL }} | |
CHUNK_SIZE: 7 | |
SERVERSIDE_FEATURES_ON: '' | |
outputs: | |
TEST_CHUNKS: ${{ steps.test_projects.outputs.CHUNKS }} | |
E2E_CHUNKS: ${{ steps.e2e_projects.outputs.CHUNKS }} | |
E2E_BUILD_ID: ${{ steps.e2e_projects.outputs.BUILD_ID }} | |
LINT_CHUNKS: ${{ steps.lint_projects.outputs.CHUNKS }} | |
UNAFFECTED: ${{ steps.unaffected.outputs.UNAFFECTED }} | |
BUILD_CHUNKS: ${{ steps.build_projects.outputs.CHUNKS }} | |
BUILD_MAP: ${{ steps.build_map.outputs.BUILD_MAP }} | |
node-modules-key: ${{ steps.prepare-cache.outputs.node-modules-key }} | |
mobile-node-modules-key: ${{ steps.prepare-cache.outputs.mobile-node-modules-key }} | |
generated-files-key: ${{ steps.prepare-cache.outputs.generated-files-key }} | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18.8.0' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Check node version | |
run: | | |
node -v | |
ls -l `which node` | |
- name: Checking out relevant branches | |
run: | | |
git checkout $GITHUB_HEAD_REF | |
git checkout $GITHUB_BASE_REF | |
git checkout $GITHUB_SHA | |
git config --global user.email "[email protected]" | |
git config --global user.name "CI Bot" | |
BASE_SHA=$(git merge-base HEAD $GITHUB_BASE_REF) | |
HEAD_SHA=$(git merge-base HEAD $GITHUB_HEAD_REF) | |
echo Current base SHA is $BASE_SHA and head SHA is $HEAD_SHA | |
echo "{\"base_sha\": \"$BASE_SHA\", \"head_sha\":\"$HEAD_SHA\"}" > event.json | |
- name: Keep PR run event | |
uses: actions/upload-artifact@v2 | |
with: | |
name: pr-event | |
path: event.json | |
retention-days: 60 | |
- name: Prepare cache | |
id: prepare-cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
calculateCacheKeys: true | |
- name: Building NodeJS dependencies | |
if: steps.prepare-cache.outputs.node-modules-cache-hit != 'true' || steps.prepare-cache.outputs.mobile-node-modules-cache-hit != 'true' | |
run: ./scripts/ci/10_prepare-host-deps.sh | |
- name: Preparing HEAD and BASE tags | |
run: | | |
echo "HEAD=$GITHUB_SHA" >> $GITHUB_ENV | |
export HEAD_REF="$GITHUB_HEAD_REF" | |
export BASE_REF="$GITHUB_BASE_REF" | |
export PR_REF=$GITHUB_SHA | |
export SHELL=/usr/bin/bash | |
export WORKFLOW_ID=pullrequest | |
source ./scripts/ci/00_prepare-base-tags.sh $(git merge-base HEAD $GITHUB_BASE_REF) | |
git checkout $GITHUB_SHA | |
echo "BASE=$BASE" >> $GITHUB_ENV | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
HTML_URL: ${{ github.event.pull_request.html_url }} | |
ISSUE_REPORTING_SLACK_WEBHOOK_URL: ${{ secrets.SLACK_BUILD_ISSUES_REPORTING_WEBHOOK_URL }} | |
- name: Cache for cypress | |
id: cypress | |
continue-on-error: true | |
uses: ./.github/actions/cache | |
with: | |
path: /github/home/.cache/Cypress | |
key: cypress-cache-${{ steps.prepare-cache.outputs.node-modules-key }} | |
- name: Check cypress cache success | |
run: '[[ "${{ steps.cypress.outputs.success }}" != "false" ]] || exit 1' | |
- name: Verify cypress | |
id: cypress-check | |
run: npx cypress verify | |
continue-on-error: true | |
- name: Install cypress | |
if: steps.cypress-check.outcome != 'success' | |
run: npx cypress install | |
- name: Run codegen | |
if: steps.prepare-cache.outputs.generated-files-cache-hit != 'true' | |
run: | | |
node --version | |
tar zcvf generated_files.tar.gz $(./scripts/ci/get-files-touched-by.sh yarn codegen --skip-cache | xargs realpath --relative-to $(pwd)) | |
# - name: Security audit Node modules | |
# run: ./scripts/ci/20_security-audit.sh | |
- name: License audit Node modules | |
run: ./scripts/ci/20_license-audit.sh | |
- name: Check user permissions | |
uses: actions-cool/check-user-permission@v2 | |
id: check-permission | |
- name: Set magic env if test-everything label is set | |
if: ${{ contains(github.event.pull_request.labels.*.name, 'test everything') && steps.check-permission.outputs['user-permission'] == 'admin' }} | |
run: | | |
echo "AFFECTED_ALL=7913-$GITHUB_HEAD_REF" >> $GITHUB_ENV | |
- name: Warn if user does not have the required permissions | |
if: ${{ contains(github.event.pull_request.labels.*.name, 'test everything') && steps.check-permission.outputs['user-permission'] != 'admin' }} | |
run: | | |
echo "## WARN permissions" >> "$GITHUB_STEP_SUMMARY" | |
echo "User $GITHUB_ACTOR does not have the required permissions to apply the 'test everything' label" >> "$GITHUB_STEP_SUMMARY" | |
- name: Prepare lint targets | |
id: lint_projects | |
run: | | |
CHUNKS=$(./scripts/ci/generate-chunks.sh lint) | |
if [[ $CHUNKS != "[]" ]]; then | |
echo "CHUNKS={\"projects\":$CHUNKS}" >> $GITHUB_OUTPUT | |
fi | |
- name: Prepare test targets | |
id: test_projects | |
run: | | |
CHUNKS=$(./scripts/ci/generate-chunks.sh test) | |
if [[ $CHUNKS != "[]" ]]; then | |
echo "CHUNKS={\"projects\":$CHUNKS}" >> $GITHUB_OUTPUT | |
fi | |
- name: Prepare e2e targets | |
id: e2e_projects | |
env: | |
CHUNK_SIZE: 1 | |
run: | | |
CHUNKS=$(./scripts/ci/generate-chunks.sh e2e-ci) | |
if [[ $CHUNKS != "[]" ]]; then | |
echo "CHUNKS={\"projects\":$CHUNKS}" >> $GITHUB_OUTPUT | |
fi | |
echo "BUILD_ID=$GITHUB_RUN_ID-$GITHUB_RUN_NUMBER-$(uuidgen)" >> $GITHUB_OUTPUT | |
- name: Prepare build targets | |
id: build_projects | |
env: | |
CHUNK_SIZE: 4 | |
run: | | |
CHUNKS=$(./scripts/ci/generate-chunks.sh build) | |
if [[ $CHUNKS != "[]" ]]; then | |
echo "CHUNKS={\"projects\":$CHUNKS}" >> $GITHUB_OUTPUT | |
fi | |
- name: Check release-manager approval | |
id: check-release-manager-approval | |
if: ${{ contains(github.event.pull_request.labels.*.name, 'automerge') && contains(github.event.pull_request.head.ref, '/pre-release/') }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
node -r esbuild-register .github/actions/check-team-approval.ts release-managers | |
tests: | |
needs: | |
- prepare | |
if: needs.prepare.outputs.TEST_CHUNKS | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 35 | |
env: | |
AFFECTED_PROJECTS: ${{ matrix.projects }} | |
MAX_JOBS: 3 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare.outputs.TEST_CHUNKS) }} | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- uses: ./.github/actions/unit-test | |
with: | |
dd-api-key: '${{ secrets.DD_API_KEY }}' | |
codecov-token: ${{ secrets.CODECOV_TOKEN }} | |
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
docker-registry: 821090935708.dkr.ecr.eu-west-1.amazonaws.com/ | |
e2e: | |
needs: | |
- prepare | |
if: needs.prepare.outputs.E2E_CHUNKS | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 35 | |
env: | |
AFFECTED_PROJECT: ${{ matrix.projects }} | |
CYPRESS_PROJECT_ID: 4q7jz8 | |
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | |
API_MOCKS: 'true' | |
NODE_OPTIONS: --max-old-space-size=4096 | |
E2E_BUILD_ID: '${{ needs.prepare.outputs.E2E_BUILD_ID }}-${{ github.run_attempt }}' | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare.outputs.E2E_CHUNKS) }} | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- name: Cache for cypress | |
id: cypress | |
continue-on-error: true | |
uses: ./.github/actions/cache | |
with: | |
path: /github/home/.cache/Cypress | |
key: cypress-cache-${{ needs.prepare.outputs.node-modules-hash }} | |
- name: Check cypress cache success | |
run: '[[ "${{ steps.cypress.outputs.success }}" != "false" ]] || exit 1' | |
- name: Running e2e tests | |
run: ./scripts/ci/40_e2e.sh ${AFFECTED_PROJECT} | |
linting-workspace: | |
needs: | |
- prepare | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 5 | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Check node-modules cache success | |
run: '[[ "${{ steps.node-modules.outputs.success }}" != "false" ]] || exit 1' | |
- name: Linting workspace | |
run: ./scripts/ci/20_lint-workspace.sh | |
run-shellcheck: | |
needs: | |
- prepare | |
runs-on: ubuntu-latest | |
timeout-minutes: 5 | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Run ShellCheck | |
uses: ludeeus/[email protected] | |
with: | |
ignore_paths: >- | |
node_modules | |
apps/native/app/android | |
severity: warning | |
formatting: | |
needs: | |
- prepare | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 5 | |
steps: | |
- uses: actions/checkout@v3 | |
if: ${{ github.event_name == 'pull_request' }} | |
with: | |
token: ${{ secrets.DIRTY_FIX_BOT_TOKEN }} | |
ref: ${{ github.event.pull_request.head.ref }} | |
- uses: actions/checkout@v3 | |
if: ${{ github.ref == 'ref/heads/main' }} | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- name: NX format:check | |
if: ${{ github.ref == 'ref/heads/main' }} | |
run: ./scripts/ci/20_check-formatting.sh "check" | |
- name: NX format:write | |
if: ${{ github.event_name == 'pull_request' }} | |
run: | | |
./scripts/ci/20_check-formatting.sh "write" | |
./infra/scripts/ci/git-check-dirty.sh "/" "nx format:write" "dirtybot" | |
linting: | |
needs: | |
- prepare | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 35 | |
if: needs.prepare.outputs.LINT_CHUNKS | |
env: | |
AFFECTED_PROJECTS: ${{ matrix.projects }} | |
NODE_OPTIONS: --max-old-space-size=4096 | |
MAX_JOBS: 3 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare.outputs.LINT_CHUNKS) }} | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- name: Linting | |
run: ./scripts/ci/run-in-parallel-native.sh lint | |
build: | |
needs: | |
- prepare | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
timeout-minutes: 35 | |
env: | |
AFFECTED_PROJECTS: ${{ matrix.projects }} | |
MAX_JOBS: 2 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare.outputs.BUILD_CHUNKS) }} | |
if: needs.prepare.outputs.BUILD_CHUNKS | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup yarn | |
run: npm install -g yarn | |
- name: Prepare node-modules and generated-files cache | |
uses: ./.github/actions/prepare-cache | |
with: | |
nodeModulesHash: ${{ needs.prepare.outputs.node-modules-key }} | |
mobileNodeModulesHash: ${{ needs.prepare.outputs.mobile-node-modules-key }} | |
generatedFilesCacheKey: ${{ needs.prepare.outputs.generated-files-key }} | |
- name: Building | |
run: ./scripts/ci/run-in-parallel-native.sh build | |
success: | |
runs-on: ec2-runners | |
container: | |
image: public.ecr.aws/m3u4c4h9/island-is/actions-runner-public:latest | |
if: always() | |
needs: | |
- prepare | |
- linting-workspace | |
- tests | |
- linting | |
- run-shellcheck | |
- formatting | |
- e2e | |
- build | |
steps: | |
- name: Check prepare success | |
run: '[[ ${{ needs.prepare.result }} == "success" ]] || exit 1' | |
- name: Check tests success | |
run: '[[ ${{ needs.tests.result }} != "failure" ]] || exit 1' | |
- name: Check e2e success | |
run: '[[ ${{ needs.e2e.result }} != "failure" ]] || exit 1' | |
- name: Check linting success | |
run: '[[ ${{ needs.linting.result }} != "failure" ]] || exit 1' | |
- name: Check run-shellcheck success | |
run: '[[ ${{ needs.run-shellcheck.result }} != "failure" ]] || exit 1' | |
- name: Check formatting success | |
run: '[[ ${{ needs.formatting.result }} != "failure" ]] || exit 1' | |
- name: Check build success | |
run: '[[ ${{ needs.build.result }} != "failure" ]] || exit 1' | |
- name: Announce success | |
run: echo "Build is successful" |