diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 46ce96912..6d77414d6 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -6,7 +6,7 @@ on: - main jobs: - find-targets: + find-updated-benchmarks: runs-on: ubuntu-latest permissions: @@ -14,33 +14,70 @@ jobs: steps: - uses: actions/checkout@v4 + - run: | + git fetch origin + - id: find-base-updates + run: | + bases=$(git diff --name-only --diff-filter=ACMR origin/${{ github.base_ref }} origin/${{ github.head_ref }} | grep -e "^OCaml-base/" -e "^Java-base/" -e "^C-base/" -e "^Solidity-base/" | cut -d '/' -f 1-2 | sort | uniq) + { + for base in $base; do + base=$(echo $base | sed 's/-base//') + ls $base-* + done + } > updated.txt + - id: find-benchmark-updates + run: | + git diff --name-only --diff-filter=ACMR origin/${{ github.base_ref }} origin/${{ github.head_ref }} | grep -e "^OCaml/" -e "^Java/" -e "^C/" -e "^Solidity/" | cut -d '/' -f 1-2 | sort | uniq > updated.txt - id: find-targets run: | - git fetch origin - projects=$(git diff --name-only --diff-filter=ACMR origin/${{ github.base_ref }} origin/${{ github.head_ref }} | grep -e "^OCaml/" -e "^Java/" -e "^C/" -e "^Solidity/" | cut -d '/' -f 1-2 | sort | uniq | xargs -I{prj} echo \"{prj}\" | tr '\n' ',' | sed 's/,*$//') + targets=$(cat updated.txt | xargs -I{prj} echo \"{prj}\" | tr '\n' ',' | sed 's/,*$//') echo "targets=[$projects]" >> ${GITHUB_OUTPUT} outputs: targets: ${{ steps.find-targets.outputs.targets }} - build-test: + benchmarks-build-test: runs-on: ubuntu-latest permissions: contents: read needs: - - find-targets + - find-updated-benchmarks - if: always() && needs.find-targets.outputs.targets != '[]' + if: needs.find-updated-benchmarks.outputs.targets != '[]' strategy: matrix: - target: ${{ fromJSON(needs.find-targets.outputs.targets) }} + target: ${{ fromJSON(needs.find-updated-benchmarks.outputs.targets) }} steps: - uses: actions/checkout@v3 + - uses: docker/setup-buildx-action@v3 + + - name: Check if base image exists + id: check-if-base-image-exists + run: | + lang=$(echo ${{ matrix.target }} | cut -d '-' -f 1) + proj=$(echo ${{ matrix.target }} | cut -d '-' -f 2) + if [ -d ${lang}-base/${proj} ]; then + echo "base=${lang}-base/${proj}" >> ${GITHUB_OUTPUT} + else + echo "base=" >> ${GITHUB_OUTPUT} + fi + - name: Build base image + id: build-base-image + if: steps.check-if-base-image-exists.outputs.base != '' + uses: docker/build-push-action@v5 + with: + context: ${{ steps.check-if-base-image-exists.outputs.base }} + file: ${{ steps.check-if-base-image-exists.outputs.base }}/Dockerfile + platforms: linux/amd64 + push: false + tags: base:latest + outputs: type=docker,dest=./base.tar + - name: Read metadata id: read-metadata run: | @@ -48,8 +85,17 @@ jobs: content="${content//$'\n'/''}" echo "location=$(echo $content | jq -r .buggyPath)" >> ${GITHUB_OUTPUT} echo "buildCommand=$(echo $content | jq -r .buildCommand)" >> ${GITHUB_OUTPUT} - - uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v5 + if: steps.check-if-base-image-exists.outputs.base == '' + with: + context: ${{ matrix.target }} + file: ${{ matrix.target }}/Dockerfile + platforms: linux/amd64 + push: false + tags: benchmark:latest + outputs: type=docker,dest=./image.tar + - uses: docker/build-push-action@v5 + if: steps.check-if-base-image-exists.outputs.base != '' with: context: ${{ matrix.target }} file: ${{ matrix.target }}/Dockerfile @@ -57,6 +103,8 @@ jobs: push: false tags: benchmark:latest outputs: type=docker,dest=./image.tar + cache-from: type=local,src=./base.tar + - name: Smoke test run: | docker load --input ./image.tar @@ -69,7 +117,7 @@ jobs: pull-requests: write needs: - - build-test + - benchmarks-build-test if: always()