Release IRS #53
Workflow file for this run
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: 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 }}' |