Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: Add Staging Process (Step 1) for Phased Rollout #826

Merged
merged 2 commits into from
Jan 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
312 changes: 312 additions & 0 deletions .github/workflows/staging-step-1.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,312 @@
name: 'Staging Release - Step 1: Prepare CDN Pre-Release, Publish NPM'

on:
workflow_dispatch:
inputs:
dryRun:
description: 'Do a dry run to preview instead of a real release [true/false]'
required: true
type: boolean
default: true

jobs:
# SDK staging release must be done from the staging branch
confirm-staging-branch:
name: Confirm release is run on staging
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v3

- name: Branch Check
run: |
BRANCHNAME=${GITHUB_REF##*/}
if [ $BRANCHNAME != "staging" ]; then
echo "You can only run a staging release from the staging branch, you are trying to run it from ${BRANCHNAME}"
exit 1
fi

build-bundle:
name: Build Distribution Bundle
runs-on: ubuntu-latest
needs: confirm-staging-branch
steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: development

- name: NPM install
uses: actions/setup-node@v3
with:
node-version: 16.x

- name: Run NPM CI
run: npm ci

- name: Lint with ESLint
run: npm run lint

- name: Lint with Prettier
run: npm run prettier

- name: Run Build IIFE
run: npm run build:iife

- name: Display Bundle Diff, but Fancy!
run: git diff --unified=3 dist/mparticle.js | npx diff-so-fancy

- name: Archive npm failure logs
uses: actions/upload-artifact@v2
if: failure()
with:
name: npm-logs
path: ~/.npm/_logs

# Currently, we're only using Jest to test TypeScript modules
# and they do not require any built files
test-jest:
name: 'Test Jest'
runs-on: 'ubuntu-latest'
strategy:
matrix:
node-version: [16.x, 17.x, 18.x, 19.x, 20.x]
steps:
- name: Checkout
uses: actions/checkout@v3

- name: NPM install
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}

- name: Run NPM CI
run: npm ci

- name: Run Jest Tests
run: npm run test:jest

- name: Archive npm failure logs
uses: actions/upload-artifact@v3
if: failure()
with:
name: npm-logs
path: ~/.npm/_logs

# Only Core test requires bundle, but we want to make sure
# that tests only run when the bundle is successfully built
test-core:
name: Core Tests
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-jest
- build-bundle
with:
test_command_label: Core SDK Tests
test_command: npm run test
build_command: npm run build:iife
branch_name: ${{ vars.GITHUB_SHA }}

# Test Sub can be run independent of other tests
test-stub:
name: 'Test Stub'
runs-on: ubuntu-latest
needs:
- test-core
- test-jest
- build-bundle
steps:
- name: Checkout
uses: actions/checkout@v3

- name: NPM install
uses: actions/setup-node@v3
with:
node-version: 16.x

- name: Run NPM CI
run: npm ci

- name: Install Firefox Latest
uses: browser-actions/setup-firefox@latest

- name: Log Firefox Version
run: firefox --version

- name: Run Stub Tests
run: npm run test:stub

- name: Archive npm failure logs
uses: actions/upload-artifact@v3
if: failure()
with:
name: npm-logs
path: ~/.npm/_logs

# Integration Tests run the same suite of tests against various build systems
# to make sure our SDK will run in different environments

test-integrations-require-js:
name: 'Integration Tests: Require JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: Require JS Test
test_command: npm run test:requirejs
branch_name: ${{ vars.GITHUB_SHA }}

test-integrations-common-js-browserfy:
name: 'Integration Tests: Browserfy Common JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: Browserfy CJS Test
test_command: npm run test:integrations:cjs:browserfy
branch_name: ${{ vars.GITHUB_SHA }}
build_command: npm run build:npm && npm run build:test-bundle

test-integrations-common-js-webpack:
name: 'Integration Tests: webpack Common JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: webpack CJS Test
test_command: npm run test:integrations:cjs:webpack
branch_name: ${{ vars.GITHUB_SHA }}
build_command: npm run build:npm && npm run build:test-bundle

test-integrations-common-js-rollup:
name: 'Integration Tests: Rollup Common JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: Rollup CJS Test
test_command: npm run test:integrations:cjs:rollup
branch_name: ${{ vars.GITHUB_SHA }}
build_command: npm run build:npm && npm run build:test-bundle

test-integrations-module-js-webpack:
name: 'Integration Tests: webpack Module JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: webpack Module Test
test_command: npm run test:integrations:module:webpack
branch_name: ${{ vars.GITHUB_SHA }}
build_command: npm run build:esm && npm run build:test-bundle

test-integrations-module-js-rollup:
name: 'Integration Tests: Rollup Module JS'
uses: mParticle/mparticle-workflows/.github/workflows/web-run-test.yml@main
needs:
- test-core
- test-jest
- build-bundle
with:
test_command_label: Rollup Module Test
test_command: npm run test:integrations:module:rollup
branch_name: ${{ vars.GITHUB_SHA }}
build_command: npm run build:esm && npm run build:test-bundle

create-release-branch:
name: Create release branch
runs-on: ubuntu-latest
needs:
- test-core
- test-stub
- test-integrations-common-js-browserfy
- test-integrations-common-js-webpack
- test-integrations-common-js-rollup
- test-integrations-module-js-webpack
- test-integrations-module-js-rollup
- test-integrations-require-js
- confirm-staging-branch
steps:
- name: Checkout development branch
uses: actions/checkout@v3
with:
repository: mparticle/mparticle-web-sdk
ref: development

- name: Create and push release branch
run: |
git checkout -b release/${{ github.run_number }}
git push origin release/${{ github.run_number }}

release:
name: Perform Release
runs-on: ubuntu-latest
needs:
- create-release-branch
env:
GITHUB_TOKEN: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }}
GIT_AUTHOR_NAME: mparticle-automation
GIT_AUTHOR_EMAIL: [email protected]
GIT_COMMITTER_NAME: mparticle-automation
GIT_COMMITTER_EMAIL: [email protected]
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

steps:
- name: Checkout staging branch
uses: actions/checkout@v3
with:
fetch-depth: 0
ref: staging

- name: Import GPG Key
uses: crazy-max/ghaction-import-gpg@e00cb83a68c1158b29afc5217dd0582cada6d172 #v4.4.0
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
git_user_signingkey: true
git_commit_gpgsign: true

- name: Merge release branch into staging branch
run: |
git pull origin release/${{ github.run_number }}

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 16.x

- name: Install dependencies
run: npm ci

- name: Release --dry-run
if: ${{ github.event.inputs.dryRun == 'true'}}
run: |
npx semantic-release --branches staging --dry-run

# NPM Publish happens here
- name: Release
if: ${{ github.event.inputs.dryRun == 'false'}}
run: |
npx semantic-release --branches staging

- name: Archive npm failure logs
uses: actions/upload-artifact@v3
if: failure()
with:
name: npm-logs
path: ~/.npm/_logs

- name: Push automated release commits to release branch
if: ${{ github.event.inputs.dryRun == 'false' }}
run: |
git push origin HEAD:release/${{ github.run_number }}
Loading