From bc5adfd3a886f5af831dbfadc18d67a3b0adbd4c Mon Sep 17 00:00:00 2001 From: Matthew Whitlock Date: Thu, 14 Nov 2024 12:40:55 -0500 Subject: [PATCH] Only rebuild images on request, or once 14 days old --- .github/workflows/build-env/action.yml | 99 ++++++++++++++++++++++++++ .github/workflows/ci_checks.yaml | 42 ++--------- 2 files changed, 104 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/build-env/action.yml diff --git a/.github/workflows/build-env/action.yml b/.github/workflows/build-env/action.yml new file mode 100644 index 0000000..5df92a5 --- /dev/null +++ b/.github/workflows/build-env/action.yml @@ -0,0 +1,99 @@ +name: Build Fenix's Environment Image + +on: + # workflow_call = called by another workflow + workflow_call: + inputs: + ompi_version: + description: "Open MPI version to build" + type: string + required: true + max_age: + description: "Maximum image age before rebuild, in days" + type: number + required: false + default: 14 + # workflow_dispatch = manual trigger + workflow_dispatch: + inputs: + ompi_version: + description: "Open MPI version to build" + type: string + required: true + max_age: + description: "Maximum image age before rebuild, in days" + type: number + required: false + default: 0 + +env: + IMAGE_NAME: ghcr.io/sandialabs/fenix/env + +jobs: + detect_image: + runs-on: ubuntu-latest + steps: + - name: Check for valid image + run: | + IMG=${IMAGE_NAME}:${{ inputs.ompi_version }} + docker image rm -f $IMG; docker pull $IMG || true + IMG_CREATED=$(docker inspect --type=image --format '{{.Created}}' $IMG 2>/dev/null) + if [ -z "$IMG_CREATED" ]; then + echo "found=false" >> $GITHUB_OUTPUT + exit 0 + fi + + IMG_AGE=$(( ($(date +%s) - $(date -d "$IMG_CREATED" +%s)) / (60*60*24) )) + if [ "$IMG_AGE" -lt ${{ inputs.max_age }} ]; then + echo "found=true" >> $GITHUB_OUTPUT + else + echo "found=false" >> $GITHUB_OUTPUT + fi + outputs: + found: ${{ steps.outputs.found }} + + build_image: + runs-on: ubuntu-latest + needs: detect_image + if: needs.detect_image.outputs.found == 'false' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to GHCR container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Bake the bootstrap docker image + uses: docker/bake-action@v5 + with: + files: .github/docker-compose.yml + targets: bootstrap + workdir: . + set: | + *.output=type=docker,name=bootstrap + *.cache-from=type=gha,scope=bootstrap/${{ inputs.ompi_version }} + *.cache-to=type=gha,mode=max,scope=bootstrap/${{ inputs.ompi_version }} + *.args.OMPI_VERSION=${{ inputs.ompi_version }} + + - name: Bootstrap the environment Dockerfile + run: docker run -v ${GITHUB_WORKSPACE}/.github:/configs bootstrap + + - name: Build the environment + uses: docker/bake-action@v5 + with: + files: .github/docker-compose.yml + targets: env + workdir: . + pull: true + set: | + *.cache-from=type=gha,scope=env/${{ inputs.ompi_version }} + *.cache-to=type=gha,mode=max,scope=env/${{ inputs.ompi_version }} + env.tags=ghcr.io/sandialabs/fenix/env:${{ inputs.ompi_version }} + env.output=type=registry,name=ghcr.io/sandialabs/fenix/env:${{ inputs.ompi_version }} diff --git a/.github/workflows/ci_checks.yaml b/.github/workflows/ci_checks.yaml index 14c376c..1408f4f 100644 --- a/.github/workflows/ci_checks.yaml +++ b/.github/workflows/ci_checks.yaml @@ -22,51 +22,19 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Log in to GHCR container registry - uses: docker/login-action@v3 + - name: Build the environment image + uses: ./.github/workflows/build-env with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + ompi_version: ${{ matrix.ompi_version }} - - name: Bake the bootstrap docker image - uses: docker/bake-action@v5 - with: - files: .github/docker-compose.yml - targets: bootstrap - workdir: . - set: | - *.output=type=docker,name=bootstrap - *.cache-from=type=gha,scope=bootstrap/${{ matrix.ompi_version }} - *.cache-to=type=gha,mode=max,scope=bootstrap/${{ matrix.ompi_version }} - *.args.OMPI_VERSION=${{ matrix.ompi_version }} - - - name: Bootstrap the environment Dockerfile - run: docker run -v ${GITHUB_WORKSPACE}/.github:/configs bootstrap - - - name: Build the environment - uses: docker/bake-action@v5 - with: - files: .github/docker-compose.yml - targets: env - workdir: . - pull: true - set: | - *.cache-from=type=gha,scope=env/${{ matrix.ompi_version }} - *.cache-to=type=gha,mode=max,scope=env/${{ matrix.ompi_version }} - env.tags=ghcr.io/sandialabs/fenix/env:${{ matrix.ompi_version }} - env.output=type=registry,name=ghcr.io/sandialabs/fenix/env:${{ matrix.ompi_version }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 - name: Build Fenix uses: docker/bake-action@v5 with: - source: . files: .github/docker-compose.yml targets: fenix - workdir: . set: | *.output=type=docker,name=fenix *.args.OMPI_VERSION=${{ matrix.ompi_version }}