name: Nightly Release on: schedule: # Run every day at 01:00 UTC - cron: "0 1 * * *" 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:c0154e992adb791c3b848dd008939d19862549204f8cb26f5ca7a00f629e6067 jobs: # check if there were commits yesterday check_commits: runs-on: ubuntu-latest outputs: has_commits: ${{ steps.check_commits.outputs.has_commits }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch full history to check previous commits ref: "main" - name: Check for commits from yesterday id: check_commits run: | # Get yesterday's date in YYYY-MM-DD format YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) echo "Checking for commits from: $YESTERDAY" # Check if there were any commits yesterday COMMIT_COUNT=$(git log --oneline --since="$YESTERDAY 00:00:00" --until="$YESTERDAY 23:59:59" | wc -l) echo "Found $COMMIT_COUNT commits from yesterday" if [ $COMMIT_COUNT -gt 0 ]; then echo "has_commits=true" >> $GITHUB_OUTPUT echo "✅ Found $COMMIT_COUNT commits from yesterday - continuing workflow" else echo "has_commits=false" >> $GITHUB_OUTPUT echo "❌ No commits found from yesterday - skipping remaining steps" echo "::notice::❌ No commits found from yesterday - skipping remaining steps" fi build: # github actions matrix jobs don't support multiple outputs # ugly workaround from https://github.com/orgs/community/discussions/17245#discussioncomment-11222880 if: ${{ needs.check_commits.outputs.has_commits == 'true' }} outputs: resolc-x86_64-unknown-linux-musl_url: ${{ steps.set-output.outputs.resolc-x86_64-unknown-linux-musl_url }} resolc-x86_64-unknown-linux-musl_sha: ${{ steps.set-output.outputs.resolc-x86_64-unknown-linux-musl_sha }} resolc-aarch64-apple-darwin_url: ${{ steps.set-output.outputs.resolc-aarch64-apple-darwin_url }} resolc-aarch64-apple-darwin_sha: ${{ steps.set-output.outputs.resolc-aarch64-apple-darwin_sha }} resolc-x86_64-apple-darwin_url: ${{ steps.set-output.outputs.resolc-x86_64-apple-darwin_url }} resolc-x86_64-apple-darwin_sha: ${{ steps.set-output.outputs.resolc-x86_64-apple-darwin_sha }} resolc-x86_64-pc-windows-msvc_url: ${{ steps.set-output.outputs.resolc-x86_64-pc-windows-msvc_url }} resolc-x86_64-pc-windows-msvc_sha: ${{ steps.set-output.outputs.resolc-x86_64-pc-windows-msvc_sha }} strategy: matrix: target: [ x86_64-unknown-linux-musl, aarch64-apple-darwin, x86_64-apple-darwin, x86_64-pc-windows-msvc, ] 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 - target: x86_64-pc-windows-msvc type: native runner: windows-2022 runs-on: ${{ matrix.runner }} needs: [check_commits] 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' }} shell: bash run: | export LLVM_SYS_181_PREFIX=$PWD/llvm-${{ matrix.target }} make install-bin mv target/release/resolc resolc-${{ matrix.target }} || mv target/release/resolc.exe resolc-${{ matrix.target }}.exe - 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 shell: bash run: | result=$(./resolc-${{ matrix.target }} --bin crates/integration/contracts/flipper.sol) echo $result if [[ $result == *'0x50564d'* ]]; then exit 0; else exit 1; fi - name: Upload artifacts (nightly) uses: actions/upload-artifact@v4 id: artifact-upload-step with: name: resolc-${{ matrix.target }} path: resolc-${{ matrix.target }}* retention-days: 40 - name: Set output variables (nightly) id: set-output shell: bash run: | echo "Artifact URL is ${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "Artifact SHA is ${{ steps.artifact-upload-step.outputs.artifact-digest }}" echo "resolc-${{ matrix.target }}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "resolc-${{ matrix.target }}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" >> "$GITHUB_OUTPUT" echo "resolc-${{ matrix.target }}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}" echo "resolc-${{ matrix.target }}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}" >> "$GITHUB_OUTPUT" build-wasm: runs-on: ubuntu-24.04 needs: [check_commits] if: ${{ needs.check_commits.outputs.has_commits == 'true' }} outputs: resolc-web.js_url: ${{ steps.set-output.outputs.resolc_web_js_url }} resolc-web.js_sha: ${{ steps.set-output.outputs.resolc_web_js_sha }} env: RELEASE_RESOLC_WASM_URI: https://github.com/paritytech/revive/releases/download/${{ github.ref_name }}/resolc.wasm 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.30/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: | mkdir -p resolc-wasm32-unknown-emscripten mv ./target/wasm32-unknown-emscripten/release/resolc.js ./resolc-wasm32-unknown-emscripten/ mv ./target/wasm32-unknown-emscripten/release/resolc.wasm ./resolc-wasm32-unknown-emscripten/ mv ./target/wasm32-unknown-emscripten/release/resolc_web.js ./resolc-wasm32-unknown-emscripten/ # 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 night builds for resolc-bin repo # https://github.com/actions/upload-artifact/issues/331 - name: Upload artifact resolc.js (nightly) uses: actions/upload-artifact@v4 with: name: resolc.js path: resolc-wasm32-unknown-emscripten/resolc.js retention-days: 40 - name: Upload artifacts resolc.wasm (nightly) uses: actions/upload-artifact@v4 with: name: resolc.wasm path: resolc-wasm32-unknown-emscripten/resolc.wasm retention-days: 40 - name: Upload artifacts resolc_web.js (nightly) uses: actions/upload-artifact@v4 id: artifact-upload-step with: name: resolc_web.js path: resolc-wasm32-unknown-emscripten/resolc_web.js retention-days: 40 - name: Set output variables id: set-output env: TARGET: resolc_web_js run: | echo "Artifact URL is ${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "Artifact SHA is ${{ steps.artifact-upload-step.outputs.artifact-digest }}" echo "${TARGET}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "${TARGET}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" >> "$GITHUB_OUTPUT" echo "${TARGET}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}"" echo "${TARGET}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}"" >> "$GITHUB_OUTPUT" create-macos-fat-binary: if: ${{ needs.check_commits.outputs.has_commits == 'true' }} needs: [build] outputs: resolc-universal-apple-darwin_url: ${{ steps.set-output.outputs.resolc-universal-apple-darwin_url }} resolc-universal-apple-darwin_sha: ${{ steps.set-output.outputs.resolc-universal-apple-darwin_sha }} runs-on: macos-14 steps: - 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: Make Executable run: | chmod +x resolc-universal-apple-darwin - uses: actions/upload-artifact@v4 id: artifact-upload-step with: name: resolc-universal-apple-darwin path: resolc-universal-apple-darwin retention-days: 40 - name: Set output variables id: set-output env: TARGET: resolc-universal-apple-darwin run: | echo "Artifact URL is ${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "Artifact SHA is ${{ steps.artifact-upload-step.outputs.artifact-digest }}" echo "${TARGET}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" echo "${TARGET}_url=${{ steps.artifact-upload-step.outputs.artifact-url }}" >> "$GITHUB_OUTPUT" echo "${TARGET}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}"" echo "${TARGET}_sha=${{ steps.artifact-upload-step.outputs.artifact-digest }}"" >> "$GITHUB_OUTPUT" generate-nightly-json: runs-on: ubuntu-24.04 if: ${{ needs.check_commits.outputs.has_commits == 'true' }} environment: tags needs: [build-wasm, build, create-macos-fat-binary, check_commits] steps: - name: Checkout revive uses: actions/checkout@v4 with: path: revive - name: Checkout resolc-bin uses: actions/checkout@v4 with: repository: paritytech/resolc-bin path: resolc-bin - name: Download Artifacts uses: actions/download-artifact@v4 with: merge-multiple: true path: bins - uses: actions/create-github-app-token@v1 id: app-token with: app-id: ${{ secrets.REVIVE_JSON_APP_ID }} private-key: ${{ secrets.REVIVE_JSON_APP_KEY }} owner: paritytech repositories: resolc-bin - name: Generate JSON env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} TOKEN: ${{ steps.app-token.outputs.token }} APP_NAME: "paritytech-revive-json" Green: "\e[32m" NC: "\e[0m" run: | echo '[' > data.json echo '${{ toJSON(needs.build.outputs) }}' >> data.json echo ',' >> data.json echo '${{ toJSON(needs.build-wasm.outputs) }}' >> data.json echo ',' >> data.json echo '${{ toJSON(needs.create-macos-fat-binary.outputs) }}' >> data.json echo ']' >> data.json chmod +x bins/resolc-x86_64-unknown-linux-musl export FIRST_SOLC_VERSION=$(./bins/resolc-x86_64-unknown-linux-musl --supported-solc-versions | cut -f 1 -d "," | tr -d ">=") export LAST_SOLC_VERSION=$(./bins/resolc-x86_64-unknown-linux-musl --supported-solc-versions | cut -f 2 -d "," | tr -d "<=") export FILEPATH=$(readlink -f data.json) export TAG=$(cd revive;gh release list --json name,isLatest --jq '.[] | select(.isLatest)|.name') cd resolc-bin mkdir -p nightly cd nightly python3 ../../revive/.github/scripts/json_generator_nightly.py cd .. git status echo "${Green}Add new remote with gh app token${NC}" git remote set-url origin $(git config remote.origin.url | sed "s/github.com/${APP_NAME}:${TOKEN}@github.com/g") echo "${Green}Remove http section that causes issues with gh app auth token${NC}" sed -i.bak '/\[http/d' ./.git/config sed -i.bak '/extraheader/d' ./.git/config git config user.email "ci@parity.io" git config user.name "${APP_NAME}" git add nightly/ git commit -m "Update nightly json" git push origin main echo "::notice::nightly info.list files were successfully published to https://github.com/paritytech/resolc-bin"