Skip to content

Commit

Permalink
ci: workflow pass/fail, dump context (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
DerekRoberts authored Dec 6, 2023
1 parent 5ee7ad2 commit a5cd484
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 137 deletions.
43 changes: 33 additions & 10 deletions .github/workflows/pr-open.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,46 @@
name: PR
name: Test

on:
merge_group:
pull_request:
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
needs: [build]
permissions:
packages: write
name: Retag
# Dump GitHub Context.Event
dump:
name: Dump GitHub Context.Event
runs-on: ubuntu-22.04
steps:
- name: Dump GitHub Context.Event
run: echo "${{ toJson(github.event) }}" | sed -r 's/#/\\#/g'

# Test for PR, merge queue and merge to main
get-pr:
name: Get PR number
runs-on: ubuntu-22.04
outputs:
pr: ${{ steps.vars.outputs.pr }}
steps:
- uses: actions/checkout@v4
- id: vars
uses: ./

- name: Echo PR number
run: echo "PR: ${{ steps.vars.outputs.pr }}"
# uses: ./
run: echo "pr=1" >> $GITHUB_OUTPUT

verify-pr:
name: Verify PR number
needs: [get-pr]
env:
pr: ${{ needs.get-pr.outputs.pr }}
runs-on: ubuntu-22.04
steps:
- name: Verify PR number
run: |
# Check needs.get-pr.outputs.pr
[ ! -z ${{ env.pr }} ]|| \
(echo "No PR number" && exit 1)
echo "PR: ${{ env.pr }}"
135 changes: 8 additions & 127 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,133 +29,14 @@ runs:
- id: vars
shell: bash
run: |
# Inputs and variables
# Use package folder as build_context unless an override has been provided
if [ -z ${{ inputs.build_context }} ]; then
BUILD_CONTEXT=${{ inputs.package }}
else
BUILD_CONTEXT=${{ inputs.build_context }}
fi
echo "build_context=${BUILD_CONTEXT}" >> $GITHUB_OUTPUT
# Use BUILD_CONTEXT/Dockerfile as build_file unless an override has been provided
if [ -z ${{ inputs.build_file }} ]; then
BUILD_FILE=${BUILD_CONTEXT}/Dockerfile
# Get PR number (different process for merge queue)
if [ ${{ github.event_name }} == 'pull_request' ]
then
tag=${{ github.event.number }}
else
BUILD_FILE=${{ inputs.build_file }}
fi
echo "build_file=${BUILD_FILE}" >> $GITHUB_OUTPUT
# Bug - Docker build hates images with capital letters
TAGS=$( echo "ghcr.io/${{ github.repository }}/${{ inputs.package }}:${{ inputs.tag }}" | tr '[:upper:]' '[:lower:]' )
echo "tags=${TAGS//[$'\r\n ']}" >> $GITHUB_OUTPUT
# Check if a build is required (steps.build.outputs.triggered=true|false)
- name: Check for builds
shell: bash
id: build
run: |
# Check for builds
# Build if an override repository was provided
if [ "${{ inputs.repository }}" != "${{ github.repository }}" ]; then
echo "Build triggered on override repository"
echo "triggered=true" >> $GITHUB_OUTPUT
exit 0
fi
# Build if no tag_fallback or no triggers
if [ -z "${{ inputs.tag_fallback }}" ]||[ -z "${{ inputs.triggers }}" ]; then
echo "Build triggered with possible reasons:"
echo " a) tag_fallback provided"
echo " b) triggers not provided"
echo "triggered=true" >> $GITHUB_OUTPUT
exit 0
tag=$(echo ${{ github.event.merge_group.head_ref }} | grep -Eo "queue/main/pr-[0-9]+" | cut -d '-' -f2)
fi
# Build if tag_fallback is no good (requires a valid container)
FALLBACK=ghcr.io/${{ inputs.repository }}/${{ inputs.package }}:${{ inputs.tag_fallback }}
if [ "$(docker buildx imagetools inspect ${FALLBACK} || true | grep -qi '^Name:')" = "" ]; then
# Output triggered=true for next steps
echo "Build triggered. Fallback tag (tag_fallback) not usable."
echo "Manifest checked for: ghcr.io/${FALLBACK}"
echo "triggered=true" >> $GITHUB_OUTPUT
exit 0
fi
# Build if changed files (git diff) match triggers
TRIGGERS=${{ inputs.triggers }}
git fetch origin ${{ inputs.diff_branch }}
while read -r check; do
for t in "${TRIGGERS[@]}"; do
if [[ "${check}" =~ "${t}" ]]; then
# Output triggered=true for next steps
echo "Build triggered based on git diff"
echo -e "${t}\n --> ${check}"
echo "triggered=true" >> $GITHUB_OUTPUT
exit 0
fi
done
done < <(git diff origin/${{ inputs.diff_branch }} --name-only)
# If at this point, no build is required
echo "Container build not required"
echo "triggered=false" >> $GITHUB_OUTPUT
# If a build is not required, reuse a previous image
- name: Recycle/retag Previous Images
uses: shrink/actions-docker-registry-tag@v3
if: steps.build.outputs.triggered != 'true'
with:
registry: ghcr.io
repository: ${{ inputs.repository }}/${{ inputs.package }}
target: ${{ inputs.tag_fallback }}
tags: ${{ inputs.tag }}

# If a build is required, then login, build and push!
- name: Set up Docker Buildx
if: steps.build.outputs.triggered == 'true'
uses: docker/setup-buildx-action@v3

- name: Log in to the Container registry
if: steps.build.outputs.triggered == 'true'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ inputs.token }}

- name: Build and push ${{ inputs.package }} Docker image
if: steps.build.outputs.triggered == 'true'
uses: docker/build-push-action@v5
with:
context: ${{ steps.vars.outputs.build_context }}
file: ${{ steps.vars.outputs.build_file }}
push: true
tags: ${{ steps.vars.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: ${{ inputs.build_args }}

# Cleanup if inputs.keep_versions provided
- name: GHCR Cleanup
if: ${{ inputs.keep_versions }}
uses: actions/delete-package-versions@v4
with:
package-name: "${{ github.event.repository.name }}/${{ inputs.package }}"
package-type: "container"
min-versions-to-keep: ${{ inputs.keep_versions }}
ignore-versions: "${{ inputs.keep_regex }}"

# Action repo needs to be present for cleanup/tests
- name: Checkout local repo to make sure action.yml is present
if: ${{ github.repository }} != ${{ inputs.repository }}
uses: actions/checkout@v4

- name: Return digest of the built image
id: get_digest
shell: bash
run: |
DIGEST=$(docker manifest inspect ${{ steps.vars.outputs.tags }} | jq '.manifests[0].digest')
echo "digest=${DIGEST}" >> $GITHUB_OUTPUT
echo "Summary ---"
echo -e "\tTag (PR no): ${tag}"
echo "tag=${tag}" >> $GITHUB_OUTPUT

0 comments on commit a5cd484

Please sign in to comment.