From d4bc1133a62764a7475731e84bc36675ffbe225c Mon Sep 17 00:00:00 2001 From: sun0day Date: Sun, 17 Dec 2023 16:19:51 +0800 Subject: [PATCH] chore: publish workflow (#3) --- .github/workflows/CI.yml | 107 +------------ .github/workflows/publish.yml | 291 ++++++++++++++++++++++++++++++++++ package.json | 6 +- pnpm-lock.yaml | 3 + scripts/artifacts.mjs | 50 ++++++ scripts/file.mjs | 1 + 6 files changed, 351 insertions(+), 107 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 scripts/artifacts.mjs diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fb05cd8..046d62f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,8 +1,6 @@ name: CI env: DEBUG: napi:* - BUILD_CRATE_BIN: ./*packages/**/*.node - BUILD_CRATE_JS: ./*packages/**/core.* MACOSX_DEPLOYMENT_TARGET: '10.13' permissions: contents: write @@ -176,14 +174,6 @@ jobs: run: ${{ matrix.settings.build }} if: ${{ !matrix.settings.docker }} shell: bash - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: bindings-${{ matrix.settings.target }} - path: | - ${{ env.BUILD_CRATE_BIN }} - ${{ env.BUILD_CRATE_JS }} - if-no-files-found: error build-freebsd: runs-on: ubuntu-latest name: Build FreeBSD @@ -216,105 +206,10 @@ jobs: run: | export PATH="/usr/local/cargo/bin:$PATH" pwd - ls -lah whoami env freebsd-version GITHUB_EVENT_PATH= pnpm install GITHUB_EVENT_PATH= pnpm build strip -x packages/**/*.node - GITHUB_EVENT_PATH= pnpm test - rm -rf ./**/node_modules - rm -rf ./**/target - echo "~~~~ wait to upload ~~~~" - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: bindings-freebsd - path: | - ${{ env.BUILD_CRATE_BIN }} - ${{ env.BUILD_CRATE_JS }} - if-no-files-found: error - universal-macOS: - name: Build universal macOS binary - needs: - - build_test - runs-on: macos-latest - steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - version: latest - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - check-latest: true - cache: pnpm - - name: Install dependencies - run: pnpm i -g npm && pnpm install - - name: Download macOS x64 artifact - uses: actions/download-artifact@v3 - with: - name: bindings-x86_64-apple-darwin - path: artifacts - - name: Download macOS arm64 artifact - uses: actions/download-artifact@v3 - with: - name: bindings-aarch64-apple-darwin - path: artifacts - - name: Combine binaries - run: pnpm universal - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: bindings-universal-apple-darwin - path: | - ${{ env.BUILD_CRATE_BIN }} - ${{ env.BUILD_CRATE_JS }} - if-no-files-found: error - publish: - name: Publish - runs-on: ubuntu-latest - needs: - - build-freebsd - - universal-macOS - steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - version: latest - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - check-latest: true - cache: pnpm - - name: Install dependencies - run: pnpm i -g npm && pnpm install - - name: Download all artifacts - uses: actions/download-artifact@v3 - with: - path: artifacts - - name: Move artifacts - run: pnpm artifacts - - name: List packages - run: ls -R ./npm - shell: bash - - name: Publish - run: | - npm config set provenance true - if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; - then - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - npm publish --access public - elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; - then - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - npm publish --tag next --access public - else - echo "Not a release, skipping publish" - fi - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GITHUB_EVENT_PATH= pnpm test \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..9df0602 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,291 @@ +name: CI +env: + DEBUG: napi:* + BUILD_CRATE_BIN: ./*packages/**/*.node + BUILD_CRATE_JS: ./*packages/**/core.* + MACOSX_DEPLOYMENT_TARGET: '10.13' +permissions: + contents: write + id-token: write +'on': + push: + tags: + - "v*" +jobs: + build: + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + build: | + pnpm build + strip -x packages/**/*.node + - host: windows-latest + build: | + pnpm build + target: x86_64-pc-windows-msvc + - host: windows-latest + build: | + pnpm build:crate --target i686-pc-windows-msvc + pnpm build:npm + target: i686-pc-windows-msvc + - host: ubuntu-latest + target: x86_64-unknown-linux-gnu + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian + build: |- + set -e && unset CC_x86_64_unknown_linux_gnu && unset CC && + pnpm build:crate --target x86_64-unknown-linux-gnu && + strip -x packages/**/*.node && + pnpm build:npm + - host: ubuntu-latest + target: x86_64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: | + set -e + git config --global --add safe.directory /build + pnpm build + strip -x packages/**/*.node + - host: macos-latest + target: aarch64-apple-darwin + build: | + pnpm build:crate --target aarch64-apple-darwin + strip -x packages/**/*.node + - host: ubuntu-latest + target: aarch64-unknown-linux-gnu + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 + build: |- + set -e && + export JEMALLOC_SYS_WITH_LG_PAGE=16 && + rustup target add aarch64-unknown-linux-gnu && + export CC_aarch64_unknown_linux_gnu=/usr/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc + pnpm build:crate --target aarch64-unknown-linux-gnu && + aarch64-unknown-linux-gnu-strip packages/**/*.node + - host: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + setup: | + sudo apt-get update + sudo apt-get install gcc-arm-linux-gnueabihf -y + build: | + pnpm build:crate --target armv7-unknown-linux-gnueabihf + arm-linux-gnueabihf-strip packages/**/*.node + - host: ubuntu-latest + target: aarch64-linux-android + build: | + pnpm build:crate --target aarch64-linux-android + ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip packages/**/*.node + - host: ubuntu-latest + target: armv7-linux-androideabi + build: | + pnpm build:crate --target armv7-linux-androideabi + ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip packages/**/*.node + - host: ubuntu-latest + target: aarch64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: |- + set -e && + rustup target add aarch64-unknown-linux-musl && + pnpm build:crate --target aarch64-unknown-linux-musl && + /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip packages/**/*.node + - host: windows-latest + target: aarch64-pc-windows-msvc + build: | + pnpm build:crate --target aarch64-pc-windows-msvc + node: + - '20' + name: stable - ${{ matrix.settings.target }} - node@${{ matrix.node }} + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: latest + - name: Setup node + uses: actions/setup-node@v3 + if: ${{ !matrix.settings.docker }} + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: pnpm + - name: Install + uses: dtolnay/rust-toolchain@stable + if: ${{ !matrix.settings.docker }} + with: + toolchain: stable + targets: ${{ matrix.settings.target }} + - name: Cache cargo + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + .cargo-cache + target/ + key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} + - uses: goto-bus-stop/setup-zig@v2 + if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} + with: + version: 0.10.1 + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Setup node x86 + if: matrix.settings.target == 'i686-pc-windows-msvc' + run: pnpm config set supportedArchitectures.cpu "ia32" + shell: bash + - name: Install dependencies + run: pnpm i -g npm && pnpm install + - name: Setup node x86 + uses: actions/setup-node@v3 + if: matrix.settings.target == 'i686-pc-windows-msvc' + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: pnpm + architecture: x86 + - name: Build in docker + uses: addnab/docker-run-action@v3 + if: ${{ matrix.settings.docker }} + with: + image: ${{ matrix.settings.docker }} + options: '--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build' + run: ${{ matrix.settings.build }} + - name: Build + run: ${{ matrix.settings.build }} + if: ${{ !matrix.settings.docker }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: bindings-${{ matrix.settings.target }} + path: | + ${{ env.BUILD_CRATE_BIN }} + ${{ env.BUILD_CRATE_JS }} + if-no-files-found: error + build-freebsd: + runs-on: ubuntu-latest + name: Build FreeBSD + steps: + - uses: actions/checkout@v3 + - name: Build + id: build + uses: vmactions/freebsd-vm@v1 + env: + DEBUG: napi:* + RUSTUP_HOME: /usr/local/rustup + CARGO_HOME: /usr/local/cargo + RUSTUP_IO_THREADS: 1 + with: + envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS + usesh: true + mem: 3000 + prepare: | + pkg install -y -f curl node libnghttp2 npm + curl https://sh.rustup.rs -sSf --output rustup.sh + sh rustup.sh -y --profile minimal --default-toolchain beta + export PATH="/usr/local/cargo/bin:$PATH" + npm i -g pnpm + echo "~~~~ rustc --version ~~~~" + rustc --version + echo "~~~~ node -v ~~~~" + node -v + echo "~~~~ pnpm --version ~~~~" + pnpm --version + run: | + export PATH="/usr/local/cargo/bin:$PATH" + pwd + whoami + env + freebsd-version + GITHUB_EVENT_PATH= pnpm install + GITHUB_EVENT_PATH= pnpm build + strip -x packages/**/*.node + rm -rf ./**/node_modules + rm -rf ./**/target + echo "~~~~ wait to upload ~~~~" + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: bindings-freebsd + path: | + ${{ env.BUILD_CRATE_BIN }} + ${{ env.BUILD_CRATE_JS }} + if-no-files-found: error + universal-macOS: + name: Build universal macOS binary + needs: + - build + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: latest + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 20 + check-latest: true + cache: pnpm + - name: Install dependencies + run: pnpm install + - name: Download macOS x64 artifact + uses: actions/download-artifact@v3 + with: + name: bindings-x86_64-apple-darwin + - name: Download macOS arm64 artifact + uses: actions/download-artifact@v3 + with: + name: bindings-aarch64-apple-darwin + - name: List binaries + run: ls -R packages/**/*.node + - name: Combine binaries + run: pnpm universal -d ./ + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: bindings-universal-apple-darwin + path: | + ${{ env.BUILD_CRATE_BIN }} + ${{ env.BUILD_CRATE_JS }} + if-no-files-found: error + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - build-freebsd + - universal-macOS + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: latest + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 20 + check-latest: true + cache: pnpm + - name: Install dependencies + run: pnpm i -g npm && pnpm install + - name: Download all artifacts + uses: actions/download-artifact@v3 + with: + path: . + - name: Move artifacts + run: node scripts/artifacts.mjs && pnpm artifacts + - name: List packages + run: ls -R packages/**/npm && ls -R packages/*/*.js + shell: bash + - name: Publish + run: | + pnpm config set provenance true + pnpm prepublishOnly + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + pnpm publish --access public + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package.json b/package.json index e99d244..57cf9e9 100644 --- a/package.json +++ b/package.json @@ -13,13 +13,17 @@ "postinstall": "pnpm install:test", "repos": "node scripts/git-repo.mjs", "test": "pnpm --filter \"{packages/**}\" run test", - "test:git": "pnpm --filter \"{packages/**}\" run test:git" + "test:git": "pnpm --filter \"{packages/**}\" run test:git", + "artifacts": "pnpm --filter \"{packages/**}\" run artifacts", + "universal": "pnpm --filter \"{packages/**}\" run universal", + "prepublishOnly": "pnpm --filter \"{packages/**}\" run prepublishOnly" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "debug": "^4.3.1", + "fast-glob": "^3.3.2", "simple-git": "^3.20.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed0c33c..4a65e10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: debug: specifier: ^4.3.1 version: 4.3.4 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 simple-git: specifier: ^3.20.0 version: 3.21.0 diff --git a/scripts/artifacts.mjs b/scripts/artifacts.mjs new file mode 100644 index 0000000..9c0d7ea --- /dev/null +++ b/scripts/artifacts.mjs @@ -0,0 +1,50 @@ +import {join} from 'node:path' +import {execSync} from 'node:child_process' +import fg from 'fast-glob' +import {createDir} from './file.mjs' + +const bindings = [ + 'bindings-aarch64-apple-darwin', + 'bindings-aarch64-linux-android', + 'bindings-aarch64-pc-windows-msvc', + 'bindings-aarch64-unknown-linux-gnu', + 'bindings-aarch64-unknown-linux-musl', + 'bindings-armv7-linux-androideabi', + 'bindings-armv7-unknown-linux-gnueabihf', + 'bindings-freebsd', + 'bindings-i686-pc-windows-msvc', + 'bindings-universal-apple-darwin', + 'bindings-x86_64-apple-darwin', + 'bindings-x86_64-pc-windows-msvc', + 'bindings-x86_64-unknown-linux-gnu', + 'bindings-x86_64-unknown-linux-musl' +] + +bindings.forEach(async (dir, index) => { + // move binaries + const bins = await fg('**/*.node', {cwd: join(dir, './packages')}) + let cmd = `echo "mv ${dir} bins"` + await Promise.all(bins.map(async bin => { + const [pkg, file] = bin.split('/') + const artifactsDir = join('../packages', pkg, 'artifacts') + await createDir(artifactsDir, import.meta.url).catch(() => {}) + await createDir(join(artifactsDir, dir), import.meta.url).catch(() => {}) + cmd = [cmd, `mv ${join(dir, 'packages', bin)} ${join('packages', pkg,'artifacts', dir, file)}`].join(' && ') + })) + + console.log(cmd) + execSync(cmd, {stdio: 'inherit'}) + + // move js + if(index === 0) { + const jss = await fg('**/core.*', {cwd: join(dir, './packages')}) + cmd = `echo "mv ${dir} js"` + jss.forEach(js => { + const [pkg, file] = js.split('/') + cmd = [cmd, `mv ${join(dir, 'packages', js)} ${join('packages', pkg, file)}`].join(' && ') + }) + + console.log(cmd) + execSync(cmd, {stdio: 'inherit'}) + } +}) \ No newline at end of file diff --git a/scripts/file.mjs b/scripts/file.mjs index 8c4f37e..3f2a17e 100644 --- a/scripts/file.mjs +++ b/scripts/file.mjs @@ -17,6 +17,7 @@ export async function exist(file) { export async function createDir(file, root) { const dir = getRealPath(file, root) + if (!(await exist(dir))) { await mkdir(dir) }