Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions .github/actions/build-and-tag-locally/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -249,22 +249,31 @@ runs:
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Save image URL to artifact
- name: Save image metadata to artifact
shell: bash
run: |
if [[ "${{ inputs.publish_image }}" == "true" && "${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }}" == "true" ]]; then
# Create a file with the image URL for this specific build
mkdir -p /tmp/image-urls
echo "${{ steps.format-registry-tag.outputs.tag }}" > "/tmp/image-urls/${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}.txt"
echo "Image URL saved: ${{ steps.format-registry-tag.outputs.tag }}"
if [[ "${{ inputs.publish_image }}" == "true" && "${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }}" == "true" ]]; then
# Create a JSON file with structured image metadata
mkdir -p /tmp/image-metadata
cat > "/tmp/image-metadata/${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}.json" << 'EOF'
{
"version": "${{ inputs.release_tag }}",
"arch": "${{ steps.platform.outputs.display_name }}",
"distro": "${{ inputs.distribution }}",
"commit": "${{ github.sha }}",
"url": "${{ steps.format-registry-tag.outputs.tag }}"
}
EOF
echo "Image metadata saved:"
cat "/tmp/image-metadata/${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}.json"
else
echo "Image not published for this platform/distribution combination"
fi

- name: Upload image URL artifact
- name: Upload image metadata artifact
uses: actions/upload-artifact@v4
if: ${{ inputs.publish_image == 'true' && contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }}
with:
name: image-url-${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}
path: /tmp/image-urls/${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}.txt
name: image-metadata-${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}
path: /tmp/image-metadata/${{ inputs.distribution }}-${{ steps.platform.outputs.display_name }}.json
retention-days: 1
12 changes: 4 additions & 8 deletions .github/actions/common/func.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,10 @@ redis_version_split() {
printf "%s:%s:%s:%s\n" "$major" "$minor" "$patch" "$suffix"
}

slack_format_docker_image_urls_message() {
# Parse the image URLs from JSON array
slack_format_docker_images_metadata_message() {
# Format the structured images metadata into a Slack message
jq --arg release_tag "$1" --arg footer "$2" '
map(
capture("(?<url>(?<prefix>[^:]+:)(?<version>[1-9][0-9]*[.][0-9]+[.][0-9]+(-[a-z0-9]+)*)-(?<commit>[a-f0-9]{40,})-(?<distro>[^-]+)-(?<arch>[^-]+))$")
)
as $items
| {
{
icon_emoji: ":redis-circle:",
text: ("🐳 Docker Images Published for Redis: " + $release_tag),
blocks: [
Expand All @@ -66,7 +62,7 @@ slack_format_docker_image_urls_message() {
"text": (
"The following Docker images have been published to Github Container Registry:\n\n" +
(
$items
.
| map(
"Distribution: *" + .distro + "* "
+ "Architecture: *" + .arch + "*"
Expand Down
45 changes: 23 additions & 22 deletions .github/workflows/pre-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ on:
type: boolean
default: false
outputs:
docker_image_urls:
description: 'Array of Docker image URLs that were published'
value: ${{ jobs.collect-image-urls.outputs.docker_image_urls }}
docker_images_metadata:
description: 'Array of structured Docker images metadata that were published'
value: ${{ jobs.collect-images-metadata.outputs.docker_images_metadata }}

jobs:
build-and-test:
Expand Down Expand Up @@ -69,56 +69,57 @@ jobs:
registry_repository: ${{ format('ghcr.io/{0}', github.repository) }}
release_tag: ${{ inputs.release_tag }}

collect-image-urls:
collect-images-metadata:
runs-on: ubuntu-latest
needs: build-and-test
if: ${{ inputs.release_tag }}
outputs:
docker_image_urls: ${{ steps.collect-urls.outputs.urls }}
docker_images_metadata: ${{ steps.collect-metadata.outputs.metadata }}
steps:
- name: Download all image URL artifacts
- name: Download all images metadata artifacts
uses: actions/download-artifact@v4
with:
pattern: image-url-*
path: ./image-urls
pattern: image-metadata-*
path: ./images-metadata
merge-multiple: true

- name: Collect image URLs from artifacts
id: collect-urls
- name: Collect images metadata from artifacts
id: collect-metadata
run: |
if [ -d "./image-urls" ] && [ "$(ls -A ./image-urls 2>/dev/null)" ]; then
echo "Found image URL files:"
urls=$(find ./image-urls -name "*.txt" -exec cat {} \; | jq -R -s -c 'split("\n") | map(select(length > 0))')
echo "Collected image URLs: $urls"
if [ -d "./images-metadata" ] && [ "$(ls -A ./images-metadata 2>/dev/null)" ]; then
echo "Found images metadata files:"
# Collect all JSON files and merge them into a single array
metadata=$(find ./images-metadata -name "*.json" -exec cat {} \; | jq -s -c '.')
echo "Collected images metadata: $metadata"
else
echo "No image URL artifacts found"
urls="[]"
echo "No images metadata artifacts found"
metadata="[]"
fi

echo "urls=$urls" >> "$GITHUB_OUTPUT"
echo "metadata=$metadata" >> "$GITHUB_OUTPUT"

notify-slack:
runs-on: ubuntu-latest
needs: collect-image-urls
if: ${{ inputs.release_tag && needs.collect-image-urls.outputs.docker_image_urls != '[]' }}
needs: collect-images-metadata
if: ${{ inputs.release_tag && needs.collect-images-metadata.outputs.docker_images_metadata != '[]' }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Send Slack notification
run: |
image_urls='${{ needs.collect-image-urls.outputs.docker_image_urls }}'
images_metadata='${{ needs.collect-images-metadata.outputs.docker_images_metadata }}'
workflow_url="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
footer="Repository: ${{ github.repository }} | Commit: \`${{ github.sha }}\` | View: <$workflow_url|workflow run>"

. ${GITHUB_WORKSPACE}/.github/actions/common/func.sh

echo "$image_urls" | slack_format_docker_image_urls_message "${{ inputs.release_tag }}" "$footer" \
echo "$images_metadata" | slack_format_docker_images_metadata_message "${{ inputs.release_tag }}" "$footer" \
| curl -s --fail-with-body -d@- "${{ secrets.SLACK_WEB_HOOK_URL }}"

notify-slack-when-failed:
runs-on: ubuntu-latest
needs: collect-image-urls
needs: collect-images-metadata
if: ${{ inputs.release_tag && failure() }}
steps:
- name: Checkout code
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/release_build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,31 +95,31 @@ jobs:
exit 1
fi

# Get docker image URLs from build-and-test job
DOCKER_IMAGE_URLS='${{ needs.build-and-test.outputs.docker_image_urls }}'
# Get docker images metadata from build-and-test job
DOCKER_IMAGES_METADATA='${{ needs.build-and-test.outputs.docker_images_metadata }}'

# Validate that DOCKER_IMAGE_URLS is valid JSON
if ! echo "$DOCKER_IMAGE_URLS" | jq . > /dev/null 2>&1; then
echo "Warning: docker_image_urls is not valid JSON, using empty array"
DOCKER_IMAGE_URLS="[]"
# Validate that DOCKER_IMAGES_METADATA is valid JSON
if ! echo "$DOCKER_IMAGES_METADATA" | jq . > /dev/null 2>&1; then
echo "Warning: docker_images_metadata is not valid JSON, using empty array"
DOCKER_IMAGES_METADATA="[]"
fi

cat > release_handle.json << EOF
cat > result.json << EOF
{
"release_commit_sha": "$RELEASE_COMMIT_SHA",
"release_version": "${{ github.event.inputs.release_tag }}",
"release_version_branch": "${{ steps.ensure-branch.outputs.release_version_branch }}",
"release_branch": "${{ steps.ensure-branch.outputs.release_branch }}",
"docker_image_urls": $DOCKER_IMAGE_URLS
"docker_images_metadata": $DOCKER_IMAGES_METADATA
}
EOF

echo "Created release_handle.json:"
cat release_handle.json
echo "Created result.json for release_handle:"
cat result.json

- name: Upload release handle artifact
uses: actions/upload-artifact@v4
with:
name: release_handle
path: release_handle.json
path: result.json
retention-days: 400