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

Packaging up js-quic for integration into Polykey #19

Merged
merged 1 commit into from
May 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 4 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@
# nix
/result*
/builds
# node-gyp
# native
/build
# prebuildify
/prebuilds

# napi-rs
/prebuild
/prepublishOnly
/target
/*.node


# Logs
logs
Expand Down
366 changes: 366 additions & 0 deletions .gitlab-ci.yaml
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]+$/