-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #19 from MatrixAI/feature-packaging
Packaging up js-quic for integration into Polykey
- Loading branch information
Showing
28 changed files
with
1,462 additions
and
10,901 deletions.
There are no files selected for viewing
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,366 @@ | ||
workflow: | ||
rules: | ||
# Disable merge request pipelines | ||
- if: $CI_MERGE_REQUEST_ID | ||
when: never | ||
- when: always | ||
|
||
variables: | ||
GIT_SUBMODULE_STRATEGY: recursive | ||
GH_PROJECT_PATH: "MatrixAI/${CI_PROJECT_NAME}" | ||
GH_PROJECT_URL: "https://${GITHUB_TOKEN}@github.com/${GH_PROJECT_PATH}.git" | ||
# Cache .npm | ||
npm_config_cache: "${CI_PROJECT_DIR}/tmp/npm" | ||
# Prefer offline node module installation | ||
npm_config_prefer_offline: "true" | ||
# Homebrew cache only used by macos runner | ||
HOMEBREW_CACHE: "${CI_PROJECT_DIR}/tmp/Homebrew" | ||
|
||
default: | ||
interruptible: true | ||
before_script: | ||
# Replace this in windows runners that use powershell | ||
# with `mkdir -Force "$CI_PROJECT_DIR/tmp"` | ||
- mkdir -p "$CI_PROJECT_DIR/tmp" | ||
|
||
# Cached directories shared between jobs & pipelines per-branch per-runner | ||
cache: | ||
key: $CI_COMMIT_REF_SLUG | ||
# Preserve cache even if job fails | ||
when: 'always' | ||
paths: | ||
- ./tmp/npm/ | ||
# Homebrew cache is only used by the macos runner | ||
- ./tmp/Homebrew | ||
# Chocolatey cache is only used by the windows runner | ||
- ./tmp/chocolatey/ | ||
# `jest` cache is configured in jest.config.js | ||
- ./tmp/jest/ | ||
|
||
stages: | ||
- check # Linting, unit tests | ||
- build # Cross-platform library compilation, unit tests | ||
- integration # Cross-platform application bundling, integration tests, and pre-release | ||
- release # Cross-platform distribution and deployment | ||
|
||
image: registry.gitlab.com/matrixai/engineering/maintenance/gitlab-runner | ||
|
||
check:lint: | ||
stage: check | ||
needs: [] | ||
script: | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm run lint; | ||
npm run lint-shell; | ||
' | ||
rules: | ||
# Runs on feature and staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH =~ /^(?:feature.*|staging)$/ && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Manually run on commits other than master and ignore version commits | ||
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != 'master' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
when: manual | ||
|
||
check:test: | ||
stage: check | ||
needs: [] | ||
script: | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm run prebuild --verbose; | ||
npm test -- --ci --coverage; | ||
' | ||
artifacts: | ||
when: always | ||
reports: | ||
junit: | ||
- ./tmp/junit/junit.xml | ||
coverage_report: | ||
coverage_format: cobertura | ||
path: ./tmp/coverage/cobertura-coverage.xml | ||
coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/' | ||
rules: | ||
# Runs on feature commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH =~ /^feature.*$/ && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Manually run on commits other than master and staging and ignore version commits | ||
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH !~ /^(?:master|staging)$/ && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
when: manual | ||
|
||
build:merge: | ||
stage: build | ||
needs: [] | ||
allow_failure: true | ||
script: | ||
# Required for `gh pr create` | ||
- git remote add upstream "$GH_PROJECT_URL" | ||
- > | ||
nix-shell --arg ci true --run $' | ||
gh pr create \ | ||
--head staging \ | ||
--base master \ | ||
--title "ci: merge staging to master" \ | ||
--body "This is an automatic PR generated by the pipeline CI/CD. This will be automatically fast-forward merged if successful." \ | ||
--assignee "@me" \ | ||
--no-maintainer-edit \ | ||
--repo "$GH_PROJECT_PATH" || true; | ||
printf "Pipeline Attempt on ${CI_PIPELINE_ID} for ${CI_COMMIT_SHA}\n\n${CI_PIPELINE_URL}" \ | ||
| gh pr comment staging \ | ||
--body-file - \ | ||
--repo "$GH_PROJECT_PATH"; | ||
' | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
build:dist: | ||
stage: build | ||
needs: [] | ||
script: | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm run build --ignore-scripts --verbose; | ||
' | ||
artifacts: | ||
when: always | ||
paths: | ||
- ./dist | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
build:linux: | ||
stage: build | ||
needs: [] | ||
variables: | ||
# Only x64 architecture is needed | ||
npm_config_arch: "x64" | ||
script: | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm run prebuild --verbose -- --production; | ||
npm test -- --ci --coverage; | ||
npm run bench; | ||
' | ||
artifacts: | ||
when: always | ||
reports: | ||
junit: | ||
- ./tmp/junit/junit.xml | ||
coverage_report: | ||
coverage_format: cobertura | ||
path: ./tmp/coverage/cobertura-coverage.xml | ||
metrics: ./benches/results/metrics.txt | ||
paths: | ||
- ./prebuild/ | ||
coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/' | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
build:windows: | ||
stage: build | ||
needs: [] | ||
tags: | ||
- windows | ||
variables: | ||
# Only x64 architecture is needed | ||
npm_config_arch: "x64" | ||
before_script: | ||
- mkdir -Force "$CI_PROJECT_DIR/tmp" | ||
script: | ||
- ./scripts/choco-install.ps1 | ||
- refreshenv | ||
- npm install --ignore-scripts | ||
- $env:Path = "$(npm bin);" + $env:Path | ||
- npm run prebuild --verbose -- --production | ||
- npm test -- --ci --coverage | ||
- npm run bench | ||
artifacts: | ||
when: always | ||
reports: | ||
junit: | ||
- ./tmp/junit/junit.xml | ||
coverage_report: | ||
coverage_format: cobertura | ||
path: ./tmp/coverage/cobertura-coverage.xml | ||
metrics: ./benches/results/metrics.txt | ||
paths: | ||
- ./prebuild/ | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
build:macos: | ||
stage: build | ||
needs: [] | ||
tags: | ||
- shared-macos-amd64 | ||
image: macos-11-xcode-12 | ||
variables: | ||
# Produce universal binary | ||
npm_config_arch: 'x64+arm64' | ||
script: | ||
- eval "$(brew shellenv)" | ||
- ./scripts/brew-install.sh | ||
- hash -r | ||
- npm install --ignore-scripts | ||
- export PATH="$(npm bin):$PATH" | ||
- npm run prebuild --verbose -- --production | ||
- npm test -- --ci --coverage | ||
- npm run bench | ||
artifacts: | ||
when: always | ||
reports: | ||
junit: | ||
- ./tmp/junit/junit.xml | ||
coverage_report: | ||
coverage_format: cobertura | ||
path: ./tmp/coverage/cobertura-coverage.xml | ||
metrics: ./benches/results/metrics.txt | ||
paths: | ||
- ./prebuild/ | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
build:prerelease: | ||
stage: build | ||
needs: | ||
- build:dist | ||
- build:linux | ||
- build:windows | ||
- build:macos | ||
# Don't interrupt publishing job | ||
interruptible: false | ||
variables: | ||
# Set the prerelease tag for prepublishOnly script | ||
npm_config_tag: 'prerelease' | ||
script: | ||
- echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ./.npmrc | ||
- echo 'Publishing library prerelease' | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm publish --tag prerelease --access public; | ||
' | ||
- > | ||
for d in prebuild/*; do | ||
tar \ | ||
--create \ | ||
--verbose \ | ||
--file="prebuild/$(basename $d).tar" \ | ||
--directory=prebuild \ | ||
"$(basename $d)"; | ||
done | ||
- > | ||
nix-shell --arg ci true --run $' | ||
gh release \ | ||
create "$CI_COMMIT_TAG" \ | ||
prebuild/*.tar \ | ||
--title "${CI_COMMIT_TAG}-$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ | ||
--notes "" \ | ||
--prerelease \ | ||
--target staging \ | ||
--repo "$GH_PROJECT_PATH"; | ||
' | ||
after_script: | ||
- rm -f ./.npmrc | ||
rules: | ||
# Only runs on tag pipeline where the tag is a prerelease version | ||
# This requires dependencies to also run on tag pipeline | ||
# However version tag comes with a version commit | ||
# Dependencies must not run on the version commit | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+-.*[0-9]+$/ | ||
|
||
integration:merge: | ||
stage: integration | ||
needs: | ||
- build:merge | ||
- job: build:linux | ||
optional: true | ||
- job: build:windows | ||
optional: true | ||
- job: build:macos | ||
optional: true | ||
# Requires mutual exclusion | ||
resource_group: integration:merge | ||
allow_failure: true | ||
variables: | ||
# Ensure that CI/CD is fetching all commits | ||
# this is necessary to checkout origin/master | ||
# and to also merge origin/staging | ||
GIT_DEPTH: 0 | ||
script: | ||
- > | ||
nix-shell --arg ci true --run $' | ||
printf "Pipeline Succeeded on ${CI_PIPELINE_ID} for ${CI_COMMIT_SHA}\n\n${CI_PIPELINE_URL}" \ | ||
| gh pr comment staging \ | ||
--body-file - \ | ||
--repo "$GH_PROJECT_PATH"; | ||
' | ||
- git remote add upstream "$GH_PROJECT_URL" | ||
- git checkout origin/master | ||
# Merge up to the current commit (not the latest commit) | ||
- git merge --ff-only "$CI_COMMIT_SHA" | ||
- git push upstream HEAD:master | ||
rules: | ||
# Runs on staging commits and ignores version commits | ||
- if: $CI_COMMIT_BRANCH == 'staging' && $CI_COMMIT_TITLE !~ /^[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
# Runs on tag pipeline where the tag is a prerelease or release version | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(?:-.*[0-9]+)?$/ | ||
|
||
release:distribution: | ||
stage: release | ||
needs: | ||
- build:dist | ||
- build:linux | ||
- build:windows | ||
- build:macos | ||
- integration:merge | ||
# Don't interrupt publishing job | ||
interruptible: false | ||
script: | ||
- echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ./.npmrc | ||
- echo 'Publishing library' | ||
- > | ||
nix-shell --arg ci true --run $' | ||
npm publish --access public; | ||
' | ||
- > | ||
for d in prebuild/*; do | ||
tar \ | ||
--create \ | ||
--verbose \ | ||
--file="prebuild/$(basename $d).tar" \ | ||
--directory=prebuild \ | ||
"$(basename $d)"; | ||
done | ||
- > | ||
nix-shell --arg ci true --run $' | ||
gh release \ | ||
create "$CI_COMMIT_TAG" \ | ||
prebuild/*.tar \ | ||
--title "${CI_COMMIT_TAG}-$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ | ||
--notes "" \ | ||
--target master \ | ||
--repo "$GH_PROJECT_PATH"; | ||
' | ||
after_script: | ||
- rm -f ./.npmrc | ||
rules: | ||
# Only runs on tag pipeline where the tag is a release version | ||
# This requires dependencies to also run on tag pipeline | ||
# However version tag comes with a version commit | ||
# Dependencies must not run on the version commit | ||
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/ |
Oops, something went wrong.