Skip to content

Commit

Permalink
fix: napi build no longer generates index.d.ts file
Browse files Browse the repository at this point in the history
fix: removed jetbrains from `shell.nix`
fix: removed socket.ts scaffolding
feat: added benches stub
fix: `npm bin` has been deprecated, replaced with `$(npm root)/.bin`
chore: all scripts seem to be working
  • Loading branch information
tegefaulkes authored and CMCDragonkai committed May 16, 2023
1 parent 645d8dd commit bbbd1e5
Show file tree
Hide file tree
Showing 25 changed files with 1,348 additions and 10,862 deletions.
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]+$/
Loading

0 comments on commit bbbd1e5

Please sign in to comment.