Skip to content

Release IRS

Release IRS #53

Workflow file for this run

name: Release IRS
on:
workflow_dispatch:
inputs:
irs-version:
description: 'New IRS version'
required: true
type: string
helm-chart-version:
description: 'New Helm Chart version'
required: true
type: string
add-change-to-helm-changelog:
description: 'Add "Update IRS to ..." change to Helm Chart changelog'
required: true
type: boolean
default: true
env:
IRS_APPLICATION_PATH: 'irs-api/src/main/java/org/eclipse/tractusx/irs/IrsApplication.java'
CHANGELOG_PATH: 'CHANGELOG.md'
OPENAPI_SPEC_PATH: 'docs/src/api/irs-api.yaml'
HELM_CHART_PATH: 'charts/item-relationship-service'
SEMVER_PATTERN: '[0-9]+\.[0-9]+\.[0-9]+'
SEMVER_PATTERN_SED: '[0-9]\+\.[0-9]\+\.[0-9]\+\'
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate that workflow inputs are SemVer strings
run: |
matched_irs_semver_string=$(echo "${{ inputs.irs-version }}" | grep -Ex "${{ env.SEMVER_PATTERN }}" || echo "")
matched_helm_chart_semver_string=$(echo "${{ inputs.helm-chart-version }}" | grep -Ex "${{ env.SEMVER_PATTERN }}" || echo "")
if [[ -z "$matched_irs_semver_string" || -z "$matched_helm_chart_semver_string" ]]; then
echo "At least one of the version numbers ${{ inputs.irs-version }} or ${{ inputs.helm-chart-version }} is not a SemVer string."
exit 1
fi
continue-on-error: false
- name: Validate that IRS and Helm Chart versions don't exist yet
run: |
# IRS version can be checked via git tag since every release has a tag
matched_irs_version=$(git tag | grep -Eo "${{ inputs.irs-version }}" || echo "")
# extract from Helm Chart changelog
matched_helm_chart_version=$(grep -Eo "## \[${{ inputs.helm-chart-version }}\]" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md || echo "")
if [[ -n "$matched_irs_version" || -n "$matched_helm_chart_version" ]]; then
echo "At least one of the version numbers ${{ inputs.irs-version }} or ${{ inputs.helm-chart-version }} already exists."
exit 1
fi
continue-on-error: false
- name: Update changelog
id: main-changelog-update
run: |
date=$(date +"%Y-%m-%d")
# get line number of uppermost comparison url at bottom of changelog ("[Unreleased]: https://github.com/.../version...HEAD")
latest_comparison_url_line_number=$(cat -n ${{ env.CHANGELOG_PATH }} | grep -Eoi "[0-9]+.\[Unreleased\]" | grep -Eo "[0-9]+")
# previous version can be extracted from line below uppermost comparison
previous_irs_version=$(awk "NR==$((latest_comparison_url_line_number+1))" ${{ env.CHANGELOG_PATH }} | grep -Eo "\[${{ env.SEMVER_PATTERN }}\]" | tr -d "[]")
echo "previous-irs-version=$previous_irs_version" >> "$GITHUB_OUTPUT"
# correct uppermost comparison
sed -i "$latest_comparison_url_line_number s|${{ env.SEMVER_PATTERN_SED }}\.\.\.HEAD|${{ inputs.irs-version }}...HEAD|" ${{ env.CHANGELOG_PATH }}
# insert new comparison below uppermost one
sed -i "$((latest_comparison_url_line_number+1)) s|^|[${{ inputs.irs-version }}]: \
https://github.com/eclipse-tractusx/item-relationship-service/compare/$previous_irs_version...${{ inputs.irs-version }}\n|" ${{ env.CHANGELOG_PATH }}
# replace placeholder
placeholder_line_number=$(cat -n ${{ env.CHANGELOG_PATH }} | grep -Eoi "[0-9]+.## \[Unreleased\]" | grep -Eo "[0-9]+")
sed -i "$((placeholder_line_number+1)) s|^|\n## [${{ inputs.irs-version }}] - $date\n|" ${{ env.CHANGELOG_PATH }}
- name: Update Helm changelog
run: |
date=$(date +"%Y-%m-%d")
### update Helm Chart directory's CHANGELOG.md ###
helm_changelog_placeholder_line_number=$(cat -n ${{ env.HELM_CHART_PATH }}/CHANGELOG.md | grep -Eoi "[0-9]+.## \[Unreleased\]" | grep -Eo "[0-9]+")
if [[ "${{ inputs.add-change-to-helm-changelog }}" == "true" ]]; then
# get line number of first header which is not placeholder
next_header_line_number=$(cat -n ${{ env.HELM_CHART_PATH }}/CHANGELOG.md | grep -Eo -m 1 "[0-9]+.## \[${{ env.SEMVER_PATTERN }}\]" | grep -Eo "^[0-9]+")
# get line number of first "### Changed" section
first_changed_section_line_number=$(cat -n ${{ env.HELM_CHART_PATH }}/CHANGELOG.md | grep -Eo -m 1 "[0-9]+.### Changed" | grep -Eo "[0-9]+")
# "### Changed" is already present for current changelog if it comes before next header -> just insert line below
if [[ $first_changed_section_line_number -lt $next_header_line_number ]]; then
# check if markdown was properly formatted (with blank line between "### Changed" and first change)
line_after=$(awk "NR==$((first_changed_section_line_number+1))" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md)
if [[ "$line_after" == "" ]]; then
sed -i "$((first_changed_section_line_number+1)) s|^|\n- Update IRS version to ${{ inputs.irs-version }}|" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md
else # format properly with blank line
sed -i "$((first_changed_section_line_number+1)) s|^|\n- Update IRS version to ${{ inputs.irs-version }}\n|" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md
fi
else
sed -i "$((helm_changelog_placeholder_line_number+1)) s|^|\n### Changed\n\n- Update IRS version to ${{ inputs.irs-version }}\n|" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md
fi
fi
# replace placeholder
helm_changelog_placeholder_line_number=$(cat -n ${{ env.HELM_CHART_PATH }}/CHANGELOG.md | grep -Eoi "[0-9]+.## \[Unreleased\]" | grep -Eo "[0-9]+")
sed -i "$((helm_changelog_placeholder_line_number+1)) s|^|\n## [${{ inputs.helm-chart-version }}] - $date\n|" ${{ env.HELM_CHART_PATH }}/CHANGELOG.md
- name: Update IrsApplication.java
run: sed -i "s|${{ steps.main-changelog-update.outputs.previous-irs-version }}|${{ inputs.irs-version }}|" ${{ env.IRS_APPLICATION_PATH }}
- name: Update irs-api.yaml
uses: mikefarah/[email protected]
with:
cmd: yq -i eval '.info.version = "${{ inputs.irs-version }}"' ${{ env.OPENAPI_SPEC_PATH }}
- name: Update Chart.yaml appVersion
uses: mikefarah/[email protected]
with:
cmd: yq -i eval '.appVersion = "${{ inputs.irs-version }}"' ${{ env.HELM_CHART_PATH }}/Chart.yaml
- name: Update Chart.yaml version
uses: mikefarah/[email protected]
with:
cmd: yq -i eval '.version = "${{ inputs.helm-chart-version }}"' ${{ env.HELM_CHART_PATH }}/Chart.yaml
- name: Update docs and Helm chart for release
id: cpr
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore(docs): updated docs and Helm chart for IRS release ${{ inputs.irs-version }}'
branch: action/update-for-release-${{ inputs.irs-version }}
delete-branch: true
title: "chore: updated docs and Helm chart for release"
body: This PR prepares the docs and the Helm chart for IRS release ${{ inputs.irs-version }}.
Please check whether everything was updated correctly. Once this PR is merged, the release process will continue automatically.
- name: Wait for pull request merge
run: |
pull_request_number=${{ steps.cpr.outputs.pull-request-number }}
pull_request_merged="False"
seconds_waited_for_merge=0
# set duration between api requests
sleep_interval_length=5 # seconds
timeout_in_minutes=15
echo "Waiting for merge of PR #$pull_request_number."
while [[ "$pull_request_merged" == "False" ]]
do
# give some time to merge pull request
sleep "$sleep_interval_length"s
# retrieve pr status using GH API's pull requests endpoint with GH CLI
pr_status=$(gh pr view $pull_request_number --json state --jq ".state")
case $pr_status in
MERGED)
pull_request_merged="True"
echo "PR #$pull_request_number merged, continuing the workflow."
;;
OPEN)
seconds_waited_for_merge=$((seconds_waited_for_merge+sleep_interval_length))
# abort workflow when having waited for more than allowed time
if [[ $seconds_waited_for_merge -gt $((timeout_in_minutes*60)) ]]; then
echo "Timeout waiting for merge of PR #$pull_request_number, aborting the workflow."
exit 1
fi
;;
CLOSED)
echo "PR #$pull_request_number was closed, aborting the workflow."
exit 1
;;
esac
done
continue-on-error: false
- name: Create and push new Git tag for release and pull latest changes
run: git tag ${{ inputs.irs-version }} && git push origin ${{ inputs.irs-version }} && git pull
- name: Extract changelog text
# See: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
run: |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "CHANGELOG<<$EOF" >> $GITHUB_ENV
sed -n -e '/## \[${{ inputs.irs-version }}\]/,/## \[/ p' ${{ env.CHANGELOG_PATH }} | head -n -1 | tail -n +2 >> $GITHUB_ENV
echo **Full Changelog**: ${{ github.server_url }}/${{ github.repository }}/compare\
/${{ steps.main-changelog-update.outputs.previous-irs-version }}...${{ inputs.irs-version }} >> $GITHUB_ENV
echo "$EOF" >> "$GITHUB_ENV"
- name: Create IRS release
uses: softprops/action-gh-release@v2
with:
body: ${{ env.CHANGELOG }}
tag_name: ${{ inputs.irs-version }}
release-helm-chart:
name: "Release Helm chart"
needs:
- release
uses: ./.github/workflows/helm-chart-release.yaml
with:
checkout-tag: true
ref-to-checkout: '${{ inputs.irs-version }}'
build-irs:
name: "Build IRS"
needs:
- release
uses: ./.github/workflows/irs-build.yml
secrets: inherit
with:
checkout-tag: true
ref-to-checkout: '${{ inputs.irs-version }}'
trivy-image-scan:
name: "Scan image in local registry with Trivy"
needs:
- release
uses: ./.github/workflows/trivy-image-scan.yml
secrets: inherit
with:
checkout-tag: true
ref-to-checkout: '${{ inputs.irs-version }}'
validate-openapi-definition:
needs:
- release
name: "Validate OpenAPI definition"
uses: ./.github/workflows/swagger-editor-validate.yml
secrets: inherit
with:
checkout-tag: true
ref-to-checkout: '${{ inputs.irs-version }}'