Files
revive/.github/workflows/reusable-build-wasm.yml
T
LJ 11e2ea1be4 Fix Wasm build cache collision (#544)
## Description

Before the CI refactor, the Wasm builds initiated by `release.yml` and
`test-wasm.yml` ran in parallel, building duplicate builds. After the CI
refactor, those workflows shared the build cache key to instead reuse
the build. In both cases, the resolc Wasm URI baked into `resolc_web.js`
depends on whether it is a release or not.

If the Wasm build step initiated by `release.yml` started *before*
`test-wasm.yml`, `test-wasm.yml` would use an incorrect cache due to the
invalid resolc Wasm URI (seen by [this failed
run](https://github.com/paritytech/revive/actions/runs/27178950108/job/80235255116?pr=529)).

This PR updates the workflow input `is_release` to only pertain to ref
names starting with `v` (which is what the `create-release` step guards
on), and updates the cache key and concurrency group to include
`is_release`, solving the cache collision. (Thus, the workflows needing
a Wasm build for non-v-releases will still reuse the now-correct cache.)
2026-06-10 10:06:43 +02:00

182 lines
6.7 KiB
YAML

name: Reusable Build — Wasm
on:
workflow_call:
inputs:
is_release:
description: "Whether this is a release build"
required: true
type: boolean
retention_days:
description: "Artifact retention days"
required: false
type: number
default: 1
outputs:
resolc_web_js_url:
value: ${{ jobs.build.outputs.resolc_web_js_url }}
resolc_web_js_sha:
value: ${{ jobs.build.outputs.resolc_web_js_sha }}
env:
CARGO_TERM_COLOR: always
EMSCRIPTEN_TARGET: wasm32-unknown-emscripten
HOST_TARGET: x86_64-unknown-linux-gnu
jobs:
build:
name: Build Wasm
runs-on: ubuntu-24.04
outputs:
resolc_web_js_url: ${{ steps.upload-web-js.outputs.artifact-url }}
resolc_web_js_sha: ${{ steps.upload-web-js.outputs.artifact-digest }}
concurrency:
# Use `reusable-build` and not `${{ github.workflow }}` here so that callers share the same concurrency group.
group: reusable-build-wasm32-unknown-emscripten-is-release-${{ inputs.is_release }}-${{ github.sha }}
cancel-in-progress: false
steps:
- name: Checkout revive
uses: actions/checkout@v6
- name: Check Build Cache
id: cache
uses: actions/cache@v5
with:
path: resolc-${{ env.EMSCRIPTEN_TARGET }}
key: build-${{ env.EMSCRIPTEN_TARGET }}-is-release-${{ inputs.is_release }}-${{ github.sha }}
- name: Set Up Rust Toolchain
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
# Pin to 1.92.0 until LLVM Wasm libraries are rebuilt with -fwasm-exceptions
# See: https://github.com/paritytech/revive/pull/463
toolchain: "1.92.0"
target: ${{ env.EMSCRIPTEN_TARGET }}
rustflags: ""
- name: Download Host LLVM
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
uses: ./.github/actions/get-llvm
with:
target: ${{ env.HOST_TARGET }}
- name: Download Wasm LLVM
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
uses: ./.github/actions/get-llvm
with:
target: ${{ env.EMSCRIPTEN_TARGET }}
- name: Download EMSDK
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
uses: ./.github/actions/get-emsdk
- name: Build
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
env:
# Consumed by js/emscripten/build.js.
# For nightly Wasm releases, this URI is currently broken (see https://github.com/paritytech/revive/issues/542).
RELEASE_RESOLC_WASM_URI: ${{ inputs.is_release && format('https://github.com/paritytech/revive/releases/download/{0}/resolc.wasm', github.ref_name) || '' }}
run: |
export LLVM_SYS_221_PREFIX=$PWD/llvm-${{ env.HOST_TARGET }}
export REVIVE_LLVM_TARGET_PREFIX=$PWD/llvm-${{ env.EMSCRIPTEN_TARGET }}
source emsdk/emsdk_env.sh
make install-wasm
chmod -x ./target/${{ env.EMSCRIPTEN_TARGET }}/release/resolc.wasm
- name: Move Artifacts
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
run: |
mkdir -p resolc-${{ env.EMSCRIPTEN_TARGET }}
mv ./target/${{ env.EMSCRIPTEN_TARGET }}/release/resolc.js ./resolc-${{ env.EMSCRIPTEN_TARGET }}/
mv ./target/${{ env.EMSCRIPTEN_TARGET }}/release/resolc.wasm ./resolc-${{ env.EMSCRIPTEN_TARGET }}/
mv ./target/${{ env.EMSCRIPTEN_TARGET }}/release/resolc_web.js ./resolc-${{ env.EMSCRIPTEN_TARGET }}/
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: "24"
- name: Basic Sanity Check
run: |
mkdir -p solc
curl -sSLo solc/soljson.js https://github.com/argotorg/solidity/releases/download/v0.8.35/soljson.js
node -e "
// Make sure to require './solc/soljson' and not 'solc/soljson' in order to use
// the explicitly downloaded solc, rather than resolving an npm package potentially
// installed in prior workflow steps.
const soljson = require('./solc/soljson');
const createRevive = require('./resolc-${{ env.EMSCRIPTEN_TARGET }}/resolc.js');
const compiler = createRevive();
compiler.soljson = soljson;
const standardJsonInput =
{
language: 'Solidity',
sources: {
'MyContract.sol': {
content: 'pragma solidity ^0.8.0; contract MyContract { function greet() public pure returns (string memory) { return \'Hello\'; } }',
},
},
settings: {
optimizer: { enabled: false },
outputSelection: {
'*': {
'*': ['evm.bytecode']
}
}
}
};
compiler.writeToStdin(JSON.stringify(standardJsonInput));
compiler.callMain(['--standard-json']);
const stdout = compiler.readFromStdout();
const stderr = compiler.readFromStderr();
if (stderr) { console.error(stderr); process.exit(1); }
let out = JSON.parse(stdout);
let bytecode = out.contracts['MyContract.sol']['MyContract'].evm.bytecode.object
console.log(bytecode);
if(!bytecode.startsWith('50564d')) { process.exit(1); }
"
- name: Upload Bundle Artifact (Release)
if: ${{ inputs.is_release }}
uses: actions/upload-artifact@v6
with:
name: resolc-${{ env.EMSCRIPTEN_TARGET }}
path: resolc-${{ env.EMSCRIPTEN_TARGET }}/*
retention-days: ${{ inputs.retention_days }}
# There is no way to upload several files as several artifacts with a single upload-artifact step.
# It's needed to have resolc_web.js separately for nightly builds for resolc-bin repo.
# https://github.com/actions/upload-artifact/issues/331
- name: Upload resolc.js (Nightly)
if: ${{ !inputs.is_release }}
uses: actions/upload-artifact@v6
with:
name: resolc.js
path: resolc-${{ env.EMSCRIPTEN_TARGET }}/resolc.js
retention-days: ${{ inputs.retention_days }}
- name: Upload resolc.wasm (Nightly)
if: ${{ !inputs.is_release }}
uses: actions/upload-artifact@v6
with:
name: resolc.wasm
path: resolc-${{ env.EMSCRIPTEN_TARGET }}/resolc.wasm
retention-days: ${{ inputs.retention_days }}
- name: Upload resolc_web.js (Nightly)
if: ${{ !inputs.is_release }}
id: upload-web-js
uses: actions/upload-artifact@v6
with:
name: resolc_web.js
path: resolc-${{ env.EMSCRIPTEN_TARGET }}/resolc_web.js
retention-days: ${{ inputs.retention_days }}