diff --git a/.github/actions/build-and-tag-locally/action.yml b/.github/actions/build-and-tag-locally/action.yml index 34b0caa47..56d83475f 100644 --- a/.github/actions/build-and-tag-locally/action.yml +++ b/.github/actions/build-and-tag-locally/action.yml @@ -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 diff --git a/.github/actions/common/func.sh b/.github/actions/common/func.sh index ae727dcea..62a5efb7d 100644 --- a/.github/actions/common/func.sh +++ b/.github/actions/common/func.sh @@ -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("(?(?[^:]+:)(?[1-9][0-9]*[.][0-9]+[.][0-9]+(-[a-z0-9]+)*)-(?[a-f0-9]{40,})-(?[^-]+)-(?[^-]+))$") - ) - as $items - | { + { icon_emoji: ":redis-circle:", text: ("🐳 Docker Images Published for Redis: " + $release_tag), blocks: [ @@ -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 + "*" diff --git a/.github/workflows/pre-merge.yml b/.github/workflows/pre-merge.yml index 2f363aff5..59e8eeab2 100644 --- a/.github/workflows/pre-merge.yml +++ b/.github/workflows/pre-merge.yml @@ -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: @@ -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 diff --git a/.github/workflows/release_build_and_test.yml b/.github/workflows/release_build_and_test.yml index 41299fb8d..36d555659 100644 --- a/.github/workflows/release_build_and_test.yml +++ b/.github/workflows/release_build_and_test.yml @@ -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 \ No newline at end of file