Skip to content

Azure: AlmaLinux 10 Build, Release, Test, Publish #8

Azure: AlmaLinux 10 Build, Release, Test, Publish

Azure: AlmaLinux 10 Build, Release, Test, Publish #8

name: "Azure: Build, Release, Test, Publish"
run-name: >-
Azure: AlmaLinux ${{ inputs.version_major == '10-kitten' && 'Kitten 10' || inputs.version_major }} Build, Release, Test, Publish
# Unified Azure pipeline: build the .raw images with Packer, release each
# built image to the Compute Gallery directly from the build runner (no S3
# round-trip), boot-test every gallery-released image, and publish every
# image that passed its test to the Azure Marketplace.
#
# The pipeline is three INDEPENDENT per-image chains
#
# build-x86_64 -> test-x86_64 -> publish-x86_64
# build-aarch64 -> test-aarch64 -> publish-aarch64
# build-aarch64-64k -> test-aarch64-64k -> publish-aarch64-64k
#
# rather than build-matrix -> collect -> test-matrix -> collect -> publish:
# with per-image chains, "Re-run failed jobs" re-runs ONLY the failed
# image's own downstream jobs - a sibling image that already tested and
# published is not re-tested and, above all, not re-published. Each build
# leg's gallery stage uploads an azure-manifest-<variant>-<arch>.json
# artifact; the image's test job downloads it (artifacts survive re-run
# attempts, so a re-run test needs no re-build) and exposes its fields as
# job outputs for the publish job.
#
# The aarch64 and aarch64-64k images share the almalinux-arm Marketplace
# offer, and parallel Product Ingestion configure calls collide on the
# offer's draft revision - their publish jobs are serialised through a
# run-scoped concurrency group (two jobs at most: one runs, one queues).
#
# Stage gating:
# release_to_gallery=false -> build-only run (gallery / test / publish skip)
# release_to_marketplace=false -> build + gallery + test (publish skips)
# submit_to_preview=true -> only honored when release_to_marketplace=true
#
# Stage implementations live in composite actions:
# .github/actions/shared-steps - Packer build (all clouds)
# .github/actions/azure-gallery-steps - tools/azure_uploader.sh wrapper
# .github/actions/azure-test-steps - gallery image boot test
# .github/actions/azure-marketplace-steps - Partner Center publish
on:
workflow_dispatch:
inputs:
date_time_stamp:
description: 'Custom date+time stamp, YYYYMMDDhhmmss'
required: false
default: ''
version_major:
description: 'AlmaLinux major version'
required: true
default: '10'
type: choice
options:
- 10-kitten
- 10
- 9
- 8
self-hosted:
description: "Build aarch64 image on self-hosted runner"
required: true
type: boolean
default: true
store_as_artifact:
description: "Store images to the workflow Artifacts"
required: true
type: boolean
default: false
upload_to_s3:
description: "Upload to S3 Bucket"
required: true
type: boolean
default: true
release_to_gallery:
description: "Release to Compute Gallery (gates test and publish)"
required: true
type: boolean
default: true
community_gallery:
description: "Use Community gallery (AlmaLinux 10/Kitten always go Private)"
required: true
type: boolean
default: true
release_to_marketplace:
description: "Publish tested images to Marketplace as drafts"
required: true
type: boolean
default: true
submit_to_preview:
description: "Also submit drafts to Preview/certification"
required: true
type: boolean
default: false
notify_mattermost:
description: "Send notification to Mattermost"
required: true
type: boolean
default: true
env:
PACKER_GITHUB_API_TOKEN: ${{ secrets.GIT_HUB_TOKEN }}
jobs:
init-data:
name: Initialize common data
runs-on: ubuntu-24.04
outputs:
time_stamp: ${{ steps.date-time-stamp.outputs.time_stamp }}
date_stamp: ${{ steps.date-time-stamp.outputs.date_stamp }}
steps:
- name: Date+time stamp
id: date-time-stamp
run: |
# date+time stamp, YYYYMMDDhhmmss
if [ "${{ inputs.date_time_stamp }}" != "" ]; then
date_time_stamp="${{ inputs.date_time_stamp }}"
else
date_time_stamp=$(date -u '+%Y%m%d%H%M%S')
fi
echo "time_stamp=${date_time_stamp}" >> $GITHUB_OUTPUT
# date stamp, YYYYMMDD
date_stamp=${date_time_stamp:0:-6}
echo "date_stamp=${date_stamp}" >> "$GITHUB_OUTPUT"
build-x86_64:
name: Build (and release) x86_64
permissions:
id-token: write
contents: read
needs: [init-data]
# use runs-on runners if within the almalinux org, otherwise GH runners.
# volume=80g: the gallery stage converts the 30 GiB .raw to a fixed VHD on
# the same volume, roughly doubling the image footprint - leave headroom.
runs-on: >-
${{
github.repository_owner == 'AlmaLinux' &&
format('runs-on={0}/family=r8i.2xlarge/image=ubuntu24-full-x64/volume=80g/nested-virt/spot=false', github.run_id)
||
'ubuntu-24.04'
}}
env:
TIME_STAMP: ${{ needs.init-data.outputs.time_stamp }}
DATE_STAMP: ${{ needs.init-data.outputs.date_stamp }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/shared-steps
name: ${{ inputs.version_major }} azure-x86_64 image
with:
type: azure
variant: ${{ inputs.version_major }}
arch: x86_64
S3_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ vars.AWS_REGION }}
AWS_S3_BUCKET: ${{ vars.AWS_S3_BUCKET }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
store_as_artifact: ${{ inputs.store_as_artifact }}
upload_to_s3: ${{ inputs.upload_to_s3 }}
notify_mattermost: ${{ inputs.notify_mattermost }}
run_test: 'false'
runner: ${{ github.repository_owner == 'AlmaLinux' && 'aws-ec2' || 'gh_hosted' }}
env:
PACKER_GITHUB_API_TOKEN: ${{ secrets.GIT_HUB_TOKEN }}
- uses: ./.github/actions/azure-gallery-steps
name: Release ${{ inputs.version_major }} azure-x86_64 image to Gallery
if: ${{ inputs.release_to_gallery }}
with:
image_file: ${{ env.IMAGE_FILE }}
variant: ${{ inputs.version_major }}
arch: x86_64
community_gallery: ${{ inputs.community_gallery }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
# The job is to start self-hosted runner on AWS EC2 instance if not in the almalinux org
# It does nothing if in the almalinux org, so 'Setup and start runner' step is skipped
start-self-hosted-runner:
name: Start self-hosted runner(s)
if: ${{ inputs.self-hosted }}
runs-on: ubuntu-24.04
needs: [init-data]
strategy:
fail-fast: false
matrix:
variant: >-
${{ fromJSON(
( inputs.version_major == '9' || inputs.version_major == '10' || inputs.version_major == '10-kitten' )
&& format('["{0}", "{0}-64k"]', inputs.version_major)
|| format('["{0}"]', inputs.version_major)
) }}
steps:
- name: Setup and start runner
if: github.repository_owner != 'AlmaLinux'
uses: unblocked/ec2-action-builder@v1.12
with:
github_token: ${{ secrets.GIT_HUB_TOKEN }}
aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws_region: ${{ vars.AWS_REGION }}
ec2_ami_id: ${{ secrets.EC2_AMI_ID_AL9_AARCH64 }}
ec2_subnet_id: ${{ secrets.EC2_SUBNET_ID}} # Subnet and Security Group should match
ec2_security_group_id: ${{ secrets.EC2_SECURITY_GROUP_ID }} # Availability Zones list for 'a1.metal' Instance Type
ec2_instance_type: a1.metal
ec2_root_disk_size_gb: "80" # the gallery stage needs room for the raw image + its fixed-VHD conversion
ec2_root_disk_ebs_class: "gp3" # use faster and cheeper storage instead of default 'gp2'
ec2_instance_ttl: 30 # Optional (default is 60 minutes)
ec2_spot_instance_strategy: None # Other options are: SpotOnly, BestEffort, MaxPerformance
ec2_instance_tags: > # Required for IAM role resource permission scoping
[
{"Key": "Project", "Value": "GitHub Actions Self-hosted Runners"}
]
build-aarch64:
name: Build (and release) aarch64
permissions:
id-token: write
contents: read
if: ${{ inputs.self-hosted }}
needs: [init-data, start-self-hosted-runner]
# If almalinux org, use RunsOn with almalinux-9-aarch64 on a1.metal.
# volume=80g (was 40g in azure-build.yml): the gallery stage converts the
# .raw to a fixed VHD on the same volume.
#
# Otherwise use AWS EC2 Self-Hosted aarch64 runner set up with the 'start-self-hosted-runner' job above
runs-on: >-
${{
github.repository_owner == 'AlmaLinux' &&
format('runs-on={0}/family=a1.metal/image=almalinux-9-aarch64/volume=80g/spot=false', github.run_id)
||
github.run_id
}}
env:
TIME_STAMP: ${{ needs.init-data.outputs.time_stamp }}
DATE_STAMP: ${{ needs.init-data.outputs.date_stamp }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/shared-steps
name: ${{ inputs.version_major }} azure-aarch64 image
with:
type: azure
variant: ${{ inputs.version_major }}
arch: aarch64
S3_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ vars.AWS_REGION }}
AWS_S3_BUCKET: ${{ vars.AWS_S3_BUCKET }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
store_as_artifact: ${{ inputs.store_as_artifact }}
upload_to_s3: ${{ inputs.upload_to_s3 }}
notify_mattermost: ${{ inputs.notify_mattermost }}
run_test: 'false'
runner: aws-ec2
env:
PACKER_GITHUB_API_TOKEN: ${{ secrets.GIT_HUB_TOKEN }}
- uses: ./.github/actions/azure-gallery-steps
name: Release ${{ inputs.version_major }} azure-aarch64 image to Gallery
if: ${{ inputs.release_to_gallery }}
with:
image_file: ${{ env.IMAGE_FILE }}
variant: ${{ inputs.version_major }}
arch: aarch64
community_gallery: ${{ inputs.community_gallery }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
build-aarch64-64k:
name: Build (and release) aarch64-64k
permissions:
id-token: write
contents: read
# the 64k page-size kernel variant exists for 9 / 10 / Kitten only
if: >-
${{
inputs.self-hosted &&
( inputs.version_major == '9' || inputs.version_major == '10' || inputs.version_major == '10-kitten' )
}}
needs: [init-data, start-self-hosted-runner]
runs-on: >-
${{
github.repository_owner == 'AlmaLinux' &&
format('runs-on={0}/family=a1.metal/image=almalinux-9-aarch64/volume=80g/spot=false', github.run_id)
||
github.run_id
}}
env:
TIME_STAMP: ${{ needs.init-data.outputs.time_stamp }}
DATE_STAMP: ${{ needs.init-data.outputs.date_stamp }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/shared-steps
name: ${{ inputs.version_major }}-64k azure-aarch64 image
with:
type: azure
variant: ${{ inputs.version_major }}-64k
arch: aarch64
S3_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ vars.AWS_REGION }}
AWS_S3_BUCKET: ${{ vars.AWS_S3_BUCKET }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
store_as_artifact: ${{ inputs.store_as_artifact }}
upload_to_s3: ${{ inputs.upload_to_s3 }}
notify_mattermost: ${{ inputs.notify_mattermost }}
run_test: 'false'
runner: aws-ec2
env:
PACKER_GITHUB_API_TOKEN: ${{ secrets.GIT_HUB_TOKEN }}
- uses: ./.github/actions/azure-gallery-steps
name: Release ${{ inputs.version_major }}-64k azure-aarch64 image to Gallery
if: ${{ inputs.release_to_gallery }}
with:
image_file: ${{ env.IMAGE_FILE }}
variant: ${{ inputs.version_major }}-64k
arch: aarch64
community_gallery: ${{ inputs.community_gallery }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
# Per-image test jobs. Each downloads its build leg's gallery manifest
# artifact (artifacts survive "Re-run failed jobs", so a re-run test needs
# no re-build) and exposes the manifest fields as job outputs for the
# matching publish job.
test-x86_64:
name: Test x86_64
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [build-x86_64]
if: ${{ inputs.release_to_gallery }}
outputs:
image_file: ${{ steps.manifest.outputs.image_file }}
blob_url: ${{ steps.manifest.outputs.blob_url }}
eligible: ${{ steps.manifest.outputs.eligible }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- name: Download gallery manifest
uses: actions/download-artifact@v7
with:
name: azure-manifest-${{ inputs.version_major }}-x86_64.json
path: manifest
- name: Read gallery manifest
id: manifest
run: |
# Read gallery manifest
f=$(ls manifest/azure-manifest-*.json)
jq '.' "${f}"
{
echo "test_path=$(jq -r '.test_path' "${f}")"
echo "image_file=$(jq -r '.image_file' "${f}")"
echo "blob_url=$(jq -r '.blob_url' "${f}")"
echo "eligible=$(jq -r '.marketplace_eligible' "${f}")"
} >> "$GITHUB_OUTPUT"
- uses: ./.github/actions/azure-test-steps
name: Test ${{ steps.manifest.outputs.test_path }}
with:
compute_gallery_path: ${{ steps.manifest.outputs.test_path }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
test-aarch64:
name: Test aarch64
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [build-aarch64]
if: ${{ inputs.release_to_gallery }}
outputs:
image_file: ${{ steps.manifest.outputs.image_file }}
blob_url: ${{ steps.manifest.outputs.blob_url }}
eligible: ${{ steps.manifest.outputs.eligible }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- name: Download gallery manifest
uses: actions/download-artifact@v7
with:
name: azure-manifest-${{ inputs.version_major }}-aarch64.json
path: manifest
- name: Read gallery manifest
id: manifest
run: |
# Read gallery manifest
f=$(ls manifest/azure-manifest-*.json)
jq '.' "${f}"
{
echo "test_path=$(jq -r '.test_path' "${f}")"
echo "image_file=$(jq -r '.image_file' "${f}")"
echo "blob_url=$(jq -r '.blob_url' "${f}")"
echo "eligible=$(jq -r '.marketplace_eligible' "${f}")"
} >> "$GITHUB_OUTPUT"
- uses: ./.github/actions/azure-test-steps
name: Test ${{ steps.manifest.outputs.test_path }}
with:
compute_gallery_path: ${{ steps.manifest.outputs.test_path }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
test-aarch64-64k:
name: Test aarch64-64k
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [build-aarch64-64k]
if: ${{ inputs.release_to_gallery }}
outputs:
image_file: ${{ steps.manifest.outputs.image_file }}
blob_url: ${{ steps.manifest.outputs.blob_url }}
eligible: ${{ steps.manifest.outputs.eligible }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- name: Download gallery manifest
uses: actions/download-artifact@v7
with:
name: azure-manifest-${{ inputs.version_major }}-64k-aarch64.json
path: manifest
- name: Read gallery manifest
id: manifest
run: |
# Read gallery manifest
f=$(ls manifest/azure-manifest-*.json)
jq '.' "${f}"
{
echo "test_path=$(jq -r '.test_path' "${f}")"
echo "image_file=$(jq -r '.image_file' "${f}")"
echo "blob_url=$(jq -r '.blob_url' "${f}")"
echo "eligible=$(jq -r '.marketplace_eligible' "${f}")"
} >> "$GITHUB_OUTPUT"
- uses: ./.github/actions/azure-test-steps
name: Test ${{ steps.manifest.outputs.test_path }}
with:
compute_gallery_path: ${{ steps.manifest.outputs.test_path }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
# Per-image publish jobs: each is gated on its OWN image's test succeeding
# and the manifest saying the image has a Marketplace plan.
publish-x86_64:
name: Publish to marketplace x86_64
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [test-x86_64]
if: ${{ inputs.release_to_marketplace && needs.test-x86_64.outputs.eligible == 'true' }}
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/azure-marketplace-steps
name: Publish ${{ needs.test-x86_64.outputs.image_file }} to Marketplace
with:
image_blob_url: ${{ needs.test-x86_64.outputs.blob_url }}
release_to_marketplace: 'true'
submit_to_preview: ${{ inputs.submit_to_preview }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
publish-aarch64:
name: Publish to marketplace aarch64
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [test-aarch64]
if: ${{ inputs.release_to_marketplace && needs.test-aarch64.outputs.eligible == 'true' }}
# aarch64 and aarch64-64k share the almalinux-arm offer; serialise their
# Product Ingestion configure calls (run-scoped group, two jobs at most)
concurrency:
group: azure-marketplace-arm-${{ github.run_id }}
cancel-in-progress: false
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/azure-marketplace-steps
name: Publish ${{ needs.test-aarch64.outputs.image_file }} to Marketplace
with:
image_blob_url: ${{ needs.test-aarch64.outputs.blob_url }}
release_to_marketplace: 'true'
submit_to_preview: ${{ inputs.submit_to_preview }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}
publish-aarch64-64k:
name: Publish to marketplace aarch64-64k
permissions:
id-token: write
contents: read
runs-on: ubuntu-24.04
needs: [test-aarch64-64k]
if: ${{ inputs.release_to_marketplace && needs.test-aarch64-64k.outputs.eligible == 'true' }}
concurrency:
group: azure-marketplace-arm-${{ github.run_id }}
cancel-in-progress: false
steps:
- name: Checkout ${{ github.action_repository }}
uses: actions/checkout@v6
- uses: ./.github/actions/azure-marketplace-steps
name: Publish ${{ needs.test-aarch64-64k.outputs.image_file }} to Marketplace
with:
image_blob_url: ${{ needs.test-aarch64-64k.outputs.blob_url }}
release_to_marketplace: 'true'
submit_to_preview: ${{ inputs.submit_to_preview }}
notify_mattermost: ${{ inputs.notify_mattermost }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
MATTERMOST_CHANNEL: ${{ vars.MATTERMOST_CHANNEL }}