|
36 | 36 | - name: Checkout repository |
37 | 37 | uses: actions/checkout@v4 |
38 | 38 |
|
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 |
41 | 43 |
|
42 | 44 | - name: Set image name |
43 | 45 | id: set-image |
@@ -71,22 +73,52 @@ jobs: |
71 | 73 | run: | |
72 | 74 | hpccm --recipe ${{ matrix.tutorial }}/brev/docker-recipe.py --format docker > ${{ matrix.tutorial }}/brev/dockerfile |
73 | 75 |
|
| 76 | + - name: Set up Docker Buildx |
| 77 | + uses: docker/setup-buildx-action@v3 |
| 78 | + |
74 | 79 | - name: Log in to GitHub Container Registry |
75 | 80 | uses: docker/login-action@v3 |
76 | 81 | with: |
77 | 82 | registry: ghcr.io |
78 | 83 | username: ${{ github.actor }} |
79 | 84 | password: ${{ secrets.GITHUB_TOKEN }} |
80 | 85 |
|
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 |
85 | 88 | 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" |
88 | 92 |
|
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