Skip to content

Running docker build only for changed methods #110

Running docker build only for changed methods

Running docker build only for changed methods #110

Workflow file for this run

name: Docker CI
on:
push:
branches:
- docker-compose
- main
paths:
- 'algorithms/**'
- 'experiment/methods/**'
- '.github/workflows/**'
pull_request:
branches:
- docker-compose
paths:
- 'algorithms/**'
- 'experiment/methods/**'
- '.github/workflows/**'
jobs:
list-algs:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v3
- id: set-matrix
run: echo "::set-output name=matrix::$(ls algorithms/ | jq -R -s -c 'split("\n")[:-1]')"
check-changes:
runs-on: ubuntu-latest
outputs:
changed-algs: ${{ steps.check.outputs.changed-algs }}
unchanged-algs: ${{ steps.check.outputs.unchanged-algs }}
changed-experiments: ${{ steps.check.outputs.changed-experiments }}
unchanged-experiments: ${{ steps.check.outputs.unchanged-experiments }}
changes-detected: ${{ steps.check.outputs.changes-detected }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- id: check
run: |
CHANGED_ALGS=$(git diff --name-only HEAD~1..HEAD | grep '^algorithms/' | cut -d '/' -f 2 | tr '\n' ',')
UNCHANGED_ALGS=$(comm -23 <(ls algorithms/) <(echo "$CHANGED_ALGS"))
CHANGED_EXPERIMENTS=$(git diff --name-only HEAD~1..HEAD | grep '^experiment/methods/' | cut -d '/' -f 2 | tr '\n' ',')
UNCHANGED_EXPERIMENTS=$(comm -23 <(ls experiment/methods/) <(echo "$CHANGED_EXPERIMENTS"))
echo "::set-output name=changed-algs::$CHANGED_ALGS"
echo "::set-output name=unchanged-algs::$UNCHANGED_ALGS"
echo "::set-output name=changed-experiments::$CHANGED_EXPERIMENTS"
echo "::set-output name=unchanged-experiments::$UNCHANGED_EXPERIMENTS"
echo "::set-output name=changes-detected::$(test -z "$CHANGED_ALGS$CHANGED_EXPERIMENTS" && echo "false" || echo "true")"
print-changes:
runs-on: ubuntu-latest
needs: check-changes
outputs:
changed-algorithms: ${{ steps.print.outputs.changed-algorithms }}
steps:
- uses: actions/checkout@v3
- id: print
run: |
echo "Changed algorithms:"
echo "${{ needs.check-changes.outputs.changed-algs }}"
echo ""
echo "Changed experiments:"
echo "${{ needs.check-changes.outputs.changed-experiments }}"
build-and-test:
runs-on: ubuntu-latest
needs:
- check-changes
- print-changes
- list-algs
defaults:
run:
shell: bash -l {0}
strategy:
matrix:
alg: ${{ fromJson(needs.list-algs.outputs.matrix) }}
fail-fast: false
if: needs.check-changes.outputs.changes-detected == 'true'
steps:
- uses: actions/checkout@v3
- name: Check if algorithm has changed
id: check_algorithm
run: |
CHANGED_ALGS=$(echo "${{ needs.check-changes.outputs.changed-algs }}" | tr ',' '\n')
if [[ "$CHANGED_ALGS" == *"${{ matrix.alg }}"* ]]; then
echo "::set-output name=should_run::true"
else
echo "::set-output name=should_run::false"
echo "::set-output name=status::skipped"
fi
- name: Print should_run status
run: |
echo "Should run: ${{ steps.check_algorithm.outputs.should_run }}"
- name: Build and Test Algorithm
if: steps.check_algorithm.outputs.should_run == 'true'
run: |
# Log in to Docker Hub
# docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_KEY }}
# Make docker-compose.yml file
bash scripts/make_docker_compose_file.sh
# Pull docker image
# docker compose pull ${{ matrix.alg }}
# Build docker image
# docker compose build ${{ matrix.alg }}
# Test docker image
docker compose run --build ${{ matrix.alg }} bash test.sh
# Push docker image
# docker compose push ${{ matrix.alg }}