fix(ci): use artifacts with different names #128
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Forge CI | |
on: | |
merge_group: | |
pull_request: | |
push: | |
branches: | |
- main | |
- release/** | |
tags: | |
- "*" | |
jobs: | |
setup: | |
# A full job can be used as a reusable workflow but not a step. | |
uses: ./.github/workflows/reusable-foundry-setup.yml | |
with: | |
# The below line does not accept environment variables, | |
# so it becomes the single source of truth for the version. | |
foundry-version: nightly | |
build: | |
runs-on: ubuntu-latest | |
needs: setup | |
# Takes about 3 minutes | |
timeout-minutes: 15 | |
outputs: | |
# The cache-key only contains the version name. It is only used so that the name does not | |
# need to be repeated everywhere; instead setting the `foundry-version` above suffices. | |
cache-key: ${{ needs.setup.outputs.cache-key }} | |
# Github's cache actions are a bit weird to deal with. It wouldn't let me restore the | |
# binaries to /usr/bin, so I restored them to the original location and added it to PATH. | |
# This output will let us carry it to other jobs. | |
installation-dir: ${{ needs.setup.outputs.installation-dir }} | |
steps: | |
- name: Restore cached Foundry toolchain | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ needs.setup.outputs.installation-dir }} | |
key: ${{ needs.setup.outputs.cache-key }} | |
- name: Add Foundry to PATH | |
run: echo "${{ needs.setup.outputs.installation-dir }}" >> "$GITHUB_PATH" | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Build | |
run: forge build | |
- name: Cache build artifacts | |
uses: actions/cache/save@v3 | |
with: | |
path: | | |
./lib | |
./out | |
./cache | |
./broadcast | |
key: build-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} | |
test: | |
runs-on: ubuntu-latest | |
needs: build | |
# No more than a few minutes | |
timeout-minutes: 5 | |
steps: | |
- name: Restore cached Foundry toolchain | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ needs.build.outputs.installation-dir }} | |
key: ${{ needs.build.outputs.cache-key }} | |
- name: Add Foundry to PATH | |
run: echo "${{ needs.build.outputs.installation-dir }}" >> "$GITHUB_PATH" | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Restore build artifacts | |
uses: actions/cache/restore@v3 | |
with: | |
path: | | |
./lib | |
./out | |
./cache | |
./broadcast | |
key: build-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} | |
- name: Test | |
run: forge test -vvv | |
- name: Set test snapshot as summary | |
run: NO_COLOR=1 forge snapshot >> $GITHUB_STEP_SUMMARY | |
format: | |
runs-on: ubuntu-latest | |
needs: build | |
# No more than a few minutes | |
timeout-minutes: 5 | |
steps: | |
- name: Restore cached Foundry toolchain | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ needs.build.outputs.installation-dir }} | |
key: ${{ needs.build.outputs.cache-key }} | |
- name: Add Foundry to PATH | |
run: echo "${{ needs.build.outputs.installation-dir }}" >> "$GITHUB_PATH" | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Restore build artifacts | |
uses: actions/cache/restore@v3 | |
with: | |
path: | | |
./lib | |
./out | |
./cache | |
./broadcast | |
key: build-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} | |
- name: Check formatting | |
run: forge fmt --check | |
extract-base-storage-layout-exocore-gateway: | |
runs-on: ubuntu-latest | |
needs: build | |
# A few minutes | |
timeout-minutes: 10 | |
steps: | |
- name: Restore cached Foundry toolchain | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ needs.build.outputs.installation-dir }} | |
key: ${{ needs.build.outputs.cache-key }} | |
- name: Add Foundry to PATH | |
run: echo "${{ needs.build.outputs.installation-dir }}" >> "$GITHUB_PATH" | |
- name: Checkout base branch or previous commit | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.pull_request.base.ref || github.event.before }} | |
# We don't have a `lib` folder to restore for this step, so we | |
# recursively checkout the submodules. In other steps, we use the | |
# `lib` folder from the `build` job. | |
submodules: recursive | |
- name: Generate base branch layout file | |
# Note that this `run` will do a `forge build` so we don't need to do it ourselves. | |
# The build artifacts of this step are not relevant to us either, so we don't need to | |
# cache them. | |
run: | | |
forge inspect src/core/ExocoreGateway.sol:ExocoreGateway storage-layout > ExocoreGateway.base.json | |
- name: Upload storage layout file as an artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
path: ExocoreGateway.base.json | |
name: storage-layouts-ExocoreGateway-base-${{ github.event.pull_request.base.sha || github.event.after || github.sha }} | |
extract-storage-layouts: | |
runs-on: ubuntu-latest | |
needs: build | |
strategy: | |
matrix: | |
contract: [Bootstrap, ClientChainGateway, RewardVault, Vault, ExocoreGateway, ExoCapsule] | |
# A few minutes | |
timeout-minutes: 10 | |
steps: | |
- name: Restore cached Foundry toolchain | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ needs.build.outputs.installation-dir }} | |
key: ${{ needs.build.outputs.cache-key }} | |
- name: Add Foundry to PATH | |
run: echo "${{ needs.build.outputs.installation-dir }}" >> "$GITHUB_PATH" | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Restore build artifacts | |
uses: actions/cache/restore@v3 | |
with: | |
path: | | |
./lib | |
./out | |
./cache | |
./broadcast | |
key: build-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} | |
- name: Generate storage layout file for ${{ matrix.contract }} | |
run: | | |
forge inspect src/core/${{ matrix.contract }}.sol:${{ matrix.contract }} storage-layout > ${{ matrix.contract }}.compiled.json; | |
- name: Upload storage layout file as an artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
path: ${{ matrix.contract }}.compiled.json | |
name: storage-layouts-${{ matrix.contract}}-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} | |
combine-storage-layouts: | |
runs-on: ubuntu-latest | |
needs: | |
- extract-base-storage-layout-exocore-gateway | |
- extract-storage-layouts | |
# A few minutes | |
timeout-minutes: 10 | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
# No name and no path means all artifacts are downloaded and saved to $GITHUB_WORKSPACE | |
- name: Zip up the storage layouts | |
run: zip storage-layouts.zip *.json | |
- name: Upload storage layout file as an artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
path: storage-layouts.zip | |
name: storage-layouts-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} |