Skip to content

chore: self mutations for all #7670

chore: self mutations for all

chore: self mutations for all #7670

Workflow file for this run

name: Build
on:
pull_request:
types:
- opened
- synchronize
paths-ignore:
- "docs/**"
- "logo/**"
- "*.md"
push:
branches:
- main
workflow_dispatch: {}
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref }}
cancel-in-progress: true
env:
RUST_VERSION: "1.67.1"
NODE_VERSION: "18.16.0"
NPM_VERSION: "8.19.3"
jobs:
build:
name: "Build"
timeout-minutes: 30
runs-on: ubuntu-latest
env:
CARGO_TERM_COLOR: always
outputs:
version: ${{ fromJson(steps.changelog.outputs.data).newVersion }}
last-version: ${{ fromJson(steps.changelog.outputs.data).lastVersion }}
changelog: ${{ fromJson(steps.changelog.outputs.data).changelog }}
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup NPM
run: npm install -g npm@${{ env.NPM_VERSION }}
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
targets: |
x86_64-unknown-linux-gnu
wasm32-wasi
components: rustfmt,clippy,rust-std
- name: Setup Cargo Cache
uses: Swatinem/rust-cache@v2
- name: Install Dependencies
uses: bahmutov/npm-install@v1
- name: Changelog Generation
id: changelog
env:
GENERATE_VERSION: ${{ github.event_name != 'push' || github.repository != 'winglang/wing' }}
run: npm run changelog
- name: Build
run: npm run build:ci
- name: Package
run: npm run package:ci
- name: Upload Wing CLI
uses: actions/upload-artifact@v3
with:
name: wing
path: apps/wing/*.tgz
- name: Upload Wing Console Server
uses: actions/upload-artifact@v3
with:
name: wingconsoleserver
path: apps/wing-console/console/server/*.tgz
- name: Upload Wing Console App
uses: actions/upload-artifact@v3
with:
name: wingconsoleapp
path: apps/wing-console/console/app/*.tgz
- name: Upload WingSDK
uses: actions/upload-artifact@v3
with:
name: wingsdk
path: libs/wingsdk/*.tgz
- name: Upload WingCompiler
uses: actions/upload-artifact@v3
with:
name: wingcompiler
path: libs/wingcompiler/*.tgz
- name: Upload WingC WASM
uses: actions/upload-artifact@v3
with:
name: wingc
path: target/wasm32-wasi/release/wingc.wasm
- name: Upload Extension
uses: actions/upload-artifact@v3
with:
name: vscode-wing
path: apps/vscode-wing/vscode-wing.vsix
- name: Compress Docs
run: tar -czvf docs.tgz docs/*
- name: Upload Docs
uses: actions/upload-artifact@v3
with:
name: docs
path: docs.tgz
- name: Publish Playground
if: ${{ github.event_name == 'push' && github.repository == 'winglang/wing' }}
uses: amondnet/[email protected]
with:
github-token: ${{ secrets.PROJEN_GITHUB_TOKEN }}
vercel-token: ${{ secrets.VERCEL_TOKEN_WING_PLAYGROUND }}
vercel-org-id: ${{ secrets.VERCEL_TEAM_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID_WING_PLAYGROUND }}
working-directory: apps/wing-playground/dist
github-comment: false
vercel-args: "--prod "
unit-tests:
name: "Unit Tests"
timeout-minutes: 30
runs-on: ubuntu-latest
env:
# Testing runs out of memory without this
NODE_OPTIONS: "--max-old-space-size=4096"
CARGO_TERM_COLOR: always
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 1
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup NPM
run: npm install -g npm@${{ env.NPM_VERSION }}
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
targets: |
x86_64-unknown-linux-gnu
wasm32-wasi
components: rustfmt,clippy,rust-std
- name: Setup Cargo Cache
uses: Swatinem/rust-cache@v2
- name: Install Dependencies
uses: bahmutov/npm-install@v1
- name: Test
run: npm run test:ci
- name: Create git patch
id: diff
if: github.event_name == 'pull_request'
run: |
git add --all
git diff --staged --patch > build.diff
if [ -s build.diff ]; then
echo "Diff found, creating a patch to apply later"
cat build.diff
echo "diff=true" >> $GITHUB_OUTPUT
fi
- name: Upload Diff
if: github.event_name == 'pull_request' && steps.diff.outputs.diff == 'true'
uses: actions/upload-artifact@v3
with:
name: build.diff
path: build.diff
- name: Fail with Diff
if: github.event_name == 'push' && steps.diff.outputs.diff == 'true'
run: |
echo "Diff found, please create a PR with an update"
exit 1
benchmarks:
name: E2E Benchmarks
runs-on: ubuntu-latest
needs:
- build
env:
HANGAR_WING_SPEC: "file:${{ github.workspace }}/wing/winglang-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCONSOLE_APP_SPEC: "file:${{ github.workspace }}/wingconsoleapp/wingconsole-app-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCONSOLE_SERVER_SPEC: "file:${{ github.workspace }}/wingconsoleserver/wingconsole-server-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCOMPILER_SPEC: "file:${{ github.workspace }}/wingcompiler/winglang-compiler-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGSDK_SPEC: "file:${{ github.workspace }}/wingsdk/winglang-sdk-${{ needs.build.outputs.version }}.tgz"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download Build Artifacts
uses: actions/download-artifact@v2
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup NPM
run: npm install -g npm@${{ env.NPM_VERSION }}
- name: Install Dependencies
uses: bahmutov/npm-install@v1
with:
working-directory: |
tools/hangar
examples/tests/valid
examples/tests/invalid
install-command: npm ci
- name: Run E2E Benchmarks
working-directory: tools/hangar
run: npm run bench
- name: Upload Report JSON
uses: actions/upload-artifact@v3
with:
name: benchmarks
path: tools/hangar/results/report.json
- name: Create Markdown report
run: node scripts/benchmark_json_to_table.mjs
e2e:
name: "E2E / ${{ matrix.runner }} + Node${{ matrix.node }} [${{ matrix.shard }}]"
needs:
- build
strategy:
fail-fast: true
matrix:
runner: [windows, macos, ubuntu]
node: ["18", "20"]
shard: ["1/2", "2/2"]
full_run:
# Do a full run on push or when the PR is labeled "pr/e2e-full"
- ${{ github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, '🧪 pr/e2e-full') }}
exclude:
- runner: macos
full_run: false
- runner: windows
full_run: false
- runner: ubuntu
node: "20"
full_run: false
runs-on: "${{ matrix.runner }}-latest"
env:
HANGAR_WING_SPEC: "file:${{ github.workspace }}/target/wing/winglang-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCONSOLE_APP_SPEC: "file:${{ github.workspace }}/target/wingconsoleapp/wingconsole-app-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCONSOLE_SERVER_SPEC: "file:${{ github.workspace }}/target/wingconsoleserver/wingconsole-server-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGCOMPILER_SPEC: "file:${{ github.workspace }}/target/wingcompiler/winglang-compiler-${{ needs.build.outputs.version }}.tgz"
HANGAR_WINGSDK_SPEC: "file:${{ github.workspace }}/target/wingsdk/winglang-sdk-${{ needs.build.outputs.version }}.tgz"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download Build Artifacts
uses: actions/download-artifact@v3
with:
path: target
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node }}
- name: Install Dependencies
uses: bahmutov/npm-install@v1
with:
working-directory: |
tools/hangar
examples/tests/valid
examples/tests/invalid
install-command: npm ci
- name: Run E2E Tests
working-directory: tools/hangar
run: |
npm run test:generate
npm run test -- --shard=${{ matrix.shard }} --update=${{ matrix.runner == 'ubuntu' && matrix.node == '18' }}
- name: Create mutation if needed
# we only care about the diff in our standard dev env
if: matrix.runner == 'ubuntu' && matrix.node == '18' && github.event_name == 'pull_request'
id: diff
env:
RAW_SHARD: ${{ matrix.shard }}
run: |
SHARD=$(echo $RAW_SHARD | sed 's/\//of/g')
DIFF_NAME="e2e-$SHARD.diff"
git add --all
git diff --staged --patch > $DIFF_NAME
if [ -s $DIFF_NAME ]; then
echo "diff=true" >> $GITHUB_OUTPUT
echo "diff_name=$DIFF_NAME" >> $GITHUB_OUTPUT
fi
- name: Fail with Diff
if: github.event_name == 'push' && matrix.runner == 'ubuntu' && matrix.node == '18' && steps.diff.outputs.diff == 'true'
run: |
echo "Diff found, please create a PR with an update"
exit 1
- name: Upload mutation
if: matrix.runner == 'ubuntu' && matrix.node == '18' && steps.diff.outputs.diff == 'true'
uses: actions/upload-artifact@v3
with:
name: ${{ steps.diff.outputs.diff_name }}
path: ${{ steps.diff.outputs.diff_name }}
quality-gate:
name: Quality Gate
runs-on: ubuntu-latest
needs:
- build
- e2e
- benchmarks
- unit-tests
steps:
- name: Download patches
uses: actions/download-artifact@v3
- name: Check patches
run: |
PATCH_COUNT=0
for f in $(find ./*.diff/*.diff); do
PATCH_COUNT=$((PATCH_COUNT + 1))
cat $f
done
if [ $PATCH_COUNT -gt 0 ]; then
echo "Found $PATCH_COUNT patches, build failed. A self-mutation should happen soon."
exit 1
fi
- name: All good
run: echo "Builds and tests passed! 🎉🎉🎉"
publish:
name: Publish
if: ${{ github.event_name == 'push' && github.repository == 'winglang/wing' }}
needs:
- quality-gate
- build
runs-on: ubuntu-latest
steps:
- name: Download Build Artifacts
uses: actions/download-artifact@v3
- name: Tag commit
uses: tvdias/[email protected]
if: ${{ needs.build.outputs.last-version != needs.build.outputs.version }}
with:
repo-token: "${{ secrets.PROJEN_GITHUB_TOKEN }}"
tag: "v${{ needs.build.outputs.version }}"
- name: Check published VSCode Version
id: vscode-version
run: echo "version=$(npx -y vsce show Monada.vscode-wing --json | jq '.versions[0].version' -r)" >> $GITHUB_OUTPUT
- name: Publish Extension to Visual Studio Marketplace
if: ${{ steps.vscode-version.outputs.version != needs.build.outputs.version }}
uses: "HaaLeo/publish-vscode-extension@v1"
with:
pat: ${{ secrets.VS_MARKETPLACE_TOKEN }}
registryUrl: "https://marketplace.visualstudio.com"
extensionFile: "vscode-wing/vscode-wing.vsix"
- name: Login to NPM registry
run: npm set //registry.npmjs.org/:_authToken ${{ secrets.NPM_PUBLISH_TOKEN }}
- name: Check published WingSDK version
id: wingsdk-version
run: echo "version=$(npm view @winglang/sdk version)" >> $GITHUB_OUTPUT
- name: Publish Wing SDK
if: ${{ steps.wingsdk-version.outputs.version != needs.build.outputs.version }}
working-directory: wingsdk
run: npm publish *.tgz --access public
- name: Check published Wing Compiler version
id: wingcompiler-version
run: echo "version=$(npm view @winglang/compiler version)" >> $GITHUB_OUTPUT
- name: Publish Wing Compiler
if: ${{ steps.wingcompiler-version.outputs.version != needs.build.outputs.version }}
working-directory: wingcompiler
run: npm publish *.tgz --access public
- name: Check published Wing Console Server version
id: wingconsoleserver-version
run: echo "version=$(npm view @wingconsole/server version)" >> $GITHUB_OUTPUT
- name: Publish Wing Console Server
if: ${{ steps.wingconsoleserver-version.outputs.version != needs.build.outputs.version }}
working-directory: wingconsoleserver
run: npm publish *.tgz --access public
- name: Check published Wing Console App version
id: wingconsoleapp-version
run: echo "version=$(npm view @wingconsole/app version)" >> $GITHUB_OUTPUT
- name: Publish Wing Console App
if: ${{ steps.wingconsoleapp-version.outputs.version != needs.build.outputs.version }}
working-directory: wingconsoleapp
run: npm publish *.tgz --access public
- name: Check published Wing version
id: wing-version
run: echo "version=$(npm view winglang version)" >> $GITHUB_OUTPUT
- name: Publish Wing
if: ${{ steps.wing-version.outputs.version != needs.build.outputs.version }}
working-directory: wing
run: npm publish *.tgz --access public
- name: Rename Docs
run: mv docs "docs-${{ needs.build.outputs.version }}.tgz"
- name: Write Changelog
uses: DamianReeves/[email protected]
with:
path: "CHANGELOG.md"
contents: ${{ needs.build.outputs.changelog }}
write-mode: overwrite
- name: Compute Checksums
run: |
mkdir dist
mv ./*/*.vsix ./dist
mv ./*/*.tgz ./dist
mv ./*/*.wasm ./dist
mv ./benchmarks/* ./dist
cd dist
echo '' >> ../CHANGELOG.md
echo '### SHA-1 Checksums' >> ../CHANGELOG.md
echo '```' >> ../CHANGELOG.md
sha1sum --binary * >> ../CHANGELOG.md
echo '```' >> ../CHANGELOG.md
cat ../CHANGELOG.md
- name: Cut Development Release
uses: softprops/action-gh-release@v1
with:
name: "Wing ${{ needs.build.outputs.version }}"
tag_name: "v${{ needs.build.outputs.version }}"
body_path: CHANGELOG.md
files: dist/*
token: ${{ secrets.PROJEN_GITHUB_TOKEN }}