name: Release on: push: branches: ["main"] pull_request: branches: ["main"] types: [opened, synchronize, labled, unlabled] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: CARGO_TERM_COLOR: always RUST_MUSL_CROSS_IMAGE: messense/rust-musl-cross@sha256:68b86bc7cb2867259e6b233415a665ff4469c28b57763e78c3bfea1c68091561 jobs: check-version-changed: if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'release-test') runs-on: ubuntu-24.04 permissions: contents: write outputs: TAG: ${{ steps.versions.outputs.TAG }} PKG_VER: ${{ steps.versions.outputs.PKG_VER }} RELEASE_NOTES: ${{ steps.versions.outputs.RELEASE_NOTES }} steps: - uses: actions/checkout@v4 with: fetch-tags: true - name: Check Versions id: versions run: | export CURRENT_TAG=$(git describe --tags --abbrev=0 --exclude "llvm-*") export PKG_VER=v$(cat Cargo.toml | grep -A 5 package] | grep version | cut -d '=' -f 2 | tr -d '"' | tr -d " ") echo "Current tag $CURRENT_TAG" echo "Package version $PKG_VER" # echo "PKG_VER=$PKG_VER" >> $GITHUB_OUTPUT if [[ $CURRENT_TAG == $PKG_VER ]]; then echo "Tag is up to date. Nothing to do."; export TAG=old; else echo "Tag was updated."; export TAG=new; fi echo "TAG=$TAG" >> $GITHUB_OUTPUT # Generating release notes early, in order to avoid checkout at the last step export RELEASE_NOTES="$(sed '/^## '${PKG_VER}'/,/^## v/!d' CHANGELOG.md | sed -e '1d' -e '$d')" echo "Release notes:" echo "$RELEASE_NOTES" echo 'RELEASE_NOTES<> $GITHUB_OUTPUT echo "$RELEASE_NOTES" >> $GITHUB_OUTPUT echo 'EOF' >> $GITHUB_OUTPUT build: strategy: matrix: target: [x86_64-unknown-linux-musl, aarch64-apple-darwin, x86_64-apple-darwin] include: - target: x86_64-unknown-linux-musl type: musl runner: ubuntu-24.04 - target: aarch64-apple-darwin type: native runner: macos-14 - target: x86_64-apple-darwin type: native runner: macos-13 if: ${{ needs.check-version-changed.outputs.TAG == 'new' }} runs-on: ${{ matrix.runner }} needs: [check-version-changed] steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 with: # without this it will override our rust flags rustflags: "" cache-key: ${{ matrix.target }} - name: Download LLVM uses: ./.github/actions/get-llvm with: target: ${{ matrix.target }} - name: Build if: ${{ matrix.type == 'native' }} run: | export LLVM_SYS_181_PREFIX=$PWD/llvm-${{ matrix.target }} make install-bin mv target/release/resolc resolc-${{ matrix.target }} - name: Build if: ${{ matrix.type == 'musl' }} run: | docker run -v $PWD:/opt/revive $RUST_MUSL_CROSS_IMAGE /bin/bash -c " cd /opt/revive chown -R root:root . apt update && apt upgrade -y && apt install -y pkg-config export LLVM_SYS_181_PREFIX=/opt/revive/llvm-${{ matrix.target }} make install-bin mv target/${{ matrix.target }}/release/resolc resolc-${{ matrix.target }} " sudo chown -R $(id -u):$(id -g) . - name: Install Solc uses: ./.github/actions/get-solc - name: Basic Sanity Check run: | result=$(./resolc-${{ matrix.target }} --bin crates/integration/contracts/flipper.sol) echo $result if [[ $result == *'0x50564d'* ]]; then exit 0; else exit 1; fi - uses: actions/upload-artifact@v4 with: name: resolc-${{ matrix.target }} path: resolc-${{ matrix.target }} retention-days: 1 build-wasm: if: ${{ needs.check-version-changed.outputs.TAG == 'new' }} runs-on: ubuntu-24.04 needs: [check-version-changed] steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 with: target: wasm32-unknown-emscripten # without this it will override our rust flags rustflags: "" - name: Download Host LLVM uses: ./.github/actions/get-llvm with: target: x86_64-unknown-linux-gnu - name: Download Wasm LLVM uses: ./.github/actions/get-llvm with: target: wasm32-unknown-emscripten - name: Download EMSDK uses: ./.github/actions/get-emsdk - name: Build run: | export LLVM_SYS_181_PREFIX=$PWD/llvm-x86_64-unknown-linux-gnu export REVIVE_LLVM_TARGET_PREFIX=$PWD/llvm-wasm32-unknown-emscripten source emsdk/emsdk_env.sh make install-wasm chmod -x ./target/wasm32-unknown-emscripten/release/resolc.wasm - name: Set Up Node.js uses: actions/setup-node@v3 with: node-version: "20" - name: Basic Sanity Check run: | mkdir -p solc curl -sSLo solc/soljson.js https://github.com/ethereum/solidity/releases/download/v0.8.28/soljson.js node -e " const soljson = require('solc/soljson'); const createRevive = require('./target/wasm32-unknown-emscripten/release/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 } } }; compiler.writeToStdin(JSON.stringify(standardJsonInput)); compiler.callMain(['--standard-json']); // Collect output 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: Compress Artifact run: | tar -czf $(pwd)/resolc-wasm32-unknown-emscripten.tar.gz -C ./target/wasm32-unknown-emscripten/release/ \ resolc.js \ resolc.wasm \ resolc_web.js - uses: actions/upload-artifact@v4 with: name: resolc-wasm32-unknown-emscripten.tar.gz path: resolc-wasm32-unknown-emscripten.tar.gz retention-days: 1 create-release: if: github.event_name != 'pull_request' needs: [check-version-changed, build-wasm] runs-on: macos-14 permissions: contents: write steps: - name: Download Artifacts uses: actions/download-artifact@v4 with: merge-multiple: true - name: Create macOS Fat Binary run: | lipo resolc-aarch64-apple-darwin resolc-x86_64-apple-darwin -create -output resolc-universal-apple-darwin - name: Compress Artifacts run: | chmod +x resolc-x86_64-unknown-linux-musl chmod +x resolc-universal-apple-darwin tar -czf resolc-x86_64-unknown-linux-musl.tar.gz resolc-x86_64-unknown-linux-musl tar -czf resolc-universal-apple-darwin.tar.gz resolc-universal-apple-darwin - name: create-release uses: softprops/action-gh-release@v2 with: body: | ${{ needs.tag.outputs.RELEASE_NOTES }} # Note for macOS Users The macOS binary is unsigned and it needs to be made runnable using `xattr -c resolc-macos`. tag_name: ${{ needs.check-version-changed.outputs.PKG_VER }} name: ${{ needs.check-version-changed.outputs.PKG_VER }} draft: true target_commitish: ${{ github.sha }} files: | resolc-x86_64-unknown-linux-musl.tar.gz resolc-universal-apple-darwin.tar.gz resolc-wasm32-unknown-emscripten.tar.gz