Skip to content

use aws package to upload to s3 #2799

use aws package to upload to s3

use aws package to upload to s3 #2799

name: Scoutgame CI
on:
push:
branches: [main]
paths:
- '.cdk/**'
- 'docker-compose.yml'
- '.ebextensions/scoutgame/**'
- '.ebstalk.apps.env/scoutgame.env'
- '.github/actions/**'
- '.github/workflows/deploy_scoutgame.yml'
- 'package.json'
- 'package-lock.json'
- 'apps/scoutgame/**'
- 'packages/scoutgame/**'
- 'packages/github/**'
- 'packages/**'
- '@connect-shared/**'
- 'abis/**'
- 'adapters/**'
- 'config/**'
- 'connectors/**'
- 'lib/**'
- 'hooks/**'
pull_request:
types: [labeled, opened, synchronize]
branches: ['**']
paths:
- '.cdk/**'
- 'docker-compose.yml'
- '.ebextensions/scoutgame/**'
- '.ebstalk.apps.env/scoutgame.env'
- '.github/actions/**'
- '.github/workflows/deploy_scoutgame.yml'
- 'package.json'
- 'package-lock.json'
- 'apps/scoutgame/**'
- 'packages/scoutgame/**'
- 'packages/**'
- 'packages/github/**'
- '@connect-shared/**'
- 'abis/**'
- 'adapters/**'
- 'config/**'
- 'connectors/**'
- 'lib/**'
- 'hooks/**'
concurrency:
group: ci-scoutgame-${{ github.event_name }}-${{ github.ref }}
jobs:
build:
name: Build Scoutgame
runs-on: ubuntu-latest
outputs:
head_commit_message: ${{ steps.setup_variables.outputs.commit_message }}
deploy_staging: ${{ steps.setup_variables.outputs.deploy_staging }}
skip_tests: ${{ steps.setup_variables.outputs.skip_tests }}
steps:
- name: Print Triggering event context payload
env:
workflow_event_context: ${{ toJSON(github.event) }}
run: |
echo "$workflow_event_context"
echo "Workflow and code ref: ${{github.ref}}"
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup variables
id: setup_variables
# source https://github.com/orgs/community/discussions/28474
run: |
echo "commit_message=$(git show -s --format=%s)" >> "$GITHUB_OUTPUT"
echo "deploy_staging=${{(github.event.action == 'labeled' && github.event.label.name == ':rocket: deploy-scoutgame') || (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, ':rocket: deploy-scoutgame'))}}" >> $GITHUB_OUTPUT
echo "skip_tests=${{ contains(env.commit_message, 'skip-tests') }}" >> $GITHUB_OUTPUT
- name: Install dependencies
uses: ./.github/actions/install
with:
app_name: scoutgame
- name: Build app
uses: ./.github/actions/build_app
with:
app_name: scoutgame
test-scoutgame:
name: Test
runs-on: ubuntu-latest
needs: build
if: ${{ github.event.action != 'labeled' && needs.build.outputs.skip_tests != 'true' }}
# Postgres setup copied from https://gist.github.com/2color/537f8ef13ecec80059abb007839a6878
services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--hostname postgres
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Restore dependencies from cache
uses: ./.github/actions/install
with:
app_name: scoutgame
- name: Setup test database
run: npx dotenv -e .env.test.local -- npm run prisma:reset
- name: Restore app from cache
uses: ./.github/actions/build_app
with:
app_name: scoutgame
- name: Typecheck Scoutgame app
run: npm run typecheck -w apps/scoutgame
- name: Run eslint on changed files
uses: tj-actions/eslint-changed-files@v25
with:
skip_annotations: 'true' # do not annotate code in the PR
file_extensions: '**/*.{ts,tsx}'
warn_ignored: 'true'
# Flag necessary to avoid issues when using parentheses in the paths
# https://github.com/tj-actions/eslint-changed-files/issues/1801#issuecomment-2083477324
escape_paths: 'false'
- name: Run app tests
run: npm run scoutgame:test
- name: Run package tests
run: npx dotenv -e .env.test.local -- npm run test -w packages/scoutgame
test-scoutgame-e2e:
name: Test e2e
runs-on: ubuntu-latest
needs: build
# if: ${{ github.event.action != 'labeled' && needs.build.outputs.skip_tests != 'true' }}
# Postgres setup copied from https://gist.github.com/2color/537f8ef13ecec80059abb007839a6878
services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--hostname postgres
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Restore dependencies from cache
uses: ./.github/actions/install
with:
app_name: scoutgame
- name: Setup test database
run: npx dotenv -e .env.test.local -- npm run prisma:reset
- name: Restore app from cache
uses: ./.github/actions/build_app
with:
app_name: scoutgame
# unbuffer insures that we print to the log in realtime
- name: Install unbuffer
run: sudo apt-get update && sudo apt-get install -y expect-dev
- name: Start scoutgame app
run: |
unbuffer npm run scoutgame:start:test:ci 2>&1 | tee server.log &
sleep_loop_ct=0
until curl localhost:3337/api/health || [[ $sleep_loop_ct > 30 ]]; do
echo "webapp not up in loop $sleep_loop_ct ... sleeping"
sleep_loop_ct=$((sleep_loop_ct + 1))
sleep 1
done
- name: Run Scoutgame E2E tests
env:
REACT_APP_APP_ENV: 'test'
# we have to run docker command ourselves to set network=host so that playwright can access the server
run: |
docker run --name mcrmicrosoftcomplaywrightv1343jammy_68c205 \
--workdir /github/workspace --rm \
-e "REACT_APP_APP_ENV" -e CI=true \
-v "/var/run/docker.sock":"/var/run/docker.sock" \
-v "/home/runner/work/_temp/_github_home":"/github/home" \
-v "/home/runner/work/_temp/_github_workflow":"/github/workflow" \
-v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" \
-v "/home/runner/work/app.charmverse.io/app.charmverse.io":"/github/workspace" \
--network "host" \
--ipc=host \
mcr.microsoft.com/playwright:v1.47.1-jammy \
npm run scoutgame:e2e:ci -- -- --timeout=20000 --workers=2 || { echo $'\n👉 Here\'s the server output for debugging:\n' && cat server.log & exit 1; }
# Upload reporst for Github Actions
# Sources:
# https://playwright.dev/docs/ci-intro
# https://playwright.dev/docs/trace-viewer#opening-the-trace
# To view playwright-report: download the zip, unpack and run "npx playwright show-report path/to/folder"
# To view test-results: download the zip, run "npx playwright show-trace path/to/trace.zip"
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: playwright
path: |
apps/scoutgame/playwright-report/
apps/scoutgame/test-results/
retention-days: 5
upload-docker:
name: Upload Docker image
runs-on: ubuntu-latest
# run whether previous jobs were successful or skipped
if: |
github.ref == 'refs/heads/main' || needs.build.outputs.deploy_staging == 'true'
needs: build
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install
with:
app_name: scoutgame
- name: Restore app from cache
uses: ./.github/actions/build_app
with:
app_name: scoutgame
- name: Update Dockerfile
run: |
rm Dockerfile && mv apps/scoutgame/Dockerfile Dockerfile
- name: Build and Push Docker image
id: docker_build_push
uses: ./.github/actions/build_docker_image
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: us-east-1
with:
ecr_registry: scoutgame
upload-static-assets:
name: Upload static assets
runs-on: ubuntu-latest
# run whether previous jobs were successful or skipped
if: |
(github.ref == 'refs/heads/main' && !(failure() || cancelled())) ||
(needs.build.outputs.deploy_staging == 'true')
needs: build
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install
with:
app_name: scoutgame
- name: Calculate Build ID
id: get_build_id
run: |
build_id=${{ hashFiles(format('apps/{0}/*.ts', 'scoutgame'), format('apps/{0}/*.tsx', 'scoutgame')) }}
echo "build_id=$build_id" >> $GITHUB_OUTPUT
- name: Restore app from cache
uses: ./.github/actions/build_app
with:
app_name: scoutgame
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Upload static assets to S3
run: |
aws s3 sync apps/scoutgame/.next/static/ s3://charm.cdn/webapp-assets/_next/static/
- name: Upload JS source maps to Datadog
env:
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
run: |
npm install -g @datadog/datadog-ci
datadog-ci sourcemaps upload apps/scoutgame/.next/static \
--service=scoutgame \
--release-version=${{ steps.get_build_id.outputs.build_id }} \
--project-path=apps/scoutgame/ \
--minified-path-prefix=https://cdn.charmverse.io/_next/static
deploy-production:
name: Deploy to production
# run whether previous jobs were successful or skipped
if: github.ref == 'refs/heads/main' && !(failure() || cancelled())
needs: [test-scoutgame, test-scoutgame-e2e, upload-docker, upload-static-assets]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/deploy_production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
with:
app_name: scoutgame
stack: prd-scoutgame
deploy-staging:
name: Deploy to staging
if: needs.build.outputs.deploy_staging == 'true'
runs-on: ubuntu-latest
# prevent staging deploys + cleanup running in parallel
concurrency: staging-${{ github.ref }}
needs: [build, upload-docker]
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/deploy_staging
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
app_name: scoutgame
discord-alert:
name: Notify Discord of failure
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && failure()
# pass in all steps so we can check if any failed
needs: [test-scoutgame, test-scoutgame-e2e, upload-docker, upload-static-assets, upload-docker, deploy-production]
steps:
- uses: actions/checkout@v4
- name: Notify Discord
uses: ./.github/actions/notify_error
env:
DISCORD_WARNINGS_WEBHOOK: ${{ secrets.DISCORD_WARNINGS_WEBHOOK }}
with:
app_name: scoutgame