This commit is contained in:
mrhotio 2026-01-08 11:16:51 +01:00
parent 39c4408779
commit eed87f2864

View File

@ -1,5 +1,9 @@
name: Image Builder
concurrency:
group: ${{ github.repository }}
cancel-in-progress: true
on:
workflow_dispatch:
push:
@ -28,18 +32,414 @@ jobs:
- name: List all changed image folders
run: echo '${{ steps.changed-folders.outputs.all_changed_and_modified_files }}'
build-image:
build:
name: Build Image
if: (needs.get-image.outputs.images != '[]')
runs-on: ubuntu-24.04
needs: [get-image]
strategy:
matrix:
images: ${{ fromJSON(needs.get-image.outputs.images) }}
image: ${{ fromJSON(needs.get-image.outputs.images) }}
architecture: [linux-arm64, linux-amd64]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Test
with:
fetch-depth: 0
- name: Check if Architecture Exists
id: arch-exists
run: |
echo ${{ matrix.images }}/${{ matrix.architecture }}
(test -f ${{ matrix.image }}/${{ matrix.architecture }}.Dockerfile && echo "result=ok" >> $GITHUB_OUTPUT) || echo "result=nok" >> $GITHUB_OUTPUT
- name: Set up QEMU
if: (steps.arch-exists.outputs.result == 'ok')
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:qemu-v9.2.2
- name: Set up Docker Buildx
if: (steps.arch-exists.outputs.result == 'ok')
uses: docker/setup-buildx-action@v3
- name: Login to ghcr.io
if: (steps.arch-exists.outputs.result == 'ok')
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Create Outputs for Next Steps
if: (steps.arch-exists.outputs.result == 'ok')
id: prep
env:
ARCHITECTURE: ${{ matrix.architecture }}
IMAGE: ${{ matrix.image }}
RUN_NUMBER: ${{ github.run_number }}
REPOSITORY_OWNER: ${{ github.repository_owner }}
SHA: ${{ github.sha }}
SERVER_URL: ${{ github.server_url }}
run: |
cd "${IMAGE}" || exit 1
REPOSITORY=$(dirname ${IMAGE})
BRANCH=$(basename ${IMAGE})
VERSION=$(jq -r '.version // empty' < VERSION.json)
VERSION=${VERSION//\~/-}
[[ -z ${VERSION} ]] && VERSION=$(date --utc --date=@$(git show -s --format=%ct $(git rev-parse --short HEAD)) +'%Y%m%d%H%M%S')
PR_BRANCH=$(jq -r '.branch // empty' < VERSION.json)
[[ -n ${PR_BRANCH} ]] && PR_BRANCH=-${PR_BRANCH}
echo "is-latest=$(jq -r '.latest // false' < VERSION.json)" >> $GITHUB_OUTPUT
echo "description=$(jq -r '.description // empty' < VERSION.json)" >> $GITHUB_OUTPUT
echo "hide=$(jq -r '.hide // false' < VERSION.json)" >> $GITHUB_OUTPUT
echo "created=$(date --utc --date=@$(git show -s --format=%ct $(git rev-parse --short HEAD)) +'%Y-%m-%dT%H:%M:%S.000Z')" >> $GITHUB_OUTPUT
echo "revision=${SHA}" >> $GITHUB_OUTPUT
echo "title=${REPOSITORY}:${BRANCH}${PR_BRANCH}" >> $GITHUB_OUTPUT
echo "source=${SERVER_URL}/${REPOSITORY}/tree/${BRANCH}" >> $GITHUB_OUTPUT
echo "vendor=${REPOSITORY_OWNER}" >> $GITHUB_OUTPUT
echo "url=https://hotio.dev/containers/${REPOSITORY/${REPOSITORY_OWNER}\//}" >> $GITHUB_OUTPUT
echo "platform=${ARCHITECTURE//-/\/}" >> $GITHUB_OUTPUT
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "package-version=${BRANCH}-${SHA:0:7}" >> $GITHUB_OUTPUT
echo "image-tag-full=${REPOSITORY}:${BRANCH}${PR_BRANCH}-${SHA:0:7}-${RUN_NUMBER}-${ARCHITECTURE}" >> $GITHUB_OUTPUT
[[ ${ARCHITECTURE} == linux-amd64 ]] && [[ $(jq -r '.test_amd64' < VERSION.json) == true ]] && echo "do_smoketest=ok" >> $GITHUB_OUTPUT
[[ ${ARCHITECTURE} == linux-arm64 ]] && [[ $(jq -r '.test_arm64' < VERSION.json) == true ]] && echo "do_smoketest=ok" >> $GITHUB_OUTPUT
echo 'build-args<<EOF' >> $GITHUB_OUTPUT
jq -r 'to_entries[] | [(.key | ascii_upcase),.value] | join("=")' < VERSION.json >> $GITHUB_OUTPUT
echo "BUILD_ARCHITECTURE=${ARCHITECTURE}" >> $GITHUB_OUTPUT
echo "PACKAGE_VERSION=${BRANCH}-${SHA:0:7}" >> $GITHUB_OUTPUT
echo "IMAGE_STATS=$(jq '.app = "'"${REPOSITORY/${REPOSITORY_OWNER}\//}"'" | .image = "'"${REPOSITORY}:${BRANCH}${PR_BRANCH}"'" | .revision = "'"${SHA:0:7}"'" | .version = "'"${VERSION}"'"' <<< "{}" | base64 -w 0)" >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
- name: Build Image
if: (steps.arch-exists.outputs.result == 'ok')
uses: docker/build-push-action@v6
with:
provenance: false
load: true
push: true
platforms: ${{ steps.prep.outputs.platform }}
context: "{{defaultContext}}:${{ matrix.image }}"
file: ./${{ matrix.architecture }}.Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
tags: |
ghcr.io/${{ steps.prep.outputs.image-tag-full }}
labels: |
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
org.opencontainers.image.title=${{ steps.prep.outputs.title }}
org.opencontainers.image.revision=${{ steps.prep.outputs.revision }}
org.opencontainers.image.source=${{ steps.prep.outputs.source }}
org.opencontainers.image.vendor=${{ steps.prep.outputs.vendor }}
org.opencontainers.image.url=${{ steps.prep.outputs.url }}
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
build-args: |
${{ steps.prep.outputs.build-args }}
- name: List Packages
if: (steps.arch-exists.outputs.result == 'ok')
env:
IMAGE: ghcr.io/${{ steps.prep.outputs.image-tag-full }}
PACKAGE_VERSION: ${{ steps.prep.outputs.package-version }}
PLATFORM: ${{ steps.prep.outputs.platform }}
run: |
docker run --platform="${PLATFORM}" --rm --entrypoint="" -v ${GITHUB_WORKSPACE}:/logs -e LOG="/logs/${PACKAGE_VERSION}-packages.log" "${IMAGE}" sh -c 'if grep -q alpine < /etc/os-release; then apk -vv info | sort > ${LOG} 2>&1; else apt list --installed > ${LOG} 2>&1; fi'
- name: Smoke Test
if: (steps.arch-exists.outputs.result == 'ok') && (steps.prep.outputs.do_smoketest == 'ok')
id: smoketest
env:
IMAGE: ghcr.io/${{ steps.prep.outputs.image-tag-full }}
PACKAGE_VERSION: ${{ steps.prep.outputs.package-version }}
PLATFORM: ${{ steps.prep.outputs.platform }}
run: |
test_url=$(jq -r '.test_url' < VERSION.json)
exitcode=0
docker run --platform="${PLATFORM}" --network host -d --name service "${IMAGE}"
curl -fsSL --retry-all-errors --retry 60 --retry-max-time 120 -m 10 -b /dev/shm/cookie "${test_url}" --output /dev/null || exitcode=$?
docker logs service > "${PACKAGE_VERSION}-test.log" 2>&1
[[ ${exitcode} == 0 ]] && echo "result=ok" >> $GITHUB_OUTPUT || echo "result=nok" >> $GITHUB_OUTPUT
exit ${exitcode}
- name: Upload Results
continue-on-error: true
if: always()
uses: actions/upload-artifact@v6
with:
if-no-files-found: warn
name: ${{ steps.prep.outputs.package-version }}-results-${{ matrix.architecture }}
path: |
${{ steps.prep.outputs.package-version }}-*.*
publish:
if: always()
runs-on: ubuntu-24.04
needs: [get-image, build]
strategy:
matrix:
image: ${{ fromJSON(needs.get-image.outputs.images) }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Create Outputs for Next Steps
id: prep
env:
IMAGE: ${{ matrix.image }}
RUN_NUMBER: ${{ github.run_number }}
REPOSITORY_OWNER: ${{ github.repository_owner }}
SHA: ${{ github.sha }}
run: |
cd "${IMAGE}" || exit 1
REPOSITORY=$(dirname ${IMAGE})
BRANCH=$(basename ${IMAGE})
wget -O ./semver https://raw.githubusercontent.com/fsaintjacques/semver-tool/refs/tags/3.4.0/src/semver && chmod +x ./semver
VERSION=$(jq -r '.version // empty' < VERSION.json)
VERSION=${VERSION//\~/-}
[[ -z ${VERSION} ]] && VERSION=$(date --utc --date=@$(git show -s --format=%ct $(git rev-parse --short HEAD)) +'%Y%m%d%H%M%S')
PR_BRANCH=$(jq -r '.branch // empty' < VERSION.json)
[[ -n ${PR_BRANCH} ]] && PR_BRANCH=-${PR_BRANCH}
echo "is-latest=$(jq -r '.latest // false' < VERSION.json)" >> $GITHUB_OUTPUT
echo "description=$(jq -r '.description // empty' < VERSION.json)" >> $GITHUB_OUTPUT
echo "hide=$(jq -r '.hide // false' < VERSION.json)" >> $GITHUB_OUTPUT
echo "created=$(date --utc --date=@$(git show -s --format=%ct $(git rev-parse --short HEAD)) +'%Y-%m-%dT%H:%M:%S.000Z')" >> $GITHUB_OUTPUT
echo "revision=${SHA}" >> $GITHUB_OUTPUT
[[ -f ${IMAGE}/linux-amd64.Dockerfile ]] && echo "image-tag-full-amd64=${REPOSITORY}:${BRANCH}${PR_BRANCH}-${SHA:0:7}-${RUN_NUMBER}-amd64" >> $GITHUB_OUTPUT
[[ -f ${IMAGE}/linux-arm64.Dockerfile ]] && echo "image-tag-full-arm64=${REPOSITORY}:${BRANCH}${PR_BRANCH}-${SHA:0:7}-${RUN_NUMBER}-arm64" >> $GITHUB_OUTPUT
echo "image-tag-branch=${REPOSITORY}:${BRANCH}${PR_BRANCH}" >> $GITHUB_OUTPUT
echo "image-tag-branch-version=${REPOSITORY}:${BRANCH}${PR_BRANCH}-${VERSION}" >> $GITHUB_OUTPUT
echo "image-tag-branch-sha=${REPOSITORY}:${BRANCH}${PR_BRANCH}-${SHA:0:7}" >> $GITHUB_OUTPUT
if [[ $(./semver validate "${VERSION}") == "valid" ]]; then
echo "image-tag-branch-semver-major=${REPOSITORY}:${BRANCH}${PR_BRANCH}-v$(./semver get major ${VERSION})" >> $GITHUB_OUTPUT
echo "image-tag-branch-semver-major-minor=${REPOSITORY}:${BRANCH}${PR_BRANCH}-v$(./semver get major ${VERSION}).$(./semver get minor ${VERSION})" >> $GITHUB_OUTPUT
echo "image-tag-branch-semver-major-minor-patch=${REPOSITORY}:${BRANCH}${PR_BRANCH}-v$(./semver get major ${VERSION}).$(./semver get minor ${VERSION}).$(./semver get patch ${VERSION})" >> $GITHUB_OUTPUT
fi
[[ $(jq -r '.latest // empty' < VERSION.json) == true ]] && echo "image-tag-latest=${REPOSITORY}:latest" >> $GITHUB_OUTPUT
- name: Login to ghcr.io
if: (needs.build.result == 'success')
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Create Manifests
if: (needs.build.result == 'success')
uses: nick-fields/retry@v3
env:
DOCKER_CLI_EXPERIMENTAL: enabled
REGISTRY: ghcr.io
IMAGE_TAG_FULL_AMD64: ${{ steps.prep.outputs.image-tag-full-amd64 }}
IMAGE_TAG_FULL_ARM64: ${{ steps.prep.outputs.image-tag-full-arm64 }}
IMAGE_TAG_LATEST: ${{ steps.prep.outputs.image-tag-latest }}
IMAGE_TAG_BRANCH: ${{ steps.prep.outputs.image-tag-branch }}
IMAGE_TAG_BRANCH_VERSION: ${{ steps.prep.outputs.image-tag-branch-version }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR: ${{ steps.prep.outputs.image-tag-branch-semver-major }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR: ${{ steps.prep.outputs.image-tag-branch-semver-major-minor }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR_PATCH: ${{ steps.prep.outputs.image-tag-branch-semver-major-minor-patch }}
IMAGE_TAG_BRANCH_SHA: ${{ steps.prep.outputs.image-tag-branch-sha }}
with:
max_attempts: 3
timeout_minutes: 5
retry_wait_seconds: 30
command: |
if [[ -n "${IMAGE_TAG_FULL_AMD64}" ]]; then
IMAGE_TAG_FULL_AMD64=${REGISTRY}/${IMAGE_TAG_FULL_AMD64}
fi
if [[ -n "${IMAGE_TAG_FULL_ARM64}" ]]; then
IMAGE_TAG_FULL_ARM64=${REGISTRY}/${IMAGE_TAG_FULL_ARM64}
fi
echo "${REGISTRY}/${IMAGE_TAG_BRANCH} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" > manifest.list
echo "${REGISTRY}/${IMAGE_TAG_BRANCH_VERSION} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
echo "${REGISTRY}/${IMAGE_TAG_BRANCH_SHA} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
if [[ -n "${IMAGE_TAG_LATEST}" ]]; then
echo "${REGISTRY}/${IMAGE_TAG_LATEST} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
fi
if [[ -n "${IMAGE_TAG_BRANCH_SEMVER_MAJOR}" ]]; then
echo "${REGISTRY}/${IMAGE_TAG_BRANCH_SEMVER_MAJOR} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
echo "${REGISTRY}/${IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
echo "${REGISTRY}/${IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR_PATCH} ${IMAGE_TAG_FULL_AMD64} ${IMAGE_TAG_FULL_ARM64}" >> manifest.list
fi
while read manifest; do
docker manifest create $(awk '{print $1}' <<< ${manifest}) $(awk '{print $2}' <<< ${manifest}) $(awk '{print $3}' <<< ${manifest})
done < manifest.list
on_retry_command:
while read manifest; do
docker manifest rm $(awk '{print $1}' <<< ${manifest}) || true
done < manifest.list
- name: Push Manifests
if: (needs.build.result == 'success')
uses: nick-fields/retry@v3
env:
DOCKER_CLI_EXPERIMENTAL: enabled
with:
max_attempts: 3
timeout_minutes: 5
retry_wait_seconds: 30
command: |
while read manifest; do
docker manifest push $(awk '{print $1}' <<< ${manifest})
done < manifest.list
- name: Update tags
if: (needs.build.result == 'success')
id: update-tags
uses: nick-fields/retry@v3
env:
PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
RUN_ID: ${{ github.run_id }}
IMAGE: ${{ matrix.image }}
REPOSITORY_OWNER: ${{ github.repository_owner }}
REPOSITORY: ${{ github.repository }}
REPOSITORY_WEBSITE: ${{ github.repository_owner }}/website
SERVER_URL: ${{ github.server_url }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
WORKSPACE: ${{ github.workspace }}
COMMIT_SHA: ${{ steps.prep.outputs.revision }}
IS_LATEST: ${{ steps.prep.outputs.is-latest }}
DESCRIPTION: ${{ steps.prep.outputs.description }}
HIDE: ${{ steps.prep.outputs.hide }}
CREATED: ${{ steps.prep.outputs.created }}
IMAGE_TAG_BRANCH: ${{ steps.prep.outputs.image-tag-branch }}
IMAGE_TAG_BRANCH_VERSION: ${{ steps.prep.outputs.image-tag-branch-version }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR: ${{ steps.prep.outputs.image-tag-branch-semver-major }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR: ${{ steps.prep.outputs.image-tag-branch-semver-major-minor }}
IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR_PATCH: ${{ steps.prep.outputs.image-tag-branch-semver-major-minor-patch }}
IMAGE_TAG_BRANCH_SHA: ${{ steps.prep.outputs.image-tag-branch-sha }}
with:
max_attempts: 3
timeout_minutes: 5
retry_wait_seconds: 30
command: |
rm -rf "${WORKSPACE}/website"
git clone -b "master" "https://${PERSONAL_TOKEN}@github.com/${REPOSITORY_WEBSITE}.git" "${WORKSPACE}/website"
cd "${WORKSPACE}/website" || exit 1
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
IMAGE=$(dirname "${IMAGE}")
GHCR_REPOSITORY="${REPOSITORY_OWNER}/${IMAGE}"
WEB_FILE="docs/containers/${IMAGE}.md"
JSON_FILE="docs/containers/${IMAGE}-tags.json"
[[ ! -f "${JSON_FILE}" ]] && echo "{}" > "${JSON_FILE}"
json=$(cat ${JSON_FILE})
jq --sort-keys \
--arg tag "${IMAGE_TAG_BRANCH/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_value "${IMAGE_TAG_BRANCH/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_version_value "${IMAGE_TAG_BRANCH_VERSION/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_semver_major_value "${IMAGE_TAG_BRANCH_SEMVER_MAJOR/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_semver_major_minor_value "${IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_semver_major_minor_patch_value "${IMAGE_TAG_BRANCH_SEMVER_MAJOR_MINOR_PATCH/$GHCR_REPOSITORY:/}" \
--arg image_tag_branch_sha_value "${IMAGE_TAG_BRANCH_SHA/$GHCR_REPOSITORY:/}" \
--arg last_updated "${CREATED}" \
--arg last_updated_url "${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}" \
--arg commit_message "${COMMIT_MESSAGE}" \
--arg commit_sha "${COMMIT_SHA}" \
--argjson latest "${IS_LATEST}" \
--arg description "${DESCRIPTION}" \
--argjson hide "${HIDE}" \
'.[$tag].tags[0] = $image_tag_branch_value | .[$tag].tags[1] = $image_tag_branch_version_value | .[$tag].tags[2] = $image_tag_branch_sha_value | .[$tag].tags[3] = $image_tag_branch_semver_major_value | .[$tag].tags[4] = $image_tag_branch_semver_major_minor_value | .[$tag].tags[5] = $image_tag_branch_semver_major_minor_patch_value | .[$tag].last_updated = $last_updated | .[$tag].commit_message = $commit_message | .[$tag].commit_sha = $commit_sha | .[$tag].latest = $latest | .[$tag].description = $description | .[$tag].last_updated_url = $last_updated_url | .[$tag].hide = $hide' <<< "${json}" | tee ${JSON_FILE}
[[ ! -f ${WEB_FILE} ]] && exit 0
table_html="<tbody id=\"tags-table-body\">\n"
tags_json=$(cat "${JSON_FILE}")
branches=$(jq -r 'keys[]' <<< "${tags_json}")
while IFS= read -r branch; do
hide=$(jq -r --arg branch "${branch}" '.[$branch].hide' <<< "${tags_json}")
[[ ${hide} == "true" ]] && continue
commit_message=$(jq -r --arg branch "${branch}" '.[$branch].commit_message' <<< "${tags_json}")
commit_sha=$(jq -r --arg branch "${branch}" '.[$branch].commit_sha' <<< "${tags_json}")
[[ "${commit_sha}" != "null" ]] && commit_message="<a href=\"https://github.com/${REPOSITORY}/commit/${commit_sha}\" target=\"_blank\">${commit_message}</a>"
description=$(jq -r --arg branch "${branch}" '.[$branch].description' <<< "${tags_json}")
last_updated=$(jq -r --arg branch "${branch}" '.[$branch].last_updated' <<< "${tags_json}")
last_updated=$(date --utc --date "${last_updated}" +"%Y-%m-%d %H:%M:%S")
last_updated_url=$(jq -r --arg branch "${branch}" '.[$branch].last_updated_url' <<< "${tags_json}")
[[ "${last_updated_url}" != "null" ]] && last_updated="<a href=\"${last_updated_url}\" target=\"_blank\">${last_updated}</a>"
latest=$(jq -r --arg branch "${branch}" '.[$branch].latest' <<< "${tags_json}")
tags_html=""
[[ ${latest} == "true" ]] && tags_html+="<div class=\"tag-decoration-latest\">latest</div>"
tags=$(jq -r --arg branch "${branch}" '.[$branch].tags[]' <<< "${tags_json}")
while IFS= read -r single_tag; do
tagID="${RANDOM}"
tags_html+="<div id=\"tag${tagID}\" onclick=\"CopyToClipboard('tag${tagID}');return false;\" class=\"tag-decoration\">${single_tag}</div>"
done <<< "${tags}"
table_html+="<tr><td>${tags_html}</td><td>${description}</td><td>${commit_message}</td><td>${last_updated}</td></tr>\n"
done <<< "${branches}"
table_html+="</tbody>"
sed -i -z -e "s#<tbody id=\"tags-table-body\">.*</tbody>#${table_html}#" "${WEB_FILE}"
echo "${table_html}"
git add "${WEB_FILE}"
git add "${JSON_FILE}"
if git commit -m "Update Tags for [${GHCR_REPOSITORY}]"; then
git push
fi
- name: Send Discord Notification
if: always()
uses: nick-fields/retry@v3
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
DISCORD_MENTIONS: ${{ vars.DISCORD_MENTIONS }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
RUN_ID: ${{ github.run_id }}
IMAGE: ${{ matrix.image }}
REPOSITORY_OWNER: ${{ github.repository_owner }}
REPOSITORY: ${{ github.repository }}
SERVER_URL: ${{ github.server_url }}
SHA: ${{ github.sha }}
IMAGE_TAG_BRANCH: ${{ steps.prep.outputs.image-tag-branch }}
VERSION: ${{ steps.prep.outputs.version }}
CREATED: ${{ steps.prep.outputs.created }}
STATUS: ${{ steps.update-tags.outcome }}
with:
max_attempts: 3
timeout_minutes: 5
retry_wait_seconds: 30
command: |
IMAGE=$(dirname "${IMAGE}")
GHCR_REPOSITORY="${REPOSITORY_OWNER}/${IMAGE}"
[[ "${STATUS}" == "success" ]] && COLOR="3066993"
[[ "${STATUS}" != "success" ]] && MENTIONS="${DISCORD_MENTIONS}"
json=$(jq -nc --arg discord_mentions "${MENTIONS}" \
--arg title "${IMAGE_TAG_BRANCH}" \
--arg url "${SERVER_URL}/${GHCR_REPOSITORY}/actions/runs/${RUN_ID}" \
--argjson color "${COLOR:-15158332}" \
--arg commit_message "\`\`\`${COMMIT_MESSAGE:----}\`\`\`" \
--arg commit_sha_link "[${SHA:0:7}](${SERVER_URL}/${GHCR_REPOSITORY}/commit/${SHA})" \
--arg version "${VERSION:----}" \
--arg timestamp "${CREATED}" \
'{"content": $discord_mentions,
"embeds": [
{
"title": $title,
"url": $url,
"color": $color,
"fields": [
{
"name": "Commit Message",
"value": $commit_message
},
{
"name": "Commit SHA",
"value": $commit_sha_link,
"inline": true
},
{
"name": "Version",
"value": $version,
"inline": true
}
],
"footer": {"text": "Powered by GitHub Actions"},
"timestamp": $timestamp
}
]}')
jq <<< "${json}"
curl -fsSL --retry 5 -H "Content-Type: multipart/form-data" -F "payload_json=${json}" "${DISCORD_WEBHOOK}" > /dev/null