mirror of
https://github.com/hotio/build-workflow.git
synced 2026-01-09 06:33:35 +08:00
yolo
This commit is contained in:
parent
39c4408779
commit
eed87f2864
408
.github/workflows/build-one-branch-test.yml
vendored
408
.github/workflows/build-one-branch-test.yml
vendored
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user