Skip to content

Commit

Permalink
chore(js): setup release flow (#608)
Browse files Browse the repository at this point in the history
  • Loading branch information
osipov-mit authored Nov 27, 2024
1 parent 9259280 commit 2ef5701
Show file tree
Hide file tree
Showing 13 changed files with 213 additions and 151 deletions.
100 changes: 0 additions & 100 deletions .github/workflows/ci-js.yml

This file was deleted.

49 changes: 49 additions & 0 deletions .github/workflows/js-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: '[js] CI'

on:
pull_request:
types: [opened, synchronize, reopened, labeled]
branches: [master]
paths:
- 'js/**'
- 'package.json'

jobs:
test:
runs-on: ubuntu-22.04
steps:
- name: Cancel previous workflow runs
uses: styfle/cancel-workflow-action@0.12.1
with:
access_token: ${{ github.token }}

- name: Checkout
uses: actions/checkout@v4

- name: 'Install: NodeJS 20.x'
uses: actions/setup-node@v4
with:
node-version: 20.x

- name: 'Install: dependencies'
run: yarn install

- name: 'Prepare: build all'
run: yarn build

- name: 'Prepare: fmt'
run: yarn lint

- name: 'Prepare: download Gear node'
run: |
wget -O ./gear https://github.com/gear-tech/gear/releases/download/build/gear
chmod +x gear
- name: 'Prepare: run Gear node'
run: nohup ./gear --dev --execution=wasm --tmp --unsafe-rpc-external --rpc-methods Unsafe --rpc-cors all &

- name: 'Prepare: sleep 3 min'
run: sleep 180

- name: 'Test: run'
run: yarn test
80 changes: 80 additions & 0 deletions .github/workflows/js-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: '[js] Release'

on:
push:
branches:
- master
paths:
- package.json

jobs:
release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: 'Setup NodeJS 20.x'
uses: actions/setup-node@v4
with:
node-version: 20.x

- name: 'Get info'
id: info
run: |
VERSION=$(jq -r '.version' package.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "tag_name=js/v$VERSION" >> $GITHUB_OUTPUT
PREVIOUS_VERSION=$(npm show @js/package version)
echo "prev_version=$PREVIOUS_VERSION" >> $GITHUB_OUTPUT
- name: 'Compare versions'
id: release
run: |
if [ ${{ steps.info.outputs.version }} == ${{ steps.info.outputs.prev_version }} ]; then
echo "No new version to release"
echo "skip=true" >> $GITHUB_OUTPUT
else
echo "New version to release"
echo "skip=false" >> $GITHUB_OUTPUT
fi
- name: 'Get release notes'
id: release_notes
if: steps.release.outputs.skip != 'true'
run: |
awk '/## ${{ steps.info.outputs.version }}/{flag=1;next}/---/{flag=0} flag' ./js/CHANGELOG.md >> release_notes.txt
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
cat release_notes.txt >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
rm release_notes.txt
- name: 'Prepare: install dependencies and build pkgs'
if: steps.release.outputs.skip != 'true'
run: |
yarn install
yarn build
- name: 'Create new tag'
if: steps.release.outputs.skip != 'true'
run: |
git tag ${{ steps.info.outputs.tag_name }}
git push origin ${{ steps.info.outputs.tag_name }}
- name: 'Create Release'
if: steps.release.outputs.skip != 'true'
uses: softprops/action-gh-release@v2
with:
body: ${{ steps.release_notes.outputs.release_notes }}
tag_name: ${{ steps.info.outputs.tag_name }}
name: 'Sails-JS v${{ steps.info.outputs.version }}'

- name: 'Publish to npm registry'
if: steps.release.outputs.skip != 'true'
run: |
export token=$(printenv npm_token)
echo "//registry.npmjs.org/:_authToken=$token" > .npmrc
npx lerna publish from-package --yes --no-private
env:
npm_token: ${{ secrets.NPM_TOKEN }}
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ net/**/*.trx
node_modules/
js/**/lib/
js/cli/build/
js/parser/parser.wasm
js/test/demo/
.pnp.*
.yarn/*
Expand Down
9 changes: 9 additions & 0 deletions js/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# CHANGELOG

## 0.3.1 (draft)

### Compatibility
- Sails-RS v0.6.3

### Changes
- Setup automated releases in https://github.com/gear-tech/sails/pull/608
2 changes: 1 addition & 1 deletion js/cli/src/generate/types-gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class TypesGenerator extends BaseGenerator {
}

public generate() {
this._out.line('declare global {').increaseIndent();
this._out.line('declare global {', false).increaseIndent();
for (const { name, def, docs } of this._program.types) {
this._out.lines(formatDocs(docs), false);

Expand Down
3 changes: 3 additions & 0 deletions js/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"sails-rs": "0.6.3"
}
70 changes: 30 additions & 40 deletions js/parser/rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
import { writeFileSync, readFileSync, existsSync, rmSync } from 'fs';
import { execSync } from 'child_process';
import { writeFileSync, rmSync } from 'fs';
import commonjs from '@rollup/plugin-commonjs';
import typescript from 'rollup-plugin-typescript2';
import config from '../config.json' assert { type: 'json' };

function checkParserFile() {
return {
name: 'check-parser-file',
buildStart() {
if (!existsSync('./parser.wasm')) {
throw new Error('parser.wasm file not found');
}
},
};
async function getStreamFromRelease(version, cs) {
const link = `https://github.com/gear-tech/sails/releases/download/rs%2Fv${version}/sails_idl_parser.wasm`;
const res = await fetch(link);

if (!res.ok) {
throw new Error(`Failed to fetch parser from ${link}`);
}

return res.body.pipeThrough(cs);
}

function compressParser(type) {
return {
name: 'compress-parser',
async closeBundle() {
const buf = readFileSync('./parser.wasm');
async function getBase64Parser(version) {
const cs = new CompressionStream('gzip');

const cs = new CompressionStream('gzip');
const stream = await getStreamFromRelease(version, cs);

const compressedReadableStream = new Response(buf).body.pipeThrough(cs);
const reader = stream.getReader();

const reader = compressedReadableStream.getReader();
let resultArr = [];

let resultArr = [];
while (true) {
const read = await reader.read();

while (true) {
const read = await reader.read();
if (read.done) break;

if (read.done) break;
resultArr = resultArr.concat(Array.from(read.value));
}

resultArr = resultArr.concat(Array.from(read.value));
}
return Buffer.from(Uint8Array.from(resultArr).buffer).toString('base64');
}

const base64Bytes = Buffer.from(Uint8Array.from(resultArr).buffer).toString('base64');
function writeCompressedWasmParser(type) {
return {
name: 'write-wasm-parser',
async closeBundle() {
const base64Bytes = await getBase64Parser(config['sails-rs']);

if (type === 'cjs') {
writeFileSync(
Expand All @@ -59,16 +61,6 @@ function cleanOldBuild() {
};
}

function buildParserWasm() {
return {
name: 'build-parser-wasm',
buildStart() {
execSync('cargo build -p sails-idl-parser --target=wasm32-unknown-unknown --release');
execSync('wasm-opt -O4 -o ./parser.wasm ../../target/wasm32-unknown-unknown/release/sails_idl_parser.wasm');
},
};
}

export default [
{
input: 'src/index.ts',
Expand All @@ -81,13 +73,11 @@ export default [
},
],
plugins: [
buildParserWasm(),
checkParserFile(),
cleanOldBuild(),
typescript({
tsconfig: 'tsconfig.build.json',
}),
compressParser('es'),
writeCompressedWasmParser('es'),
],
},
{
Expand All @@ -107,7 +97,7 @@ export default [
tsconfig: 'tsconfig.cjs.json',
}),
commonjs(),
compressParser('cjs'),
writeCompressedWasmParser('cjs'),
],
},
];
5 changes: 5 additions & 0 deletions js/scripts/build-parser.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
echo "[*] Building parser wasm"
cargo build -p sails-idl-parser --target=wasm32-unknown-unknown --release
echo "[*] Optimizing parser wasm"
wasm-opt -O4 -o ./js/parser/parser.wasm ./target/wasm32-unknown-unknown/release/sails_idl_parser.wasm
ls -l ./js/parser/parser.wasm
9 changes: 9 additions & 0 deletions js/scripts/bump-versions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version=$1

echo "Bumping versions to $version"

pkgs=("package.json" "./js/package.json" "./js/cli/package.json" "./js/parser/package.json" "./js/types/package.json" "./js/util/package.json")

for pkg in ${pkgs[@]}; do
jq ".version = \"$version\"" $pkg > tmp.$$.json && mv tmp.$$.json $pkg
done
2 changes: 1 addition & 1 deletion js/test/demo.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ let charlieRaw: HexString;
let code: Buffer;
let codeId: HexString;

const DEMO_WASM_PATH = '../target/wasm32-unknown-unknown/release/demo.opt.wasm';
const DEMO_WASM_PATH = 'test/demo/demo.wasm';

beforeAll(async () => {
const parser = await SailsIdlParser.new();
Expand Down
Loading

0 comments on commit 2ef5701

Please sign in to comment.