123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- name: Release
- on:
- workflow_dispatch:
- jobs:
- assemble:
- uses: ./.github/workflows/reusable-assemble.yml
- test:
- uses: ./.github/workflows/reusable-test.yml
- # 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
- smoke-test:
- uses: ./.github/workflows/reusable-smoke-test.yml
- # 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
- gradle-plugins:
- uses: ./.github/workflows/reusable-gradle-plugins.yml
- examples:
- uses: ./.github/workflows/reusable-examples.yml
- release:
- needs:
- - assemble
- - test
- - smoke-test
- - gradle-plugins
- - examples
- runs-on: ubuntu-latest
- steps:
- - run: |
- if [[ $GITHUB_REF_NAME != release/* ]]; then
- echo this workflow should only be run against release branches
- exit 1
- fi
- - uses: actions/checkout@v3
- with:
- # tags are needed for the generate-release-contributors.sh script
- fetch-depth: 0
- - uses: actions/setup-java@v3
- with:
- distribution: temurin
- java-version: 17
- - name: Build and publish artifacts
- uses: gradle/gradle-build-action@v2
- with:
- arguments: assemble publishToSonatype closeAndReleaseSonatypeStagingRepository
- env:
- SONATYPE_USER: ${{ secrets.SONATYPE_USER }}
- SONATYPE_KEY: ${{ secrets.SONATYPE_KEY }}
- GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
- GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }}
- - 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: 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
- - name: Generate release notes
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- # conditional blocks not indented because of the heredoc
- if [[ $VERSION == *.0 ]]; then
- cat > /tmp/release-notes.txt << EOF
- This release targets the OpenTelemetry SDK $VERSION.
- Note that all artifacts other than \`io.opentelemetry.javaagent:opentelemetry-javaagent\` have the \`-alpha\` suffix attached to their version number, reflecting that they are still alpha quality and will continue to have breaking changes. Please see the [VERSIONING.md](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/VERSIONING.md#opentelemetry-java-instrumentation-versioning) for more details.
- EOF
- else
- cat > /tmp/release-notes.txt << EOF
- This is a patch release on the previous $PRIOR_VERSION release, fixing the issue(s) below.
- 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
- 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
- .github/scripts/generate-release-contributors.sh v$PRIOR_VERSION >> /tmp/release-notes.txt
- fi
- - name: Create GitHub release
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- cp javaagent/build/libs/opentelemetry-javaagent-${VERSION}.jar opentelemetry-javaagent.jar
- gh release create --target $GITHUB_REF_NAME \
- --title "Version $VERSION" \
- --notes-file /tmp/release-notes.txt \
- --discussion-category announcements \
- v$VERSION \
- opentelemetry-javaagent.jar
- - 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: |
- 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 main
- env:
- # not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
- GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
- run: |
- 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 "$message" \
- --body "$body" \
- --head $branch \
- --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
|