From f5e473719b33a6c72844ea08a5de99900ecc2cdd Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Thu, 21 Mar 2024 16:20:44 -0700 Subject: [PATCH] Add preliminary boxel-motion deployment setup --- .github/workflows/deploy-motion.yml | 62 ++++++++++++++ .github/workflows/manual-deploy.yml | 7 ++ .github/workflows/pr-boxel-motion.yml | 84 +++++++++++++++++++ package.json | 11 ++- .../test-app/app/config/deploy.js | 43 ++++++++++ packages/boxel-motion/test-app/package.json | 6 ++ pnpm-lock.yaml | 28 +++++-- 7 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/deploy-motion.yml create mode 100644 .github/workflows/pr-boxel-motion.yml create mode 100644 packages/boxel-motion/test-app/app/config/deploy.js diff --git a/.github/workflows/deploy-motion.yml b/.github/workflows/deploy-motion.yml new file mode 100644 index 0000000000..83c2aee82e --- /dev/null +++ b/.github/workflows/deploy-motion.yml @@ -0,0 +1,62 @@ +name: Deploy boxel-motion with ember + +on: + workflow_call: + inputs: + environment: + required: true + type: string + +permissions: + contents: read + id-token: write + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + concurrency: deploy-motion-${{ inputs.environment }} + steps: + - uses: actions/checkout@v3 + + - name: Init + uses: ./.github/actions/init + + - name: Set up env + env: + INPUT_ENVIRONMENT: ${{ inputs.environment }} + run: | + echo "AWS_REGION=us-east-1" >> $GITHUB_ENV + if [ "$INPUT_ENVIRONMENT" = "production" ]; then + echo "AWS_ROLE_ARN=arn:aws:iam::120317779495:role/boxel-motion" >> $GITHUB_ENV + echo "AWS_S3_BUCKET=cardstack-boxel-motion-production" >> $GITHUB_ENV + echo "AWS_CLOUDFRONT_DISTRIBUTION=ENCCIR73TMO8S" >> $GITHUB_ENV + elif [ "$INPUT_ENVIRONMENT" = "staging" ]; then + echo "AWS_ROLE_ARN=arn:aws:iam::680542703984:role/boxel-motion" >> $GITHUB_ENV + echo "AWS_S3_BUCKET=cardstack-boxel-motion-staging" >> $GITHUB_ENV + echo "AWS_CLOUDFRONT_DISTRIBUTION=E2ETE2PY0UMPR9" >> $GITHUB_ENV + else + echo "unrecognized environment" + exit 1; + fi + # FIXME production cloudfront distribution + - name: Build boxel-motion addon + run: pnpm build + working-directory: packages/boxel-motion/addon + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 + with: + role-to-assume: ${{ env.AWS_ROLE_ARN }} + aws-region: us-east-1 + + - name: Deploy + run: pnpm deploy:boxel-motion ${{ inputs.environment }} --verbose + + - name: Send notification to Discord + uses: cardstack/gh-actions/discord-notification-deploy@main + with: + app: "boxel-motion" + status: ${{ job.status }} + environment: ${{ inputs.environment }} + webhook: ${{ secrets.DISCORD_WEBHOOK }} diff --git a/.github/workflows/manual-deploy.yml b/.github/workflows/manual-deploy.yml index 915788a557..567d533120 100644 --- a/.github/workflows/manual-deploy.yml +++ b/.github/workflows/manual-deploy.yml @@ -29,6 +29,13 @@ jobs: with: environment: ${{ inputs.environment }} + deploy-motion: + name: Deploy boxel-motion + uses: ./.github/workflows/deploy-motion.yml + secrets: inherit + with: + environment: ${{ inputs.environment }} + build-realm-server: name: Build Docker image uses: cardstack/gh-actions/.github/workflows/docker-ecr.yml@main diff --git a/.github/workflows/pr-boxel-motion.yml b/.github/workflows/pr-boxel-motion.yml new file mode 100644 index 0000000000..b58fe01adc --- /dev/null +++ b/.github/workflows/pr-boxel-motion.yml @@ -0,0 +1,84 @@ +name: CI [boxel-motion] + +on: + pull_request: + paths: + - "packages/boxel-motion/**" + - ".github/workflows/pr-boxel-motion.yml" + - "package.json" + - "pnpm-lock.yaml" + +permissions: + contents: read + issues: read + checks: write + pull-requests: write + id-token: write + statuses: write + +jobs: + check-if-requires-preview: + name: Check if a preview deploy is required + runs-on: ubuntu-latest + outputs: + boxel-motion-files-changed: ${{ steps.boxel-motion-files-that-changed.outputs.any_changed }} + steps: + - uses: actions/checkout@v3 + - name: Get boxel-motion files that changed + id: boxel-motion-files-that-changed + uses: tj-actions/changed-files@v39 + with: + files: | + packages/boxel-motion/** + deploy-motion-preview-staging: + name: Deploy a boxel-motion staging preview to S3 + runs-on: ubuntu-latest + # github.event.pull_request.head.repo.full_name == github.repository: true if pr is from the original repo, false if it's from a fork + # github.head_ref: the branch that the pull request is from. only appears on pull_request events + if: github.event.pull_request.head.repo.full_name == github.repository && github.head_ref && needs.check-if-requires-preview.outputs.boxel-motion-files-changed == 'true' + needs: check-if-requires-preview + concurrency: deploy-motion-preview-staging + steps: + - uses: actions/checkout@v3 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 + with: + role-to-assume: arn:aws:iam::680542703984:role/boxel-motion + aws-region: us-east-1 + - name: Deploy boxel-motion preview + uses: ./.github/actions/deploy-ember-preview + env: + S3_PREVIEW_BUCKET_NAME: boxel-motion-preview.stack.cards + AWS_S3_BUCKET: boxel-motion-preview.stack.cards + AWS_REGION: us-east-1 + AWS_CLOUDFRONT_DISTRIBUTION: E1MA4A64V6KZJ6 + with: + package: boxel-motion + environment: staging + + deploy-motion-preview-production: + name: Deploy a boxel-motion production preview to S3 + runs-on: ubuntu-latest + # github.event.pull_request.head.repo.full_name == github.repository: true if pr is from the original repo, false if it's from a fork + # github.head_ref: the branch that the pull request is from. only appears on pull_request events + if: github.event.pull_request.head.repo.full_name == github.repository && github.head_ref && needs.check-if-requires-preview.outputs.boxel-motion-files-changed == 'true' + needs: check-if-requires-preview + concurrency: deploy-motion-preview-production + steps: + - uses: actions/checkout@v3 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 + with: + role-to-assume: arn:aws:iam::120317779495:role/boxel-motion + aws-region: us-east-1 + - name: Deploy boxel-motion preview + uses: ./.github/actions/deploy-ember-preview + env: + S3_PREVIEW_BUCKET_NAME: boxel-motion-preview.cardstack.com + AWS_S3_BUCKET: boxel-motion-preview.cardstack.com + AWS_REGION: us-east-1 + AWS_CLOUDFRONT_DISTRIBUTION: E1A4IR2R5TJZJZ + # FIXME update + with: + package: boxel-motion + environment: production diff --git a/package.json b/package.json index 66953a9f45..53b23cab3d 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,14 @@ "url": "https://github.com/cardstack/boxel" }, "scripts": { - "build:boxel-host": "cd packages/boxel-ui/addon && pnpm build && cd ../../host && NODE_OPTIONS='--max_old_space_size=8192' pnpm build:production", + "build:boxel-host": "cd packages/boxel-motion/addon && pnpm build && cd ../../host && NODE_OPTIONS='--max_old_space_size=8192' pnpm build:production", "clear-caches": "find . -name 'node_modules' -type d -prune -exec rm -rf {} \\; && rm -rf $TMPDIR/embroider", - "deploy:boxel-host": "cd packages/boxel-ui/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy", - "deploy:boxel-host:preview-staging": "cd packages/boxel-ui/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy s3-preview-staging --verbose", - "deploy:boxel-host:preview-production": "cd packages/boxel-ui/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy s3-preview-production --verbose", + "deploy:boxel-host": "cd packages/boxel-motion/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy", + "deploy:boxel-host:preview-staging": "cd packages/boxel-motion/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy s3-preview-staging --verbose", + "deploy:boxel-host:preview-production": "cd packages/boxel-motion/addon && pnpm build && cd ../../host && BASE_REALM_HOSTING_DISABLED=true NODE_OPTIONS='--max_old_space_size=8192' pnpm exec ember deploy s3-preview-production --verbose", + "deploy:boxel-motion": "cd packages/boxel-motion/addon && pnpm build && cd ../test-app && pnpm exec ember deploy", + "deploy:boxel-motion:preview-staging": "cd packages/boxel-motion/addon && pnpm build && cd ../test-app && pnpm exec ember deploy s3-preview-staging --verbose", + "deploy:boxel-motion:preview-production": "cd packages/boxel-motion/addon && pnpm build && cd ../test-app && pnpm exec ember deploy s3-preview-production --verbose", "lint": "pnpm run --filter './packages/**' --if-present -r lint", "lint:fix": "pnpm run --filter './packages/**' --if-present -r lint:fix" }, diff --git a/packages/boxel-motion/test-app/app/config/deploy.js b/packages/boxel-motion/test-app/app/config/deploy.js new file mode 100644 index 0000000000..f166dcdec4 --- /dev/null +++ b/packages/boxel-motion/test-app/app/config/deploy.js @@ -0,0 +1,43 @@ +/* eslint-env node */ + +module.exports = function (deployTarget) { + let ENV = { + pipeline: { + activateOnDeploy: true, + }, + plugins: ['build', 'smart-compress', 'revision-data', 's3', 'cloudfront'], + build: {}, + s3: { + allowOverwrite: true, + bucket: process.env.AWS_S3_BUCKET, + region: process.env.AWS_REGION, + filePattern: '**/*', + }, + cloudfront: { + objectPaths: ['/*'], + distribution: process.env.AWS_CLOUDFRONT_DISTRIBUTION, + }, + }; + + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + } + + if (deployTarget === 'build-only') { + ENV.build.environment = 'production'; + ENV.plugins = ['build']; + } + + if ( + deployTarget === 's3-preview-staging' || + deployTarget === 's3-preview-production' + ) { + ENV.s3.prefix = process.env.PR_BRANCH_NAME; + } + + return ENV; +}; diff --git a/packages/boxel-motion/test-app/package.json b/packages/boxel-motion/test-app/package.json index d1c9839798..e6b823b0e0 100644 --- a/packages/boxel-motion/test-app/package.json +++ b/packages/boxel-motion/test-app/package.json @@ -55,6 +55,12 @@ "ember-cli": "^4.12.1", "ember-cli-babel": "^8.2.0", "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-deploy": "^1.0.2", + "ember-cli-deploy-build": "^2.0.0", + "ember-cli-deploy-cloudfront": "^5.0.0", + "ember-cli-deploy-revision-data": "^2.0.0", + "ember-cli-deploy-s3": "^3.1.0", + "ember-cli-deploy-smart-compress": "^2.0.0", "ember-cli-htmlbars": "^6.3.0", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61ada7fc12..e6d2a03fb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -451,6 +451,24 @@ importers: ember-cli-dependency-checker: specifier: ^3.3.1 version: 3.3.1(ember-cli@4.12.1) + ember-cli-deploy: + specifier: ^1.0.2 + version: 1.0.2 + ember-cli-deploy-build: + specifier: ^2.0.0 + version: 2.0.0 + ember-cli-deploy-cloudfront: + specifier: ^5.0.0 + version: 5.0.0 + ember-cli-deploy-revision-data: + specifier: ^2.0.0 + version: 2.0.0 + ember-cli-deploy-s3: + specifier: ^3.1.0 + version: 3.1.0 + ember-cli-deploy-smart-compress: + specifier: ^2.0.0 + version: 2.0.0 ember-cli-htmlbars: specifier: ^6.3.0 version: 6.3.0 @@ -8366,15 +8384,15 @@ packages: deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. hasBin: true dependencies: - caniuse-lite: 1.0.30001551 - electron-to-chromium: 1.4.560 + caniuse-lite: 1.0.30001599 + electron-to-chromium: 1.4.708 dev: true /browserslist@3.2.8: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001551 + caniuse-lite: 1.0.30001599 electron-to-chromium: 1.4.560 dev: true @@ -8652,7 +8670,7 @@ packages: resolution: {integrity: sha512-425yJRcUDCCMKc0Zga2KSUe7Qp7nCtL8H0BJIsDxF9yMzG2eSYvOggi5U1wXzxgcSgDGnzVLvZ8dZGMBrA6Ltg==} dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001551 + caniuse-lite: 1.0.30001599 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true @@ -9455,7 +9473,7 @@ packages: /core-js-compat@3.33.0: resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 /core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==}