Azure Images #520
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Azure Images | |
on: | |
schedule: | |
- cron: "45 4 * * *" | |
# push: | |
# branches: | |
# - main | |
workflow_dispatch: | |
inputs: | |
environment: | |
description: 'Choose your deployment target environment' | |
required: true | |
default: 'staging' | |
type: choice | |
options: | |
- 'production' | |
- 'staging' | |
permissions: | |
actions: write | |
contents: read | |
id-token: write | |
env: | |
AWS_DEFAULT_OUTPUT: json | |
AWS_PAGER: "" | |
jobs: | |
setup: | |
name: Setup workflow envs | |
runs-on: ubuntu-latest | |
outputs: | |
environment: ${{ steps.set-environment.outputs.environment }} | |
bucket: ${{ steps.set-bucket.outputs.bucket }} | |
steps: | |
# Only set target environment to production if the workflow is triggered by | |
# a scheduled execution or workflow_dispatch with production input selected | |
- name: Setup target environment | |
id: set-environment | |
run: | | |
if [ "${{ github.event_name }}" = "schedule" ] || [ "${{ inputs.environment }}" = "production" ]; then | |
echo "environment=production" >> $GITHUB_OUTPUT | |
else | |
echo "environment=staging" >> $GITHUB_OUTPUT | |
fi | |
- name: Setup target bucket | |
# Set target bucket according to target environment | |
id: set-bucket | |
run: | | |
if [ "${{ github.event_name }}" = "schedule" ] || [ "${{ inputs.environment }}" = "production" ]; then | |
echo "bucket=cloudx-json-bucket" >> $GITHUB_OUTPUT | |
else | |
echo "bucket=cid-bucket-staging" >> $GITHUB_OUTPUT | |
fi | |
list_regions: | |
name: "List Regions" | |
runs-on: ubuntu-latest | |
needs: setup | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
env: | |
ENVIRONMENT: ${{ needs.setup.outputs.environment }} | |
steps: | |
- name: Clone repo | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Checkout latest tagged release | |
if: env.ENVIRONMENT == 'production' | |
run: | | |
LATEST_RELEASE=$(git describe --tags `git rev-list --tags --max-count=1`) | |
git checkout $LATEST_RELEASE | |
- name: "Az CLI login" | |
uses: azure/login@v2 | |
with: | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Get Azure locations | |
run: | | |
az account list-locations | \ | |
jq -r '.[] | select(.metadata.regionCategory == "Recommended") | .name' | \ | |
grep -v euap | jq --raw-input --slurp 'split("\n") | sort | del(.[0])' \ | |
> regions.json | |
- name: Generate a list of regions for the actions matrix | |
id: set-matrix | |
run: | | |
export REGIONS=$(cat regions.json) | |
echo -n 'matrix={"region": ' >> $GITHUB_OUTPUT | |
echo -n $REGIONS >> $GITHUB_OUTPUT | |
echo '}' >> $GITHUB_OUTPUT | |
# Temporary short circuit because Azure's API is incredibly slow. 👀 | |
echo -n 'matrix={"region": ["eastus"]}' > $GITHUB_OUTPUT | |
list_images: | |
name: "List Images" | |
needs: [list_regions, setup] | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
max-parallel: 5 | |
matrix: ${{fromJSON(needs.list_regions.outputs.matrix)}} | |
env: | |
REGION: ${{ matrix.region }} | |
ENVIRONMENT: ${{ needs.setup.outputs.environment }} | |
steps: | |
- name: Clone repo | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Checkout latest tagged release | |
if: env.ENVIRONMENT == 'production' | |
run: | | |
LATEST_RELEASE=$(git describe --tags `git rev-list --tags --max-count=1`) | |
git checkout $LATEST_RELEASE | |
- name: "Az CLI login" | |
uses: azure/login@v2 | |
with: | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Write region data | |
uses: nick-fields/retry@v3 | |
with: | |
timeout_minutes: 15 | |
max_attempts: 3 | |
command: | | |
az vm image list --offer rh-rhel --publisher RedHat --all --only-show-errors -o json -l $REGION | jq -c > ${REGION}.json | |
zstd -v ${REGION}.json | |
- name: Store image data in artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "azure" | |
path: "${{ env.REGION }}.json.zst" | |
upload_data: | |
name: "Upload Data" | |
runs-on: ubuntu-latest | |
needs: [list_images, setup] | |
env: | |
ENVIRONMENT: ${{ needs.setup.outputs.environment }} | |
BUCKET: ${{ needs.setup.outputs.bucket }} | |
steps: | |
- name: Clone repo | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Checkout latest tagged release | |
if: env.ENVIRONMENT == 'production' | |
run: | | |
LATEST_RELEASE=$(git describe --tags `git rev-list --tags --max-count=1`) | |
git checkout $LATEST_RELEASE | |
- name: Download image data artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: raw | |
- name: Install awscli v2 | |
uses: unfor19/install-aws-cli-action@v1 | |
- name: Configure AWS credentials for production | |
uses: aws-actions/configure-aws-credentials@v4 | |
if: env.ENVIRONMENT == 'production' | |
with: | |
role-to-assume: arn:aws:iam::426579533370:role/github_actions_image_retriever | |
role-duration-seconds: 1800 | |
aws-region: us-east-1 | |
- name: Configure AWS credentials for staging | |
uses: aws-actions/configure-aws-credentials@v4 | |
if: env.ENVIRONMENT == 'staging' | |
with: | |
role-to-assume: arn:aws:iam::426579533370:role/github_actions_cloud_image_directory_staging | |
role-duration-seconds: 1800 | |
aws-region: us-east-1 | |
- name: Decompress artifacts | |
run: | | |
pushd raw/azure | |
zstd -vd --rm * | |
popd | |
- name: Upload raw data to S3 | |
run: | | |
aws s3 sync \ | |
--acl public-read \ | |
--delete \ | |
--no-progress \ | |
--content-type application/json \ | |
$(pwd)/raw/azure/ s3://${BUCKET}/raw/azure/ |