Skip to content

Commit f8f0de2

Browse files
committed
Docker: Use caching during Docker image builds.
1 parent 70d4b5e commit f8f0de2

File tree

1 file changed

+44
-12
lines changed

1 file changed

+44
-12
lines changed

.github/workflows/build-brev-tutorial-docker-images.yml

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ jobs:
3636
- name: Checkout repository
3737
uses: actions/checkout@v4
3838

39-
- name: Get branch name
40-
run: echo "GIT_BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
39+
- name: Get branch name and short SHA
40+
run: |
41+
echo "GIT_BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
42+
echo "GIT_SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_ENV
4143
4244
- name: Set image name
4345
id: set-image
@@ -71,22 +73,52 @@ jobs:
7173
run: |
7274
hpccm --recipe ${{ matrix.tutorial }}/brev/docker-recipe.py --format docker > ${{ matrix.tutorial }}/brev/dockerfile
7375
76+
- name: Set up Docker Buildx
77+
uses: docker/setup-buildx-action@v3
78+
7479
- name: Log in to GitHub Container Registry
7580
uses: docker/login-action@v3
7681
with:
7782
registry: ghcr.io
7883
username: ${{ github.actor }}
7984
password: ${{ secrets.GITHUB_TOKEN }}
8085

81-
- name: Build Docker image with Compose
82-
run: docker compose -f ${{ matrix.tutorial }}/brev/docker-compose.yml build
83-
84-
- name: Tag Docker images
86+
- name: Extract metadata from Docker Compose
87+
id: compose-config
8588
run: |
86-
docker tag "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-latest" "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-latest"
87-
docker tag "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-latest" "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-git-${GITHUB_SHA::7}"
89+
# This uses jq which is pre-installed on GitHub Actions runners
90+
COMPOSE_DIR="${{ matrix.tutorial }}/brev"
91+
cd "$COMPOSE_DIR"
8892
89-
- name: Push Docker images
90-
run: |
91-
docker push "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-latest"
92-
docker push "${{ steps.set-image.outputs.image_name }}:${GIT_BRANCH_NAME}-git-${GITHUB_SHA::7}"
93+
# `docker compose config` outputs the resolved configuration
94+
# Extract context and dockerfile for the 'base' service
95+
CONTEXT=$(docker compose config --format json | jq -r '.services.base.build.context // "."')
96+
DOCKERFILE=$(docker compose config --format json | jq -r '.services.base.build.dockerfile // "Dockerfile"')
97+
98+
# Resolve paths relative to the docker-compose.yml location
99+
# Then convert to paths relative to the repo root
100+
CONTEXT_ABS=$(realpath -m "$CONTEXT")
101+
CONTEXT_REL=$(realpath -m --relative-to="${GITHUB_WORKSPACE}" "$CONTEXT_ABS")
102+
103+
# Dockerfile path is relative to the context in docker-compose
104+
# For build-push-action, it should be relative to the repo root
105+
DOCKERFILE_ABS=$(realpath -m "$CONTEXT/$DOCKERFILE")
106+
DOCKERFILE_REL=$(realpath -m --relative-to="${GITHUB_WORKSPACE}" "$DOCKERFILE_ABS")
107+
108+
echo "context=${CONTEXT_REL}" >> $GITHUB_OUTPUT
109+
echo "dockerfile=${DOCKERFILE_REL}" >> $GITHUB_OUTPUT
110+
echo "Using context: ${CONTEXT_REL}, dockerfile: ${DOCKERFILE_REL}"
111+
112+
- name: Build and push Docker image
113+
uses: docker/build-push-action@v6
114+
with:
115+
context: ${{ steps.compose-config.outputs.context }}
116+
file: ${{ steps.compose-config.outputs.dockerfile }}
117+
build-args: |
118+
GIT_BRANCH_NAME=${{ env.GIT_BRANCH_NAME }}
119+
tags: |
120+
${{ steps.set-image.outputs.image_name }}:${{ env.GIT_BRANCH_NAME }}-latest
121+
${{ steps.set-image.outputs.image_name }}:${{ env.GIT_BRANCH_NAME }}-git-${{ env.GIT_SHORT_SHA }}
122+
push: true
123+
cache-from: type=registry,ref=${{ steps.set-image.outputs.image_name }}:buildcache
124+
cache-to: type=registry,ref=${{ steps.set-image.outputs.image_name }}:buildcache,mode=max

0 commit comments

Comments
 (0)