Release workflow simplifications (#356)

* Release workflow simplifications

* doc

* Sync

* Remove prerelease support

* More

* Sync

* Fix
This commit is contained in:
Trask Stalnaker 2022-06-17 15:14:36 -07:00 committed by GitHub
parent e999efdf18
commit d5650937ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 269 additions and 172 deletions

View File

@ -23,6 +23,9 @@ else
range="v$major.$((minor - 1)).0..HEAD"
fi
echo "## Unreleased"
echo
declare -A component_names=()
component_names["aws-xray/"]="AWS X-Ray"
component_names["consistent-sampling/"]="Consistent sampling"

View File

@ -5,6 +5,11 @@
# this should be run on the release branch
# NOTE if you need to run this script locally, you will need to first:
# git fetch upstream main
# git push origin upstream/main:main
# export GITHUB_REPOSITORY=open-telemetry/opentelemetry-java-contrib
from_version=$1
# get the date of the first commit that was not in the from_version
@ -80,4 +85,5 @@ echo $contributors1 $contributors2 \
| grep -v linux-foundation-easycla \
| grep -v github-actions \
| grep -v dependabot \
| grep -v opentelemetry-java-bot \
| sed 's/^/@/'

View File

@ -10,6 +10,12 @@ jobs:
backport:
runs-on: ubuntu-latest
steps:
- run: |
if [[ ! $GITHUB_REF_NAME =~ ^release/v[0-9]+\.[0-9]+\.x$ ]]; then
echo this workflow should only be run against release branches
exit 1
fi
- uses: actions/checkout@v3
with:
# history is needed to run git cherry-pick below
@ -21,12 +27,11 @@ jobs:
- name: Create pull request
env:
NUMBER: ${{ github.event.inputs.number }}
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
commit=$(gh pr view $NUMBER --json mergeCommit --jq .mergeCommit.oid)
title=$(gh pr view $NUMBER --json title --jq .title)
url=$(gh pr view $NUMBER --json url --jq .url)
branch="backport-${NUMBER}-to-${GITHUB_REF_NAME//\//-}"

View File

@ -1,38 +0,0 @@
name: Merge change log to main
on:
workflow_dispatch:
jobs:
create-pull-request:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
# this workflow is run against the release branch (see usage of GITHUB_REF_NAME below)
# but it is creating a pull request against main
ref: main
# history is needed to run format-patch below
fetch-depth: 0
- name: Set git user
run: .github/scripts/set-git-user.sh
# this will fail if there have been conflicting change log updates introduced in main
- name: Create pull request against main
env:
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Merge change log updates from $GITHUB_REF_NAME"
body="Merge change log updates from \`$GITHUB_REF_NAME\`."
branch="merge-change-log-updates-from-${GITHUB_REF_NAME//\//-}"
# perform a 3-way merge of a single file
git format-patch --stdout HEAD..origin/$GITHUB_REF_NAME CHANGELOG.md | git apply --3way
git commit -a -m "$message"
git push origin HEAD:$branch
gh pr create --title "$message" \
--body "$body" \
--head $branch \
--base main

View File

@ -8,10 +8,21 @@ jobs:
steps:
- uses: actions/checkout@v3
- run: |
if [[ ! $GITHUB_REF_NAME =~ ^release/v[0-9]+\.[0-9]+\.x$ ]]; then
echo this workflow should only be run against release branches
exit 1
fi
if ! grep --quiet "^## Unreleased$" CHANGELOG.md; then
echo the change log is missing an \"Unreleased\" section
exit 1
fi
- name: Set environment variables
run: |
version=$(.github/scripts/get-version.sh)
if [[ $version =~ ([0-9]+\.[0-9]+)\.([0-9]+) ]]; then
if [[ $version =~ ^([0-9]+\.[0-9]+)\.([0-9]+)$ ]]; then
major_minor="${BASH_REMATCH[1]}"
patch="${BASH_REMATCH[2]}"
else
@ -20,22 +31,20 @@ jobs:
fi
echo "VERSION=$major_minor.$((patch + 1))" >> $GITHUB_ENV
- name: Check change log has been updated
run: |
if ! grep --quiet "^## Version $VERSION" CHANGELOG.md; then
echo the change log needs to be updated
exit 1
fi
- name: Update version
run: .github/scripts/update-version.sh $VERSION
- name: Update the change log with the approximate release date
run: |
date=$(date "+%Y-%m-%d")
sed -Ei "s/^## Unreleased$/## Version $VERSION ($date)/" CHANGELOG.md
- name: Set git user
run: .github/scripts/set-git-user.sh
- name: Create pull request
env:
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Prepare release $VERSION"

View File

@ -9,10 +9,13 @@ jobs:
- uses: actions/checkout@v3
- run: |
version=$(.github/scripts/get-version.sh)
version=${version//-SNAPSHOT/}
if ! grep --quiet "^## Version $version" CHANGELOG.md; then
echo the change log needs to be updated
if [[ $GITHUB_REF_NAME != main ]]; then
echo this workflow should only be run against main
exit 1
fi
if ! grep --quiet "^## Unreleased$" CHANGELOG.md; then
echo the change log is missing an \"Unreleased\" section
exit 1
fi
@ -23,11 +26,15 @@ jobs:
- uses: actions/checkout@v3
- name: Create release branch
id: create-release-branch
run: |
version=$(.github/scripts/get-version.sh)
version=${version//-SNAPSHOT/}
release_branch_name=$(echo $version | sed -E 's/([0-9]+)\.([0-9]+)\.0/release\/v\1.\2.x/')
if [[ $version =~ ^([0-9]+)\.([0-9]+)\.0$ ]]; then
release_branch_name=$(echo $version | sed -E 's/([0-9]+)\.([0-9]+)\.0/release\/v\1.\2.x/')
else
echo "unexpected version: $version"
exit 1
fi
git push origin HEAD:$release_branch_name
@ -37,12 +44,17 @@ jobs:
- name: Update version
run: .github/scripts/update-version.sh $VERSION
- name: Update the change log with the approximate release date
run: |
date=$(date "+%Y-%m-%d")
sed -Ei "s/^## Unreleased$/## Version $VERSION ($date)/" CHANGELOG.md
- name: Set git user
run: .github/scripts/set-git-user.sh
- name: Create pull request against the release branch
env:
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Prepare release $VERSION"
@ -64,26 +76,33 @@ jobs:
- name: Set environment variables
run: |
version=$(.github/scripts/get-version.sh)
if [[ $version =~ ([0-9]+)\.([0-9]+)\.0 ]]; then
version=${version//-SNAPSHOT/}
if [[ $version =~ ^([0-9]+)\.([0-9]+)\.0$ ]]; then
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
next_version="$major.$((minor + 1)).0"
else
echo "unexpected version: $version"
exit 1
fi
next_version="$major.$((minor + 1)).0"
next_version="${next_version}-SNAPSHOT"
echo "NEXT_VERSION=$next_version" >> $GITHUB_ENV
echo "NEXT_VERSION=${next_version}-SNAPSHOT" >> $GITHUB_ENV
echo "VERSION=$version" >> $GITHUB_ENV
- name: Update version
run: .github/scripts/update-version.sh $NEXT_VERSION
- name: Update the change log on main
run: |
# the actual release date on main will be updated at the end of the release workflow
date=$(date "+%Y-%m-%d")
sed -Ei "s/^## Unreleased$/## Unreleased\n\n## Version $VERSION ($date)/" CHANGELOG.md
- name: Set git user
run: .github/scripts/set-git-user.sh
- name: Create pull request against main
env:
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Update version to $NEXT_VERSION"

View File

@ -3,64 +3,88 @@ on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
assemble:
uses: ./.github/workflows/reusable-assemble.yml
- name: Set up JDK for running Gradle
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
test:
uses: ./.github/workflows/reusable-test.yml
- uses: gradle/gradle-build-action@v2
name: Build
with:
arguments: build
# test-latest-deps is intentionally not included in the release workflows
# because any time a new library version is released to maven central
# it can fail due to test code incompatibility with the new library version,
# or due to slight changes in emitted telemetry
- uses: actions/upload-artifact@v3
name: Save unit test results
if: always()
with:
name: test-results
path: jmx-metrics/build/reports/tests/test
smoke-test:
uses: ./.github/workflows/reusable-smoke-test.yml
integration-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# muzzle is intentionally not included in the release workflows
# because any time a new library version is released to maven central it can fail,
# and this is not a reason to hold up the release
- name: Set up JDK for running Gradle
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
gradle-plugins:
uses: ./.github/workflows/reusable-gradle-plugins.yml
- uses: gradle/gradle-build-action@v2
name: Integration test
with:
arguments: integrationTest
- uses: actions/upload-artifact@v3
name: Save integration test results
if: always()
with:
name: integration-test-results
path: jmx-metrics/build/reports/tests/integrationTest
examples:
uses: ./.github/workflows/reusable-examples.yml
release:
runs-on: ubuntu-latest
needs:
- build
- integration-test
- assemble
- test
- smoke-test
- gradle-plugins
- examples
runs-on: ubuntu-latest
steps:
- run: |
if [[ $GITHUB_REF_NAME != release/* ]]; then
echo the release workflow should only be run against release branches
echo this workflow should only be run against release branches
exit 1
fi
- uses: actions/checkout@v3
- name: Set environment variables
run: |
version=$(.github/scripts/get-version.sh)
if [[ $version =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
patch="${BASH_REMATCH[3]}"
else
echo "unexpected version: $version"
exit 1
fi
if [[ $patch == 0 ]]; then
if [[ $minor == 0 ]]; then
prior_major=$((major - 1))
prior_minor=$(grep -Po "^## Version $prior_major.\K[0-9]+" CHANGELOG.md | head -1)
prior_version="$prior_major.$prior_minor"
else
prior_version="$major.$((minor - 1)).0"
fi
else
prior_version="$major.$minor.$((patch - 1))"
fi
echo "VERSION=$version" >> $GITHUB_ENV
echo "PRIOR_VERSION=$prior_version" >> $GITHUB_ENV
# check out main branch to verify there won't be problems with merging the change log
# at the end of this workflow
- uses: actions/checkout@v3
with:
ref: main
- run: |
if [[ $VERSION == *.0 ]]; then
# not making a patch release
if ! grep --quiet "^## Version $VERSION " CHANGELOG.md; then
echo the pull request generated by prepare-release-branch.yml needs to be merged first
exit 1
fi
fi
# back to the release branch
- uses: actions/checkout@v3
with:
# tags are needed for the generate-release-contributors.sh script
@ -82,30 +106,19 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }}
- name: Set environment variables
run: |
version=$(.github/scripts/get-version.sh)
if [[ $version =~ ([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
patch="${BASH_REMATCH[3]}"
else
echo "unexpected version: $version"
exit 1
fi
if [[ $patch == 0 ]]; then
if [[ $minor == 0 ]]; then
prior_major=$((major - 1))
prior_minor=$(grep -Po "^## Version $prior_major.\K([0-9]+)" CHANGELOG.md | head -1)
prior_version="$prior_major.$prior_minor"
else
prior_version="$major.$((minor - 1)).0"
fi
else
prior_version="$major.$minor.$((patch - 1))"
fi
echo "VERSION=$version" >> $GITHUB_ENV
echo "PRIOR_VERSION=$prior_version" >> $GITHUB_ENV
- name: Build and publish gradle plugins
uses: gradle/gradle-build-action@v2
env:
SONATYPE_USER: ${{ secrets.SONATYPE_USER }}
SONATYPE_KEY: ${{ secrets.SONATYPE_KEY }}
GRADLE_PUBLISH_KEY: ${{ secrets.GRADLE_PUBLISH_KEY }}
GRADLE_PUBLISH_SECRET: ${{ secrets.GRADLE_PUBLISH_SECRET }}
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }}
with:
# Don't use publishToSonatype since we don't want to publish the marker artifact
arguments: build publishPlugins publishPluginMavenPublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository
build-root-directory: gradle-plugins
- name: Generate release notes
env:
@ -124,17 +137,21 @@ jobs:
EOF
fi
# CHANGELOG_SECTION.md is also used at the end of the release workflow
# for copying the change log updates to main
sed -n "0,/^## Version $VERSION /d;/^## Version /q;p" CHANGELOG.md \
> /tmp/CHANGELOG_SECTION.md
# the complex perl regex is needed because markdown docs render newlines as soft wraps
# while release notes render them as line breaks
sed -n "0,/^## Version $VERSION/d;/^## Version /q;p" CHANGELOG.md \
| perl -0pe 's/(?<!\n)\n *(?!\n)(?![-*] )(?![1-9]+\. )/ /g' \
perl -0pe 's/(?<!\n)\n *(?!\n)(?![-*] )(?![1-9]+\. )/ /g' /tmp/CHANGELOG_SECTION.md \
>> /tmp/release-notes.txt
# conditional block not indented because of the heredoc
if [[ $VERSION == *.0 ]]; then
cat >> /tmp/release-notes.txt << EOF
### 🙇 Thank you
This release was possible thanks to the following contributors who shared their brilliant ideas and awesome pull requests:
EOF
@ -154,27 +171,117 @@ jobs:
v$VERSION \
opentelemetry-jmx-metrics.jar
- name: Update the change log with the release date
- uses: actions/checkout@v3
with:
# the step below is creating a pull request against main
ref: main
- name: Copy change log updates to main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
date=$(gh release view v$VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//')
sed -Ei "s/## Version $VERSION .*/## Version $VERSION ($date)/" CHANGELOG.md
if [[ $VERSION == *.0 ]]; then
# this was not a patch release, so the version exists already in the CHANGELOG.md
# update the release date
date=$(gh release view v$VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//')
sed -Ei "s/## Version $VERSION .*/## Version $VERSION ($date)/" CHANGELOG.md
# the entries are copied over from the release branch to support workflows
# where change log entries may be updated after preparing the release branch
# copy the portion above the release, up to and including the heading
sed -n "0,/^## Version $VERSION ($date)/p" CHANGELOG.md > /tmp/CHANGELOG.md
# copy the release notes
cat /tmp/CHANGELOG_SECTION.md >> /tmp/CHANGELOG.md
# copy the portion below the release
sed -n "0,/^## Version $VERSION /d;0,/^## Version /{/^## Version/!d};p" CHANGELOG.md \
>> /tmp/CHANGELOG.md
# update the real CHANGELOG.md
cp /tmp/CHANGELOG.md CHANGELOG.md
else
# this was a patch release, so the version does not exist already in the CHANGELOG.md
# copy the portion above the top-most release, not including the heading
sed -n "0,/^## Version /{ /^## Version /!p }" CHANGELOG.md > /tmp/CHANGELOG.md
# add the heading
date=$(gh release view v$VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//')
echo "## Version $VERSION ($date)" >> /tmp/CHANGELOG.md
# copy the release notes
cat /tmp/CHANGELOG_SECTION.md >> /tmp/CHANGELOG.md
# copy the portion starting from the top-most release
sed -n "/^## Version /,\$p" CHANGELOG.md >> /tmp/CHANGELOG.md
# update the real CHANGELOG.md
cp /tmp/CHANGELOG.md CHANGELOG.md
fi
- name: Set git user
run: .github/scripts/set-git-user.sh
- name: Create pull request against the release branch
- name: Create pull request against main
env:
# not using the default GITHUB_TOKEN because pull requests generated by it do not run any workflows
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Add the release date for $VERSION to the change log"
branch="add-release-date-for-${VERSION}"
message="Copy change log updates from $GITHUB_REF_NAME"
body="Copy log updates from \`$GITHUB_REF_NAME\`."
branch="copy-change-log-updates-from-${GITHUB_REF_NAME//\//-}"
if [[ $VERSION == *.0 ]]; then
if git diff --quiet; then
echo there are no updates needed to the change log on main, not creating pull request
exit 0 # success
fi
fi
git commit -a -m "$message"
git push origin HEAD:$branch
gh pr create --title "[$GITHUB_REF_NAME] $message" \
--body "$message." \
gh pr create --title "$message" \
--body "$body" \
--head $branch \
--base $GITHUB_REF_NAME
--base main
- uses: actions/checkout@v3
with:
repository: opentelemetry-java-bot/opentelemetry-operator
# this is the personal access token used for "git push" below
token: ${{ secrets.BOT_TOKEN }}
- name: Initialize pull request branch
run: |
git remote add upstream https://github.com/open-telemetry/opentelemetry-operator.git
git fetch upstream
git checkout -b update-opentelemetry-javaagent-to-${VERSION} upstream/main
- name: Update version
run: |
echo $VERSION > autoinstrumentation/java/version.txt
- name: Set git user
run: .github/scripts/set-git-user.sh
- name: Create pull request against opentelemetry-operator
env:
# this is the personal access token used for "gh pr create" below
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
run: |
message="Update the javaagent version to $VERSION"
body="Update the javaagent version to \`$VERSION\`."
# gh pr create doesn't have a way to explicitly specify different head and base
# repositories currently, but it will implicitly pick up the head from a different
# repository if you set up a tracking branch
git commit -a -m "$message"
git push --set-upstream origin update-opentelemetry-javaagent-to-${VERSION}
gh pr create --title "$message" \
--body "$body" \
--repo open-telemetry/opentelemetry-operator \
--base main

View File

@ -14,19 +14,19 @@ as the last step, which publishes a snapshot build to
* Close the release milestone if there is one.
* Merge a pull request to `main` updating the `CHANGELOG.md`.
* The heading for the release should include the release version but not the release date, e.g.
`## Version 1.9.0 (unreleased)`.
* Use `.github/scripts/draft-change-log-entries.sh` as a starting point for writing the change
log.
* The heading for the unreleased entries should be `## Unreleased`.
* Use `.github/scripts/draft-change-log-entries.sh` as a starting point for writing the change log.
* Run the [Prepare release branch workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/prepare-release-branch.yml).
* Review and merge the two pull requests that it creates
(one is targeted to the release branch and one is targeted to the `main` branch).
* Press the "Run workflow" button, and leave the default branch `main` selected.
* Review and merge the two pull requests that it creates
(one is targeted to the release branch and one is targeted to `main`).
## Preparing a new patch release
All patch releases should include only bug-fixes, and must avoid adding/modifying the public APIs.
In general, patch releases are only made for regressions, memory leaks and deadlocks.
In general, patch releases are only made for regressions, security vulnerabilities, memory leaks
and deadlocks.
* Backport pull request(s) to the release branch.
* Run the [Backport workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/backport.yml).
@ -35,33 +35,19 @@ In general, patch releases are only made for regressions, memory leaks and deadl
then click the "Run workflow" button below that.
* Review and merge the backport pull request that it generates.
* Merge a pull request to the release branch updating the `CHANGELOG.md`.
* The heading for the release should include the release version but not the release date, e.g.
`## Version 1.9.1 (unreleased)`.
* The heading for the unreleased entries should be `## Unreleased`.
* Run the [Prepare patch release workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/prepare-patch-release.yml).
* Press the "Run workflow" button, then select the release branch from the dropdown list,
e.g. `release/v1.9.x`, and click the "Run workflow" button below that.
* Review and merge the pull request that it creates.
* Review and merge the pull request that it creates for updating the version.
## Making the release
Run the [Release workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/release.yml).
* Press the "Run workflow" button, then select the release branch from the dropdown list,
e.g. `release/v1.9.x`, and click the "Run workflow" button below that.
* This workflow will publish the artifacts to maven central and will publish a GitHub release
with release notes based on the change log and with the jmx metrics jar attached.
* Review and merge the pull request that the release workflow creates against the release branch
which adds the release date to the change log.
## After the release
Run the [Merge change log to main workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/merge-change-log-to-main.yml).
* Press the "Run workflow" button, then select the release branch from the dropdown list,
e.g. `release/v1.9.x`, and click the "Run workflow" button below that.
* This will create a pull request that merges the change log updates from the release branch
back to main.
* Review and merge the pull request that it creates.
* This workflow will fail if there have been conflicting change log updates introduced in main,
in which case you will need to merge the change log updates manually and send your own pull
request against main.
* Run the [Release workflow](https://github.com/open-telemetry/opentelemetry-java-contrib/actions/workflows/release.yml).
* Press the "Run workflow" button, then select the release branch from the dropdown list,
e.g. `release/v1.9.x`, and click the "Run workflow" button below that.
* This workflow will publish the artifacts to maven central and will publish a GitHub release
with release notes based on the change log and with the jmx metrics jar attached.
* Review and merge the pull request that it creates for updating the change log in main
(note that if this is not a patch release then the change log on main may already be up-to-date,
in which case no pull request will be created).