fix(ci): always create matrix #136
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: compiled-layout-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: compiled-layout-${{ 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 means all artifacts are downloaded within their respective subfolders | |
# inside the provided path. | |
with: | |
path: combined | |
- name: Zip up the compiled layouts | |
run: zip -j compiled-layouts.zip combined/*/*.json | |
- name: Upload the compiled layouts file as an artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
path: compiled-layouts.zip | |
name: compiled-layouts-${{ github.event.pull_request.head.sha || github.event.after || github.sha }} |