Github actions

Workflow to promote latest -rc image to release

# It's expected that when the new release candidate tag x.y.z is added by this workflow 
# to the latest x.y.z-rc image, a deployment is triggered to PRO environment
name: Promote Latest RC Images to Release. Deploy to prod.

on:
  workflow_dispatch:

permissions:
  contents: read
  id-token: write

jobs:
  promote-images:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        repository: 
          - atoss-identity-secrets-setup
          - atoss-identity-svc

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::XXXXXXXXXX:role/github/atoss-identity-deploy-role
          aws-region: eu-central-1

      - name: Promote rc image to release
        uses: ./.github/workflows/actions/promote-latest-rc-img-to-release
        with:
          repository: ${{ matrix.repository }}
          region: eu-central-1

      - name: Output the promoted tags
        run: |
          echo "Promoted rc tag: ${{ steps.promote-image.outputs.rc_tag }}"
          echo "Release tag: ${{ steps.promote-image.outputs.release_tag }}"          

And the reusable action in folder /.github/workflows/actions/promote-latest-rc-img-to-release

# /Dockerfile
FROM amazonlinux:2
RUN yum install -y jq aws-cli docker
COPY action.sh /action.sh
RUN chmod +x /action.sh

ENTRYPOINT ["/action.sh"]
# action.yaml
name: Promote ECR RC Image to Release
description: Adds x.y.z tag to the latest x.y.z-rc image in an AWS ECR repository.
inputs:
  repository:
    description: 'ECR repository name'
    required: true
  region:
    description: 'AWS region'
    required: true
outputs:
  rc_tag:
    description: 'The RC tag that was promoted'
  release_tag:
    description: 'The release tag'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.repository }}
    - ${{ inputs.region }}
# action.sh

#!/bin/bash

set -e

ECR_REPOSITORY=$1
REGION=$2

aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com"

# List all images in the repository into images.json file
aws ecr describe-images --repository-name "$ECR_REPOSITORY" --region "$REGION" --query 'imageDetails[*].imageTags' --output json > images.json

LATEST_RC_TAG=$(jq -r '.[] | select(.[0] | test("^[0-9]+\\.[0-9]+\\.[0-9]+-rc$")) | .[0]' images.json | sort -Vr | head -n 1)

echo "Latest RC image found "$LATEST_RC_TAG

# Remove `-rc` to get release version
RELEASE_VERSION=$(echo "$LATEST_RC_TAG" | sed 's/-rc//')

RELEASE_VERSION_EXISTS=$(jq -e '.[] | any(.[] == "'"$RELEASE_VERSION"'")' images.json > /dev/null && echo "true" || echo "false")

if [ "$RELEASE_VERSION_EXISTS" = "true" ]; then
  echo "Release tag $RELEASE_VERSION already exists. Skipping retagging."
  echo "::set-output name=rc_tag::$LATEST_RC_TAG"
  echo "::set-output name=release_tag::$RELEASE_VERSION"
  exit 0
fi

# Pull the latest rc image
docker pull "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$ECR_REPOSITORY:$LATEST_RC_TAG"

# Tag the rc image with the release version
docker tag "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$ECR_REPOSITORY:$LATEST_RC_TAG" \
  "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$ECR_REPOSITORY:$RELEASE_VERSION"

# Push the new release image
docker push "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$ECR_REPOSITORY:$RELEASE_VERSION"

# Set outputs
echo "::set-output name=rc_tag::$LATEST_RC_TAG"
echo "::set-output name=release_tag::$RELEASE_VERSION"