github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/.github/workflows/commit.yaml (about) 1 name: Test 2 on: 3 pull_request: 4 branches: [main] 5 paths-ignore: # ignore docs as they are built with Netlify. 6 - '**/*.md' 7 - 'site/**' 8 - 'netlify.toml' 9 push: 10 branches: [main] 11 paths-ignore: # ignore docs as they are built with Netlify. 12 - '**/*.md' 13 - 'site/**' 14 - 'netlify.toml' 15 16 env: # Update this prior to requiring a higher minor version in go.mod 17 GO_VERSION: "1.21" # 1.xx == latest patch of 1.xx 18 19 defaults: 20 run: # use bash for all operating systems unless overridden 21 shell: bash 22 23 concurrency: 24 # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-using-concurrency-to-cancel-any-in-progress-job-or-run 25 group: ${{ github.ref }}-${{ github.workflow }}-${{ github.actor }} 26 cancel-in-progress: true 27 28 jobs: 29 check: 30 name: Pre-commit check 31 # wabt requires a later version of libc than what's installed on ubuntu-22.04. 32 runs-on: ubuntu-latest 33 steps: 34 - name: Install latest wast2json 35 run: | # Needed for build.spectest. wabt includes wast2json. 36 wabt_version=1.0.33 37 wabt_url=https://github.com/WebAssembly/wabt/releases/download/${wabt_version}/wabt-${wabt_version}-ubuntu.tar.gz 38 curl -sSL ${wabt_url} | tar --strip-components 2 -C /usr/local/bin -xzf - wabt-${wabt_version}/bin/wast2json 39 40 - uses: actions/checkout@v3 41 42 - uses: actions/setup-go@v4 43 with: # not cache: true as we also need to cache golint 44 cache: false 45 go-version: ${{ env.GO_VERSION }} 46 47 - uses: actions/cache@v3 48 with: 49 path: | 50 ~/.cache/go-build 51 ~/.cache/golangci-lint 52 ~/go/pkg/mod 53 ~/go/bin 54 key: check-${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum', 'Makefile') }} 55 56 - run: make build.spectest 57 58 - run: make check 59 60 test_amd64: 61 name: amd64, ${{ matrix.os }}, Go-${{ matrix.go-version }} 62 runs-on: ${{ matrix.os }} 63 strategy: 64 fail-fast: false # don't fail fast as sometimes failures are arch/OS specific 65 matrix: # Use versions consistent with wazero's Go support policy. 66 os: [ubuntu-22.04, macos-12, windows-2022] 67 go-version: 68 - "1.21" # Current Go version 69 - "1.19" # Floor Go version of wazero (current - 2) 70 71 steps: 72 73 - uses: actions/checkout@v3 74 75 - uses: actions/setup-go@v4 76 with: 77 go-version: ${{ matrix.go-version }} 78 79 # Ensure the pagefile is large enough to execute tests like TestStore_hammer_close on Windows. 80 - name: configure Pagefile 81 uses: al-cheb/configure-pagefile-action@v1.2 82 if: runner.os == 'Windows' 83 with: 84 minimum-size: 8GB 85 maximum-size: 16GB 86 disk-root: "D:" 87 88 # Run -race could be really slow without -short, so run them together on this workflow. 89 # Since -short is not added in the scratch tests, all the tests are run in CI in practice. 90 - run: make test go_test_options='-timeout 10m -race -short' 91 92 - name: "Generate coverage report" # only once (not per OS) 93 if: runner.os == 'Linux' 94 run: make coverage 95 96 - name: "Upload coverage report" # only on main push and only once (not per OS) 97 if: github.event_name == 'push' && github.ref == 'refs/heads/main' && runner.os == 'Linux' 98 env: 99 CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 100 run: bash <(curl -s https://codecov.io/bash) 101 102 test_scratch: 103 name: ${{ matrix.arch }}, Linux (scratch), Go-${{ matrix.go-version }} 104 runs-on: ubuntu-22.04 105 strategy: 106 fail-fast: false # don't fail fast as sometimes failures are arch/OS specific 107 matrix: # Use versions consistent with wazero's Go support policy. 108 go-version: 109 - "1.21" # Current Go version 110 - "1.19" # Floor Go version of wazero (current - 2) 111 arch: 112 - "amd64" 113 - "arm64" 114 - "riscv64" 115 116 steps: 117 118 - uses: actions/checkout@v3 119 120 - uses: actions/setup-go@v4 121 with: 122 go-version: ${{ matrix.go-version }} 123 124 - name: Build test binaries 125 # Exclude benchmarks as we don't run those in Docker 126 run: | 127 go list -f '{{.Dir}}' ./... | egrep -v '(bench|vs|spectest)' | xargs -Ipkg go test pkg -c -o pkg.test 128 go build -o wazerocli ./cmd/wazero 129 env: 130 GOARCH: ${{ matrix.arch }} 131 CGO_ENABLED: 0 132 133 - name: Set up QEMU 134 if: ${{ matrix.arch != 'amd64' }} 135 uses: docker/setup-qemu-action@v2 136 with: # Avoid docker.io rate-limits; built with internal-images.yml 137 image: ghcr.io/tetratelabs/wazero/internal-binfmt 138 platforms: ${{ matrix.arch }} 139 140 - name: Build scratch container 141 run: | 142 echo 'FROM scratch' >> Dockerfile 143 echo 'CMD ["/test"]' >> Dockerfile 144 docker buildx build -t wazero:test --platform linux/${{ matrix.arch }} . 145 146 - name: Run built test binaries 147 # This runs all tests compiled above in sequence. Note: This mounts /tmp to allow t.TempDir() in tests. 148 run: find . -name "*.test" | xargs -Itestbin docker run --platform linux/${{ matrix.arch }} -v $(pwd)/testbin:/test -v $(pwd)/wazerocli:/wazero -e WAZEROCLI=/wazero --tmpfs /tmp --rm -t wazero:test 149 150 bench: 151 name: Benchmark 152 runs-on: ubuntu-22.04 153 154 steps: 155 # Unlike the other CGO libraries, WasmEdge requires offline installation. 156 - name: Install WasmEdge 157 run: | 158 wget -qO- https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | sudo bash -s -- -p /usr/local -v ${WASMEDGE_VERSION} 159 # The version here is coupled to internal/integration_test/go.mod, but it 160 # isn't always the same as sometimes the Go layer has a broken release. 161 env: 162 WASMEDGE_VERSION: 0.12.1 163 164 - uses: actions/checkout@v3 165 166 - uses: actions/setup-go@v4 167 with: 168 go-version: ${{ env.GO_VERSION }} 169 170 - run: make bench 171 172 # This ensures that internal/integration_test/fuzz is runnable, and is not intended to 173 # run full-length fuzzing while trying to find low-hanging frontend bugs. 174 fuzz: 175 name: Minimal Fuzzing 176 runs-on: ubuntu-22.04 177 178 steps: 179 - uses: actions/checkout@v3 180 - uses: actions/setup-go@v4 181 with: 182 go-version: ${{ env.GO_VERSION }} 183 184 - uses: actions/cache@v3 185 id: cache 186 with: 187 # Cache corpus and artifacts so that we don't start from scratch but rather with a meaningful corpus 188 # in the subsequent CI jobs. 189 path: | 190 ~/.cargo 191 ~/.cache/go-build 192 ~/go/pkg/mod 193 ~/.rustup/toolchains/ 194 internal/integration_test/fuzz/target 195 internal/integration_test/fuzz/fuzz/artifacts 196 internal/integration_test/fuzz/fuzz/corpus 197 key: build-fuzzer-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ hashFiles('**/go.sum', 'Makefile', '**/Cargo.lock', '**/Cargo.toml', '**/*.rs') }} 198 199 # Fuzzer requires nightly rustc. 200 - run: rustup default nightly 201 - run: cargo install cargo-fuzz 202 if: steps.cache.outputs.cache-hit != 'true' 203 # Run fuzzing only for a minute, not a full-length intensive one, but 60 seconds seems enough to find minor "front-end" 204 # bugs which might exist in binary parser, validation, or instantiation phase while not pressuring CI jobs. 205 - run: make fuzz fuzz_timeout_seconds=60 206 if: ${{ github.event_name == 'pull_request' }} 207 # Run a bit longer on main branch push! 208 - run: make fuzz fuzz_timeout_seconds=180 209 if: ${{ github.event_name == 'push' }}