AUTO-UPDATE #421
This file contains hidden or 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: 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 }} |