Skip to content

AUTO-UPDATE

AUTO-UPDATE #423

Workflow file for this run

name: AUTO-UPDATE
on:
schedule:
- cron: '0 2 * * *'
workflow_dispatch:
push:
branches:
- main
jobs:
check-and-update:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Fetch latest .NET versions
run: |
curl -s https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json > releases-index.json
echo "Fetched latest .NET versions"
- name: Check for updates
id: check-updates
run: |
latest_versions=$(jq -r '
[.["releases-index"][]
| select(.["support-phase"] == "active" and .["release-type"] == "lts")
| {majorminor: (.["channel-version"] | split(".")[0:2] | join(".")), sdk: .["latest-sdk"], runtime: .["latest-runtime"]}
]
| group_by(.majorminor)
| map({(.[0].majorminor): {sdk: .[0].sdk, runtime: .[0].runtime}})
| add
' releases-index.json)
jq -c '.[]' image-matrix.json | while read -r entry; do
current_net_version=$(echo "$entry" | jq -r '.netVersion')
current_sdk_version=$(echo "$entry" | jq -r '.sdkVersion')
current_runtime_version=$(echo "$entry" | jq -r '.runtimeVersion')
alpine_version=$(echo "$entry" | jq -r '.alpineVersion')
# Get the latest SDK and runtime for the major.minor version
latest_sdk_version=$(echo "$latest_versions" | jq -r --arg ver "$current_net_version" '.[$ver].sdk // empty')
latest_runtime_version=$(echo "$latest_versions" | jq -r --arg ver "$current_net_version" '.[$ver].runtime // empty')
# Check if updates are needed
if [[ -n "$latest_sdk_version" && "$latest_sdk_version" != "$current_sdk_version" ]] || [[ -n "$latest_runtime_version" && "$latest_runtime_version" != "$current_runtime_version" ]]; then
# Verify if the Alpine image exists
image="mcr.microsoft.com/dotnet/aspnet:${current_net_version}-alpine${alpine_version}"
if docker pull "$image" &>/dev/null; then
echo "Update needed for .NET $current_net_version: SDK $current_sdk_version -> $latest_sdk_version, Runtime $current_runtime_version -> $latest_runtime_version"
echo "$current_net_version:$latest_sdk_version:$latest_runtime_version:$alpine_version" >> updates.txt
else
echo "No Alpine image available for .NET $major_version with Alpine $alpine_version. Skipping update."
fi
fi
done
# Check if updates.txt exists and is not empty
if [[ -s updates.txt ]]; then
echo "update_needed=true" >> $GITHUB_ENV
else
echo "update_needed=false" >> $GITHUB_ENV
fi
- name: Update files
if: env.update_needed == 'true'
run: |
# Update image-matrix.json
while IFS=: read -r net_version sdk_version runtime_version alpine_version; do
sed -i "/\"netVersion\": \"${net_version}\"/,/}/s/\"sdkVersion\": \"[^\"]*\"/\"sdkVersion\": \"${sdk_version}\"/" image-matrix.json
sed -i "/\"netVersion\": \"${net_version}\"/,/}/s/\"runtimeVersion\": \"[^\"]*\"/\"runtimeVersion\": \"${runtime_version}\"/" image-matrix.json
done < updates.txt
echo "Updated image-matrix.json"
while IFS=: read -r net_version sdk_version runtime_version alpine_version; do
sed -i -E "s/^\\|[[:space:]]*${net_version}[[:space:]]*\\|[[:space:]]*[[:digit:].]+[[:space:]]*\\|[[:space:]]*[[:digit:].]+[[:space:]]*\\|[[:space:]]*${net_version}-alpine[[:digit:].]+[[:space:]]*\\|/| ${net_version} | ${sdk_version} | ${runtime_version} | ${net_version}-alpine${alpine_version} |/" README.md
done < updates.txt
echo "Updated README.md"
# Update JOB.env
current_defra_version=$(grep -oP 'DEFRA_VERSION=\K[\d.]+' JOB.env)
new_defra_version=$(echo "$current_defra_version" | awk -F. '{print $1"."$2"."$3+1}')
sed -i "s/DEFRA_VERSION=.*/DEFRA_VERSION=${new_defra_version}/" JOB.env
echo "Updated JOB.env"
# Update Dockerfile
latest_net_version=$(jq -r '.[] | select(.latest == true) | .netVersion' image-matrix.json)
latest_alpine_version=$(jq -r '.[] | select(.latest == true) | .alpineVersion' image-matrix.json)
sed -i "s/ARG BASE_VERSION=.*/ARG BASE_VERSION=${latest_net_version}-alpine${latest_alpine_version}/" Dockerfile
sed -i "s/ARG DEFRA_VERSION=.*/ARG DEFRA_VERSION=${new_defra_version}/" Dockerfile
echo "Updated Dockerfile"
- name: Prepare pull request details
if: env.update_needed == 'true'
run: |
# Read updates.txt into an environment variable
updated_versions=$(cat updates.txt | awk -F: '{print $1}' | sort -u | paste -sd, -)
pull_request_title="Update .NET base image: ${updated_versions}"
pull_request_body=$(cat updates.txt | awk -F: '{print "- .NET " $1 ": SDK " $2 ", Runtime " $3}')
pull_request_branch="update-dotnet-base-image-${updated_versions//,/}"
echo "pull_request_branch=${pull_request_branch}" >> $GITHUB_ENV
echo "pull_request_title=${pull_request_title}" >> $GITHUB_ENV
echo "pull_request_body<<EOF" >> $GITHUB_OUTPUT
echo "$pull_request_body" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "Prepared pull request details."
- name: Clean up temporary files
if: env.update_needed == 'true'
run: |
rm -f releases-index.json updates.txt
echo "Removed temporary files."
- name: Generate GitHub App token
if: env.update_needed == 'true'
id: generate-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Render PR template
id: template
uses: chuhlomin/render-template@v1
with:
template: .github/pull_request_template.md
- name: Create pull request
if: env.update_needed == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ steps.generate-token.outputs.token }}
branch: ${{ env.pull_request_branch }}
base: main
title: ${{ env.pull_request_title }}
body: |
Updates the .NET base images to the latest versions:
${{ steps.pr-details.outputs.pull_request_body }}
${{ steps.template.outputs.result }}
sign-commits: true
commit-message: ${{ env.pull_request_title }}
team-reviewers: ${{ vars.PR_REVIEW_TEAM }}