diff --git a/.github/scripts/update-version.sh b/.github/scripts/update-version.sh new file mode 100755 index 00000000000..ba1bd22955b --- /dev/null +++ b/.github/scripts/update-version.sh @@ -0,0 +1,6 @@ +#!/bin/bash -e + +sed -i "/\[stable\]/{n;s/version=.*/version=$1/}" eachdist.ini +sed -i "/\[prerelease\]/{n;s/version=.*/version=$2/}" eachdist.ini + +./scripts/eachdist.py update_versions --versions stable,prerelease diff --git a/.github/scripts/use-cla-approved-github-bot.sh b/.github/scripts/use-cla-approved-github-bot.sh new file mode 100755 index 00000000000..a4c68b0e308 --- /dev/null +++ b/.github/scripts/use-cla-approved-github-bot.sh @@ -0,0 +1,4 @@ +#!/bin/bash -e + +git config user.name opentelemetrybot +git config user.email 107717825+opentelemetrybot@users.noreply.github.com diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml new file mode 100644 index 00000000000..1284c646ca2 --- /dev/null +++ b/.github/workflows/backport.yml @@ -0,0 +1,43 @@ +name: Backport +on: + workflow_dispatch: + inputs: + number: + description: "The pull request # to backport" + required: true + +jobs: + backport: + runs-on: ubuntu-latest + steps: + - run: | + if [[ ! $GITHUB_REF_NAME =~ ^release/v[0-9]+\.[0-9]+\.x-0\.[0-9]+bx$ ]]; then + echo this workflow should only be run against long-term release branches + exit 1 + fi + + - uses: actions/checkout@v3 + with: + # history is needed to run git cherry-pick below + fetch-depth: 0 + + - name: Use CLA approved github bot + run: .github/scripts/use-cla-approved-github-bot.sh + + - name: Create pull request + env: + NUMBER: ${{ github.event.inputs.number }} + # 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) + + branch="backport-${NUMBER}-to-${GITHUB_REF_NAME//\//-}" + + git cherry-pick $commit + git push origin HEAD:$branch + gh pr create --title "[$GITHUB_REF_NAME] $title" \ + --body "Clean cherry-pick of #$NUMBER to the \`$GITHUB_REF_NAME\` branch." \ + --head $branch \ + --base $GITHUB_REF_NAME diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 11e1a61fc54..5238e01c4b5 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -13,7 +13,9 @@ on: jobs: changelog: runs-on: ubuntu-latest - if: "!contains(github.event.pull_request.labels.*.name, 'Skip Changelog')" + if: | + !contains(github.event.pull_request.labels.*.name, 'Skip Changelog') + && github.actor != 'opentelemetrybot' steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/prepare-patch-release.yml b/.github/workflows/prepare-patch-release.yml new file mode 100644 index 00000000000..75676ada042 --- /dev/null +++ b/.github/workflows/prepare-patch-release.yml @@ -0,0 +1,73 @@ +name: Prepare patch release +on: + workflow_dispatch: + +jobs: + prepare-patch-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - run: | + if [[ ! $GITHUB_REF_NAME =~ ^release/v[0-9]+\.[0-9]+\.x-0\.[0-9]+bx$ ]]; then + echo this workflow should only be run against long-term 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: | + stable_version=$(./scripts/eachdist.py version --mode stable) + unstable_version=$(./scripts/eachdist.py version --mode prerelease) + + if [[ $stable_version =~ ^([0-9]+\.[0-9]+)\.([0-9]+)$ ]]; then + stable_major_minor="${BASH_REMATCH[1]}" + stable_patch="${BASH_REMATCH[2]}" + else + echo "unexpected stable_version: $stable_version" + exit 1 + fi + + if [[ $unstable_version =~ ^0\.([0-9]+)b([0-9]+)$ ]]; then + unstable_minor="${BASH_REMATCH[1]}" + unstable_patch="${BASH_REMATCH[2]}" + else + echo "unexpected unstable_version: $unstable_version" + exit 1 + fi + + stable_version="$stable_major_minor.$((stable_patch + 1))" + unstable_version="0.${unstable_minor}b$((unstable_patch + 1))" + + echo "STABLE_VERSION=$stable_version" >> $GITHUB_ENV + echo "UNSTABLE_VERSION=$unstable_version" >> $GITHUB_ENV + + - name: Update version + run: .github/scripts/update-version.sh $STABLE_VERSION $UNSTABLE_VERSION + + - name: Update the change log with the approximate release date + run: | + date=$(date "+%Y-%m-%d") + sed -Ei "s/^## Unreleased$/## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} ($date)/" CHANGELOG.md + + - name: Use CLA approved github bot + run: .github/scripts/use-cla-approved-github-bot.sh + + - name: Create pull request + env: + # not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + run: | + message="Prepare release ${STABLE_VERSION}/${UNSTABLE_VERSION}" + branch="prepare-release-${STABLE_VERSION}-${UNSTABLE_VERSION}" + + git commit -a -m "$message" + git push origin HEAD:$branch + gh pr create --title "[$GITHUB_REF_NAME] $message" \ + --body "$message." \ + --head $branch \ + --base $GITHUB_REF_NAME diff --git a/.github/workflows/prepare-release-branch.yml b/.github/workflows/prepare-release-branch.yml new file mode 100644 index 00000000000..94fba08fc6b --- /dev/null +++ b/.github/workflows/prepare-release-branch.yml @@ -0,0 +1,177 @@ +name: Prepare release branch +on: + workflow_dispatch: + inputs: + prerelease_version: + description: "Pre-release version number? (e.g. 1.9.0rc2)" + required: false + +jobs: + prereqs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Verify prerequisites + env: + PRERELEASE_VERSION: ${{ github.event.inputs.prerelease_version }} + run: | + 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 + + if [[ ! -z $PRERELEASE_VERSION ]]; then + stable_version=$(./scripts/eachdist.py version --mode stable) + stable_version=${stable_version//.dev/} + if [[ $PRERELEASE_VERSION != ${stable_version}* ]]; then + echo "$PRERELEASE_VERSION is not a prerelease for the version on main ($stable_version)" + exit 1 + fi + fi + + create-pull-request-against-release-branch: + runs-on: ubuntu-latest + needs: prereqs + steps: + - uses: actions/checkout@v3 + + - name: Create release branch + env: + PRERELEASE_VERSION: ${{ github.event.inputs.prerelease_version }} + run: | + if [[ -z $PRERELEASE_VERSION ]]; then + stable_version=$(./scripts/eachdist.py version --mode stable) + stable_version=${stable_version//.dev/} + else + stable_version=$PRERELEASE_VERSION + fi + + unstable_version=$(./scripts/eachdist.py version --mode prerelease) + unstable_version=${unstable_version//.dev/} + + if [[ $stable_version =~ ^([0-9]+)\.([0-9]+)\.0$ ]]; then + stable_version_branch_part=$(echo $stable_version | sed -E 's/([0-9]+)\.([0-9]+)\.0/\1.\2.x/') + unstable_version_branch_part=$(echo $unstable_version | sed -E 's/0\.([0-9]+)b0/0.\1bx/') + release_branch_name="release/v${stable_version_branch_part}-${unstable_version_branch_part}" + elif [[ $stable_version =~ ^([0-9]+)\.([0-9]+)\.0 ]]; then + # pre-release version, e.g. 1.9.0rc2 + release_branch_name="release/v$stable_version-$unstable_version" + else + echo "unexpected version: $stable_version" + exit 1 + fi + + git push origin HEAD:$release_branch_name + + echo "STABLE_VERSION=$stable_version" >> $GITHUB_ENV + echo "UNSTABLE_VERSION=$unstable_version" >> $GITHUB_ENV + echo "RELEASE_BRANCH_NAME=$release_branch_name" >> $GITHUB_ENV + + - name: Update version + run: .github/scripts/update-version.sh $STABLE_VERSION $UNSTABLE_VERSION + + - name: Update the change log with the approximate release date + run: | + date=$(date "+%Y-%m-%d") + sed -Ei "s/^## Unreleased$/## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} ($date)/" CHANGELOG.md + + - name: Use CLA approved github bot + run: .github/scripts/use-cla-approved-github-bot.sh + + - name: Create pull request against the release branch + env: + # not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + run: | + message="Prepare release ${STABLE_VERSION}/${UNSTABLE_VERSION}" + branch="prepare-release-${STABLE_VERSION}-${UNSTABLE_VERSION}" + + git commit -a -m "$message" + git push origin HEAD:$branch + gh pr create --title "[$RELEASE_BRANCH_NAME] $message" \ + --body "$message." \ + --head $branch \ + --base $RELEASE_BRANCH_NAME + + create-pull-request-against-main: + runs-on: ubuntu-latest + needs: prereqs + steps: + - uses: actions/checkout@v3 + + - name: Set environment variables + env: + PRERELEASE_VERSION: ${{ github.event.inputs.prerelease_version }} + run: | + if [[ -z $PRERELEASE_VERSION ]]; then + stable_version=$(./scripts/eachdist.py version --mode stable) + stable_version=${stable_version//.dev/} + else + stable_version=$PRERELEASE_VERSION + fi + + unstable_version=$(./scripts/eachdist.py version --mode prerelease) + unstable_version=${unstable_version//.dev/} + + if [[ $stable_version =~ ^([0-9]+)\.([0-9]+)\.0$ ]]; then + stable_major="${BASH_REMATCH[1]}" + stable_minor="${BASH_REMATCH[2]}" + stable_next_version="$stable_major.$((stable_minor + 1)).0" + elif [[ $stable_version =~ ^([0-9]+)\.([0-9]+)\.0 ]]; then + # pre-release version, e.g. 1.9.0rc2 + stable_major="${BASH_REMATCH[1]}" + stable_minor="${BASH_REMATCH[2]}" + stable_next_version="$stable_major.$stable_minor.0" + else + echo "unexpected stable_version: $stable_version" + exit 1 + fi + + if [[ $unstable_version =~ ^0\.([0-9]+)b[0-9]+$ ]]; then + unstable_minor="${BASH_REMATCH[1]}" + else + echo "unexpected unstable_version: $unstable_version" + exit 1 + fi + + unstable_next_version="0.$((unstable_minor + 1))b0" + + echo "STABLE_VERSION=${stable_version}" >> $GITHUB_ENV + echo "STABLE_NEXT_VERSION=${stable_next_version}.dev" >> $GITHUB_ENV + + echo "UNSTABLE_VERSION=${unstable_version}" >> $GITHUB_ENV + echo "UNSTABLE_NEXT_VERSION=${unstable_next_version}.dev" >> $GITHUB_ENV + + - name: Update version + run: .github/scripts/update-version.sh $STABLE_NEXT_VERSION $UNSTABLE_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 ${STABLE_VERSION}\/${UNSTABLE_VERSION} ($date)/" CHANGELOG.md + + - name: Use CLA approved github bot + run: .github/scripts/use-cla-approved-github-bot.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="Update version to ${STABLE_NEXT_VERSION}/${UNSTABLE_NEXT_VERSION}" + body="Update version to \`${STABLE_NEXT_VERSION}/${UNSTABLE_NEXT_VERSION}\`." + branch="update-version-to-${STABLE_NEXT_VERSION}-${UNSTABLE_NEXT_VERSION}" + + git commit -a -m "$message" + git push origin HEAD:$branch + gh pr create --title "$message" \ + --body "$body" \ + --head $branch \ + --base main diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 0921357cb33..00000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Publish - -on: - release: - types: [published] - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - with: - python-version: '3.7' - - name: Build wheels - run: ./scripts/build.sh - - name: Install twine - run: | - pip install twine - # The step below publishes to testpypi in order to catch any issues - # with the package configuration that would cause a failure to upload - # to pypi. One example of such a failure is if a classifier is - # rejected by pypi (e.g "3 - Beta"). This would cause a failure during the - # middle of the package upload causing the action to fail, and certain packages - # might have already been updated, this would be bad. - - name: Publish to TestPyPI - env: - TWINE_USERNAME: '__token__' - TWINE_PASSWORD: ${{ secrets.test_pypi_token }} - run: | - twine upload --repository testpypi --skip-existing --verbose dist/* - - name: Publish to PyPI - env: - TWINE_USERNAME: '__token__' - TWINE_PASSWORD: ${{ secrets.pypi_password }} - run: | - twine upload --skip-existing --verbose dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000000..f7072839cfe --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,205 @@ +name: Release +on: + workflow_dispatch: + +jobs: + release: + 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 + + - name: Set environment variables + run: | + stable_version=$(./scripts/eachdist.py version --mode stable) + unstable_version=$(./scripts/eachdist.py version --mode prerelease) + + if [[ $stable_version =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then + stable_major="${BASH_REMATCH[1]}" + stable_minor="${BASH_REMATCH[2]}" + stable_patch="${BASH_REMATCH[3]}" + else + echo "unexpected stable_version: $stable_version" + exit 1 + fi + if [[ $stable_patch != 0 ]]; then + if [[ $unstable_version =~ ^0\.([0-9]+)b([0-9]+)$ ]]; then + unstable_minor="${BASH_REMATCH[1]}" + unstable_patch="${BASH_REMATCH[2]}" + else + echo "unexpected unstable_version: $unstable_version" + exit 1 + fi + if [[ $unstable_patch != 0 ]]; then + prior_version_when_patch="$stable_major.$stable_minor.$((stable_patch - 1))/0.${unstable_minor}b$((unstable_patch - 1))" + fi + fi + + echo "STABLE_VERSION=$stable_version" >> $GITHUB_ENV + echo "UNSTABLE_VERSION=$unstable_version" >> $GITHUB_ENV + + echo "PRIOR_VERSION_WHEN_PATCH=$prior_version_when_patch" >> $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 [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; then + # not making a patch release + if ! grep --quiet "^## Version ${STABLE_VERSION}/${UNSTABLE_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 + + # next few steps publish to pypi + - uses: actions/setup-python@v1 + with: + python-version: '3.7' + + - name: Build wheels + run: ./scripts/build.sh + + - name: Install twine + run: | + pip install twine + + # The step below publishes to testpypi in order to catch any issues + # with the package configuration that would cause a failure to upload + # to pypi. One example of such a failure is if a classifier is + # rejected by pypi (e.g "3 - Beta"). This would cause a failure during the + # middle of the package upload causing the action to fail, and certain packages + # might have already been updated, this would be bad. +# - name: Publish to TestPyPI +# env: +# TWINE_USERNAME: '__token__' +# TWINE_PASSWORD: ${{ secrets.test_pypi_token }} +# run: | +# twine upload --repository testpypi --skip-existing --verbose dist/* +# +# - name: Publish to PyPI +# env: +# TWINE_USERNAME: '__token__' +# TWINE_PASSWORD: ${{ secrets.pypi_password }} +# run: | +# twine upload --skip-existing --verbose dist/* + + - name: Generate release notes + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # conditional block not indented because of the heredoc + if [[ ! -z $PRIOR_VERSION_WHEN_PATCH ]]; then + cat > /tmp/release-notes.txt << EOF + This is a patch release on the previous $PRIOR_VERSION_WHEN_PATCH 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 ${STABLE_VERSION}\/${UNSTABLE_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/(?> /tmp/release-notes.txt + + - name: Create GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create --target $GITHUB_REF_NAME \ + --title "Version ${STABLE_VERSION}/${UNSTABLE_VERSION}" \ + --notes-file /tmp/release-notes.txt \ + --discussion-category announcements \ + v$STABLE_VERSION + + - 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 [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; 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$STABLE_VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//') + sed -Ei "s/## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} .*/## Version ${STABLE_VERSION}\/${UNSTABLE_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 ${STABLE_VERSION}\/${UNSTABLE_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 ${STABLE_VERSION}\/${UNSTABLE_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$STABLE_VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//') + echo "## Version ${STABLE_VERSION}/${UNSTABLE_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: Use CLA approved github bot + run: .github/scripts/use-cla-approved-github-bot.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 [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; 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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cab9302a09..637ccbac5f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.13.0...HEAD) +## Unreleased + +- Fix + ([#105](https://github.com/open-telemetry/opentelemetry-python/pull/105)) + +## Version 1.14.1/0.35b1 (2022-10-24) + +- Fix + ([#105](https://github.com/open-telemetry/opentelemetry-python/pull/105)) + +## Version 1.14.0/0.35b0 (2022-10-24) - Update explicit histogram bucket boundaries ([#2947](https://github.com/open-telemetry/opentelemetry-python/pull/2947)) @@ -14,9 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add http-metric instrument names to semantic conventions ([#2976](https://github.com/open-telemetry/opentelemetry-python/pull/2976)) -## [1.13.0-0.34b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.13.0) - 2022-09-26 - - +## Version 1.13.0/0.34b0 (2022-09-26) - Add a configurable max_export_batch_size to the gRPC metrics exporter ([#2809](https://github.com/open-telemetry/opentelemetry-python/pull/2809)) @@ -39,7 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add force_flush to span exporters ([#2919](https://github.com/open-telemetry/opentelemetry-python/pull/2919)) -## [1.12.0-0.33b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0) - 2022-08-08 +## Version 1.12.0/0.33b0 (2022-08-08) - Add `force_flush` method to metrics exporter ([#2852](https://github.com/open-telemetry/opentelemetry-python/pull/2852)) @@ -59,7 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Instrument instances are always created through a Meter ([#2844](https://github.com/open-telemetry/opentelemetry-python/pull/2844)) -## [1.12.0rc2-0.32b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0rc2) - 2022-07-04 +## Version 1.12.0rc2/0.32b0 (2022-07-04) - Fix instrument name and unit regexes ([#2796](https://github.com/open-telemetry/opentelemetry-python/pull/2796)) @@ -103,8 +111,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 to the API reference documentation ([#2785](https://github.com/open-telemetry/opentelemetry-python/pull/2785)) - -## [1.12.0rc1-0.31b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0rc1) - 2022-05-17 +## Version 1.12.0rc1/0.31b0 (2022-05-17) - Fix LoggingHandler to handle LogRecord with exc_info=False ([#2690](https://github.com/open-telemetry/opentelemetry-python/pull/2690)) @@ -127,7 +134,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Move Metrics API behind internal package ([#2651](https://github.com/open-telemetry/opentelemetry-python/pull/2651)) -## [1.11.1-0.30b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.11.1) - 2022-04-21 +## Version 1.11.1/0.30b1 (2022-04-21) - Add parameter to MetricReader constructor to select aggregation per instrument kind ([#2638](https://github.com/open-telemetry/opentelemetry-python/pull/2638)) @@ -143,7 +150,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deprecate InstrumentationLibraryInfo and Add InstrumentationScope ([#2583](https://github.com/open-telemetry/opentelemetry-python/pull/2583)) -## [1.11.0-0.30b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.11.0) - 2022-04-18 +## Version 1.11.0/0.30b0 (2022-04-18) - Rename API Measurement for async instruments to Observation ([#2617](https://github.com/open-telemetry/opentelemetry-python/pull/2617)) @@ -177,7 +184,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update opentelemetry-proto to v0.16.0 ([#2619](https://github.com/open-telemetry/opentelemetry-python/pull/2619)) -## [1.10.0-0.29b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.10.0) - 2022-03-10 +## Version 1.10.0/0.29b0 (2022-03-10) - Docs rework: [non-API docs are moving](https://github.com/open-telemetry/opentelemetry-python/issues/2172) to @@ -198,13 +205,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [exporter/opentelemetry-exporter-prometheus] restore package using the new metrics API ([#2321](https://github.com/open-telemetry/opentelemetry-python/pull/2321)) -## [1.9.1-0.28b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.9.1) - 2022-01-29 +## Version 1.9.1/0.28b1 (2022-01-29) - Update opentelemetry-proto to v0.12.0. Note that this update removes deprecated status codes. ([#2415](https://github.com/open-telemetry/opentelemetry-python/pull/2415)) -## [1.9.0-0.28b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.9.0) - 2022-01-26 - +## Version 1.9.0/0.28b0 (2022-01-26) - Fix SpanLimits global span limit defaulting when set to 0 ([#2398](https://github.com/open-telemetry/opentelemetry-python/pull/2398)) @@ -227,7 +233,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [logs] prevent None from causing problems ([#2410](https://github.com/open-telemetry/opentelemetry-python/pull/2410)) -## [1.8.0-0.27b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.8.0) - 2021-12-17 +## Version 1.8.0/0.27b0 (2021-12-17) - Adds Aggregation and instruments as part of Metrics SDK ([#2234](https://github.com/open-telemetry/opentelemetry-python/pull/2234)) @@ -246,7 +252,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support insecure configuration for OTLP gRPC exporter ([#2350](https://github.com/open-telemetry/opentelemetry-python/pull/2350)) -## [1.7.1-0.26b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.7.0) - 2021-11-11 +## Version 1.7.1/0.26b1 (2021-11-11) - Add support for Python 3.10 ([#2207](https://github.com/open-telemetry/opentelemetry-python/pull/2207)) @@ -267,12 +273,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-test` start releasing to pypi.org ([#2269](https://github.com/open-telemetry/opentelemetry-python/pull/2269)) -## [1.6.2-0.25b2](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.6.2) - 2021-10-19 +## Version 1.6.2/0.25b2 (2021-10-19) - Fix parental trace relationship for opentracing `follows_from` reference ([#2180](https://github.com/open-telemetry/opentelemetry-python/pull/2180)) -## [1.6.1-0.25b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.6.1) - 2021-10-18 +## Version 1.6.1/0.25b1 (2021-10-18) - Fix ReadableSpan property types attempting to create a mapping from a list ([#2215](https://github.com/open-telemetry/opentelemetry-python/pull/2215)) @@ -281,7 +287,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Propagation: only warn about oversized baggage headers when headers exist ([#2212](https://github.com/open-telemetry/opentelemetry-python/pull/2212)) -## [1.6.0-0.25b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.6.0) - 2021-10-13 +## Version 1.6.0/0.25b0 (2021-10-13) - Fix race in `set_tracer_provider()` ([#2182](https://github.com/open-telemetry/opentelemetry-python/pull/2182)) @@ -319,7 +325,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add name to `BatchSpanProcessor` worker thread ([#2186](https://github.com/open-telemetry/opentelemetry-python/pull/2186)) -## [1.5.0-0.24b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.5.0) - 2021-08-26 +## Version 1.5.0/0.24b0 (2021-08-26) - Add pre and post instrumentation entry points ([#1983](https://github.com/open-telemetry/opentelemetry-python/pull/1983)) @@ -345,14 +351,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-api` Attribute keys must be non-empty strings. ([#2057](https://github.com/open-telemetry/opentelemetry-python/pull/2057)) -## [0.23.1](https://github.com/open-telemetry/opentelemetry-python/pull/1987) - 2021-07-26 +## Version 0.23.1 (2021-07-26) ### Changed - Fix opentelemetry-bootstrap dependency script. ([#1987](https://github.com/open-telemetry/opentelemetry-python/pull/1987)) -## [1.4.0-0.23b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.4.0) - 2021-07-21 +## Version 1.4.0/0.23b0 (2021-07-21) ### Added @@ -403,7 +409,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 opentelemetry specification format, rather than opentracing spec format. ([#1878](https://github.com/open-telemetry/opentelemetry-python/pull/1878)) -## [1.3.0-0.22b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.3.0) - 2021-06-01 +## Version 1.3.0/0.22b0 (2021-06-01) ### Added @@ -425,7 +431,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update protos to latest version release 0.9.0 ([#1873](https://github.com/open-telemetry/opentelemetry-python/pull/1873)) -## [1.2.0, 0.21b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.2.0) - 2021-05-11 +## Version 1.2.0/0.21b0 (2021-05-11) ### Added @@ -473,7 +479,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Moved `opentelemetry-instrumentation` to contrib repository. ([#1797](https://github.com/open-telemetry/opentelemetry-python/pull/1797)) -## [1.1.0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.1.0) - 2021-04-20 +## Version 1.1.0 (2021-04-20) ### Added @@ -513,7 +519,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 a secure connection or not. ([#1771](https://github.com/open-telemetry/opentelemetry-python/pull/1771)) -## [1.0.0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.0.0) - 2021-03-26 +## Version 1.0.0 (2021-03-26) ### Added @@ -597,7 +603,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removing support for Python 3.5 ([#1706](https://github.com/open-telemetry/opentelemetry-python/pull/1706)) -## [0.19b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.19b0) - 2021-03-26 +## Version 0.19b0 (2021-03-26) ### Changed @@ -612,14 +618,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removing support for Python 3.5 ([#1706](https://github.com/open-telemetry/opentelemetry-python/pull/1706)) -## [0.18b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.18b0) - 2021-02-16 +## Version 0.18b0 (2021-02-16) ### Added - Add urllib to opentelemetry-bootstrap target list ([#1584](https://github.com/open-telemetry/opentelemetry-python/pull/1584)) -## [1.0.0rc1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.0.0rc1) - 2021-02-12 +## Version 1.0.0rc1 (2021-02-12) ### Changed @@ -652,7 +658,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove Metrics as part of stable, marked as experimental ([#1568](https://github.com/open-telemetry/opentelemetry-python/pull/1568)) -## [0.17b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.17b0) - 2021-01-20 +## Version 0.17b0 (2021-01-20) ### Added @@ -724,14 +730,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-api` Remove ThreadLocalRuntimeContext since python3.4 is not supported. -## [0.16b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.16b1) - 2020-11-26 +## Version 0.16b1 (2020-11-26) ### Added - Add meter reference to observers ([#1425](https://github.com/open-telemetry/opentelemetry-python/pull/1425)) -## [0.16b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.16b0) - 2020-11-25 +## Version 0.16b0 (2020-11-25) ### Added @@ -776,7 +782,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 erasure for dropped spans or spans sampled by the `TraceIdRatioBased` sampler. ([#1394](https://github.com/open-telemetry/opentelemetry-python/pull/1394)) -## [0.15b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.15b0) -2020-11-02 +## Version 0.15b0 (2020-11-02) ### Added @@ -807,7 +813,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove TracerProvider coupling from Tracer init ([#1295](https://github.com/open-telemetry/opentelemetry-python/pull/1295)) -## [0.14b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.14b0) - 2020-10-13 +## Version 0.14b0 (2020-10-13) ### Added @@ -859,7 +865,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `start_as_current_span` and `use_span` can now optionally auto-record any exceptions raised inside the context manager. ([#1162](https://github.com/open-telemetry/opentelemetry-python/pull/1162)) -## [0.13b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.13b0) - 2020-09-17 +## Version 0.13b0 (2020-09-17) ### Added @@ -918,7 +924,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Drop support for Python 3.4 ([#1099](https://github.com/open-telemetry/opentelemetry-python/pull/1099)) -## [0.12b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.12.0) - 2020-08-14 +## Version 0.12b0 (2020-08-14) ### Added @@ -950,7 +956,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update environment variable `OTEL_RESOURCE` to `OTEL_RESOURCE_ATTRIBUTES` as per the specification -## [0.11b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.11.0) - 2020-07-28 +## Version 0.11b0 (2020-07-28) ### Added @@ -966,7 +972,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update span exporter to use OpenTelemetry Proto v0.4.0 ([#872](https://github.com/open-telemetry/opentelemetry-python/pull/889)) -## [0.10b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.10.0) - 2020-06-23 +## Version 0.10b0 (2020-06-23) ### Changed @@ -975,7 +981,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rename CounterAggregator -> SumAggregator ([#816](https://github.com/open-telemetry/opentelemetry-python/pull/816)) -## [0.9b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.9.0) - 2020-06-10 +## Version 0.9b0 (2020-06-10) ### Added @@ -1002,7 +1008,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rename opentelemetry-auto-instrumentation to opentelemetry-instrumentation, and console script `opentelemetry-auto-instrumentation` to `opentelemetry-instrument` -## [0.8b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.8.0) - 2020-05-27 +## Version 0.8b0 (2020-05-27) ### Added @@ -1036,7 +1042,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - deep copy empty attributes ([#714](https://github.com/open-telemetry/opentelemetry-python/pull/714)) -## [0.7b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.7.1) - 2020-05-12 +## Version 0.7b1 (2020-05-12) ### Added @@ -1081,7 +1087,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - bugfix: freezing span attribute sequences, reducing potential user errors ([#529](https://github.com/open-telemetry/opentelemetry-python/pull/529)) -## [0.6b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.6.0) - 2020-03-30 +## Version 0.6b0 (2020-03-30) ### Added @@ -1102,7 +1108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Exporting to collector now works ([#508](https://github.com/open-telemetry/opentelemetry-python/pull/508)) -## [0.5b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.5.0) - 2020-03-16 +## Version 0.5b0 (2020-03-16) ### Added @@ -1137,7 +1143,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Implement observer instrument ([#425](https://github.com/open-telemetry/opentelemetry-python/pull/425)) -## [0.4a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.4.0) - 2020-02-21 +## Version 0.4a0 (2020-02-21) ### Added @@ -1192,7 +1198,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove monotonic and absolute metric instruments ([#410](https://github.com/open-telemetry/opentelemetry-python/pull/410)) -## [0.3a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.3.0) - 2019-12-11 +## Version 0.3a0 (2019-12-11) ### Added @@ -1211,7 +1217,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove option to create unstarted spans from API ([#290](https://github.com/open-telemetry/opentelemetry-python/pull/290)) -## [0.2a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.2.0) - 2019-10-29 +## Version 0.2a0 (2019-10-29) ### Added @@ -1228,7 +1234,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Multiple context API changes - Multiple bugfixes and improvements -## [0.1a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.1.0) - 2019-09-30 +## Version 0.1a0 (2019-09-30) ### Added diff --git a/README.md b/README.md index 03fcdf73b0b..008b4ae5d69 100644 --- a/README.md +++ b/README.md @@ -176,5 +176,5 @@ For project boards and milestones, see the following links: - [Project boards](https://github.com/open-telemetry/opentelemetry-python/projects) - [Milestones](https://github.com/open-telemetry/opentelemetry-python/milestones) -We try to keep these links accurate, so they're the best place to go for questions about project status. The dates and features described in the issues +We try to keep these linksos accurate, so they're the best place to go for questions about project status. The dates and features described in the issues and milestones are estimates and subject to change. diff --git a/RELEASING.md b/RELEASING.md index 975fdf94409..21adcce02f3 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,93 +1,90 @@ -# Releasing OpenTelemetry Packages (for maintainers only) -This document explains how to publish all OT modules at version x.y.z. Ensure that you’re following semver when choosing a version number. - -Release Process: -- [Checkout a clean repo](#checkout-a-clean-repo) -- [Update versions](#update-versions) -- [Create a new branch](#create-a-new-branch) -- [Open a Pull Request](#open-a-pull-request) -- [Create a Release](#create-a-release) -- [Check PyPI](#check-pypi) -- [Move stable tag](#move-stable-tag) -- [Update main](#update-main) -- [Hotfix procedure](#hotfix-procedure) -- [Troubleshooting](#troubleshooting) - - [Publish failed](#publish-failed) - -## Checkout a clean repo -To avoid pushing untracked changes, check out the repo in a new dir - -## Update versions -The update of the version information relies on the information in eachdist.ini to identify which packages are stable, prerelease or -experimental. Update the desired version there to begin the release process. - -## Create a new branch -The following script does the following: -- update main locally -- creates a new release branch `release/` -- updates version and changelog files -- commits the change - -*NOTE: This script was run by a GitHub Action but required the Action bot to be excluded from the CLA check, which it currently is not.* - -```bash -./scripts/prepare_release.sh -``` - -## Open a Pull Request - -The PR should be opened from the `release/` branch created as part of running `prepare_release.sh` in the steps above. - -## Create a Release - -- Create the GH release from the main branch, using a new tag for this micro version, e.g. `v0.7.0` -- Copy the changelogs from all packages that changed into the release notes (and reformat to remove hard line wraps) - - -## Check PyPI - -This should be handled automatically on release by the [publish action](https://github.com/open-telemetry/opentelemetry-python/blob/main/.github/workflows/publish.yml). - -- Check the [action logs](https://github.com/open-telemetry/opentelemetry-python/actions?query=workflow%3APublish) to make sure packages have been uploaded to PyPI -- Check the release history (e.g. https://pypi.org/project/opentelemetry-api/#history) on PyPI - -If for some reason the action failed, see [Publish failed](#publish-failed) below - -## Move stable tag - -This will ensure the docs are pointing at the stable release. - -```bash -git tag -d stable -git tag stable -git push --delete origin tagname -git push origin stable -``` - -To validate this worked, ensure the stable build has run successfully: https://readthedocs.org/projects/opentelemetry-python/builds/. If the build has not run automatically, it can be manually trigger via the readthedocs interface. - -## Update main - -Ensure the version and changelog updates have been applied to main. Update the versions in eachdist.ini once again this time to include the `.dev0` tag and -run eachdist once again: -```bash -./scripts/eachdist.py update_versions --versions stable,prerelease -``` - -## Hotfix procedure - -A `hotfix` is defined as a small change developed to correct a bug that should be released as quickly as possible. Due to the nature of hotfixes, they usually will only affect one or a few packages. Therefore, it usually is not necessary to go through the entire release process outlined above for hotfixes. Follow the below steps how to release a hotfix: - -1. Identify the packages that are affected by the bug. Make the changes to those packages, merging to `main`, as quickly as possible. -2. On your local machine, remove the `dev0` tags from the version number and increment the patch version number. -3. On your local machine, update `CHANGELOG.md` with the date of the hotfix change. -4. With administrator privileges for PyPi, manually publish the affected packages. - 1. Install [twine](https://pypi.org/project/twine/) and [build](https://pypi.org/project/build/) - 2. Navigate to where the `pyproject.toml` file exists for the package you want to publish. - 3. To build the package: run `python -m build`. - 4. Validate your built distributions by running `twine check dist/*`. - 5. Upload distributions to PyPi by running `twine upload dist/*`. -5. Note that since hotfixes are manually published, the build scripts for publish after creating a release are not run. +# Release instructions + +## Preparing a new major or minor release + +* Run the [Prepare release branch workflow](https://github.com/open-telemetry/opentelemetry-python/actions/workflows/prepare-release-branch.yml). + * Press the "Run workflow" button, and leave the default branch `main` selected. + * If making a pre-release of stable components (e.g. release candidate), + enter the pre-release version number, e.g. `1.9.0rc2`. + (otherwise the workflow will pick up the version from `main` and just remove the `.dev` suffix). + * 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 + +* Backport pull request(s) to the release branch. + * Run the [Backport workflow](https://github.com/open-telemetry/opentelemetry-python/actions/workflows/backport.yml). + * Press the "Run workflow" button, then select the release branch from the dropdown list, + e.g. `release/v1.9.x`, then enter the pull request number that you want to backport, + 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 unreleased entries should be `## Unreleased`. +* Run the [Prepare patch release workflow](https://github.com/open-telemetry/opentelemetry-python/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 for updating the version. + +## Making the release + +* Run the [Release workflow](https://github.com/open-telemetry/opentelemetry-python/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 and publish a GitHub release with release notes based on the change log. + * 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). + +## Notes about version numbering for stable components + +* The version number for stable components in the `main` branch is always `X.Y.0.dev`, + where `X.Y.0` represents the next minor release. +* When the release branch is created, you can opt to make a "pre-release", e.g. `X.Y.0rc2`. +* If you ARE NOT making a "pre-release": + * A "long-term" release branch will be created, e.g. `release/v1.9.x-0.21bx` (notice the wildcard x's). + Later on, after the initial release, you can backport PRs to a "long-term" release branch and make patch releases + from it. + * The version number for stable components in the release branch will be bumped to remove the `.dev`, + e.g. `X.Y.0`. + * The version number for stable components in the `main` branch will be bumped to the next version, + e.g. `X.{Y+1}.0.dev`. +* If you ARE making a "pre-release": + * A "short-term" release branch will be created, e.g. `release/v1.9.0rc2-0.21b0` (notice the precise version with no + wildcard x's). "Short-term" release branches do not support backports or patch releases after the initial release. + * The version number for stable components in the `main` branch will not be bumped, e.g. it will remain `X.Y.0.dev` + since the next minor release will still be `X.Y.0`. + +## Notes about version numbering for unstable components + +* The version number for unstable components in the `main` branch is always `0.Yb0.dev`, + where `0.Yb0` represents the next minor release. + * _Question: Is "b" (beta) redundant on "0." releases, or is this a python thing? I'm wondering if we can change it to `0.Y.0` to match up with the practice in js and go repos._ +* Unstable components do not need "pre-releases", and so whether or not you are making a "pre-release" of stable + components: + * The version number for unstable components in the release branch will be bumped to remove the `.dev`, + e.g. `0.Yb0`. + * The version number for unstable components in the `main` branch will be bumped to the next version, + e.g. `0.{Y+1}b0.dev`. + +## After the release + +* Check PyPI + * This should be handled automatically on release by the [publish action](https://github.com/open-telemetry/opentelemetry-python/blob/main/.github/workflows/publish.yml). + * Check the [action logs](https://github.com/open-telemetry/opentelemetry-python/actions?query=workflow%3APublish) to make sure packages have been uploaded to PyPI + * Check the release history (e.g. https://pypi.org/project/opentelemetry-api/#history) on PyPI + * If for some reason the action failed, see [Publish failed](#publish-failed) below +* Move stable tag + * Run the following (TODO automate): + ```bash + git tag -d stable + git tag stable + git push --delete origin tagname + git push origin stable + ``` + * This will ensure the docs are pointing at the stable release. + * To validate this worked, ensure the stable build has run successfully: + https://readthedocs.org/projects/opentelemetry-python/builds/. + If the build has not run automatically, it can be manually trigger via the readthedocs interface. ## Troubleshooting diff --git a/eachdist.ini b/eachdist.ini index 7cc26cc2ca1..40c6db3c180 100644 --- a/eachdist.ini +++ b/eachdist.ini @@ -11,7 +11,7 @@ sortfirst= exporter/* [stable] -version=1.13.0 +version=1.15.0.dev packages= opentelemetry-sdk @@ -30,7 +30,7 @@ packages= opentelemetry-api [prerelease] -version=0.34b0 +version=0.36b0.dev packages= opentelemetry-opentracing-shim diff --git a/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py b/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py index b65ab4af2bb..65fcc50d7d1 100644 --- a/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py +++ b/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py b/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py index b65ab4af2bb..65fcc50d7d1 100644 --- a/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py +++ b/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-jaeger/pyproject.toml b/exporter/opentelemetry-exporter-jaeger/pyproject.toml index 3f7cf695b05..0d5926f24d4 100644 --- a/exporter/opentelemetry-exporter-jaeger/pyproject.toml +++ b/exporter/opentelemetry-exporter-jaeger/pyproject.toml @@ -25,8 +25,8 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-exporter-jaeger-proto-grpc == 1.13.0", - "opentelemetry-exporter-jaeger-thrift == 1.13.0", + "opentelemetry-exporter-jaeger-proto-grpc == 1.15.0.dev", + "opentelemetry-exporter-jaeger-thrift == 1.15.0.dev", ] [project.optional-dependencies] diff --git a/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py b/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py index b65ab4af2bb..65fcc50d7d1 100644 --- a/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py +++ b/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py index 09b3473b7d4..fa69afa640a 100644 --- a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py +++ b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.34b0" +__version__ = "0.36b0.dev" diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml index bf7a261d9fa..e5bf286e288 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml @@ -29,7 +29,7 @@ dependencies = [ "googleapis-common-protos ~= 1.52", "grpcio >= 1.0.0, < 2.0.0", "opentelemetry-api ~= 1.12", - "opentelemetry-proto == 1.13.0", + "opentelemetry-proto == 1.15.0.dev", "opentelemetry-sdk ~= 1.12", ] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml index edfc307c174..1e8784e1a4c 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "backoff >= 1.10.0, < 3.0.0; python_version>='3.7'", "googleapis-common-protos ~= 1.52", "opentelemetry-api ~= 1.12", - "opentelemetry-proto == 1.13.0", + "opentelemetry-proto == 1.15.0.dev", "opentelemetry-sdk ~= 1.12", "requests ~= 2.7", ] diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-otlp/pyproject.toml b/exporter/opentelemetry-exporter-otlp/pyproject.toml index 0f3936ad577..e67187ff27e 100644 --- a/exporter/opentelemetry-exporter-otlp/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp/pyproject.toml @@ -25,8 +25,8 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-exporter-otlp-proto-grpc == 1.13.0", - "opentelemetry-exporter-otlp-proto-http == 1.13.0", + "opentelemetry-exporter-otlp-proto-grpc == 1.15.0.dev", + "opentelemetry-exporter-otlp-proto-http == 1.15.0.dev", ] [project.entry-points.opentelemetry_logs_exporter] diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py index 09b3473b7d4..fa69afa640a 100644 --- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py +++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.34b0" +__version__ = "0.36b0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml index eb5bde04401..acc0c349d44 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ ] dependencies = [ "opentelemetry-api ~= 1.3", - "opentelemetry-exporter-zipkin-json == 1.13.0", + "opentelemetry-exporter-zipkin-json == 1.15.0.dev", "opentelemetry-sdk ~= 1.11", "protobuf ~= 3.12", "requests ~= 2.7", diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin/pyproject.toml b/exporter/opentelemetry-exporter-zipkin/pyproject.toml index 76cac43f4bc..f819b45af6b 100644 --- a/exporter/opentelemetry-exporter-zipkin/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin/pyproject.toml @@ -25,8 +25,8 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-exporter-zipkin-json == 1.13.0", - "opentelemetry-exporter-zipkin-proto-http == 1.13.0", + "opentelemetry-exporter-zipkin-json == 1.15.0.dev", + "opentelemetry-exporter-zipkin-proto-http == 1.15.0.dev", ] [project.optional-dependencies] diff --git a/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py index b9536c24614..0fffbf98707 100644 --- a/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py +++ b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/opentelemetry-api/src/opentelemetry/version.py b/opentelemetry-api/src/opentelemetry/version.py index b9536c24614..0fffbf98707 100644 --- a/opentelemetry-api/src/opentelemetry/version.py +++ b/opentelemetry-api/src/opentelemetry/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/opentelemetry-proto/src/opentelemetry/proto/version.py b/opentelemetry-proto/src/opentelemetry/proto/version.py index b9536c24614..0fffbf98707 100644 --- a/opentelemetry-proto/src/opentelemetry/proto/version.py +++ b/opentelemetry-proto/src/opentelemetry/proto/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/opentelemetry-sdk/pyproject.toml b/opentelemetry-sdk/pyproject.toml index 9b106b83f81..fb3505be9c9 100644 --- a/opentelemetry-sdk/pyproject.toml +++ b/opentelemetry-sdk/pyproject.toml @@ -25,8 +25,8 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-api == 1.13.0", - "opentelemetry-semantic-conventions == 0.34b0", + "opentelemetry-api == 1.15.0.dev", + "opentelemetry-semantic-conventions == 0.36b0.dev", "setuptools >= 16.0", "typing-extensions >= 3.7.4", ] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/version.py b/opentelemetry-sdk/src/opentelemetry/sdk/version.py index b9536c24614..0fffbf98707 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/version.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py b/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py index 09b3473b7d4..fa69afa640a 100644 --- a/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py +++ b/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.34b0" +__version__ = "0.36b0.dev" diff --git a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py index b9536c24614..0fffbf98707 100644 --- a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py +++ b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py index b9536c24614..0fffbf98707 100644 --- a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py +++ b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.13.0" +__version__ = "1.15.0.dev" diff --git a/scripts/eachdist.py b/scripts/eachdist.py index 0c0620e95ac..093c7028c61 100755 --- a/scripts/eachdist.py +++ b/scripts/eachdist.py @@ -547,55 +547,6 @@ def lint_args(args): ) -def update_changelog(path, version, new_entry): - unreleased_changes = False - try: - with open(path, encoding="utf-8") as changelog: - text = changelog.read() - if f"## [{version}]" in text: - raise AttributeError( - f"{path} already contains version {version}" - ) - with open(path, encoding="utf-8") as changelog: - for line in changelog: - if line.startswith("## [Unreleased]"): - unreleased_changes = False - elif line.startswith("## "): - break - elif len(line.strip()) > 0: - unreleased_changes = True - - except FileNotFoundError: - print(f"file missing: {path}") - return - - if unreleased_changes: - print(f"updating: {path}") - text = re.sub(r"## \[Unreleased\].*", new_entry, text) - with open(path, "w", encoding="utf-8") as changelog: - changelog.write(text) - - -def update_changelogs(version): - today = datetime.now().strftime("%Y-%m-%d") - new_entry = """## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v{version}...HEAD) - -## [{version}](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v{version}) - {today} - -""".format( - version=version, today=today - ) - errors = False - try: - update_changelog("./CHANGELOG.md", version, new_entry) - except Exception as err: # pylint: disable=broad-except - print(str(err)) - errors = True - - if errors: - sys.exit(1) - - def find(name, path): for root, _, files in os.walk(path): if name in files: @@ -675,9 +626,6 @@ def release_args(args): update_dependencies(targets, version, packages) update_version_files(targets, version, packages) - update_changelogs(updated_versions[0]) - - def test_args(args): clean_remainder_args(args.pytestargs) execute_args( diff --git a/scripts/prepare_release.sh b/scripts/prepare_release.sh deleted file mode 100755 index 607b6189bb5..00000000000 --- a/scripts/prepare_release.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# -# This script: -# 1. parses the version number from the branch name -# 2. updates version.py files to match that version -# 3. iterates through CHANGELOG.md files and updates any files containing -# unreleased changes -# 4. sets the output variable 'version_updated' to determine whether -# the github action to create a pull request should run. this allows -# maintainers to merge changes back into the release branch without -# triggering unnecessary pull requests -# - -VERSION=$(./scripts/eachdist.py version --mode stable)-$(./scripts/eachdist.py version --mode prerelease) -echo "Using version ${VERSION}" - - -# create the release branch -git checkout -b release/${VERSION} -git push origin release/${VERSION} - -./scripts/eachdist.py update_versions --versions stable,prerelease -rc=$? -if [ $rc != 0 ]; then - echo "::set-output name=version_updated::0" - exit 0 -fi - -git add . - -git commit -m "updating changelogs and version to ${VERSION}" - -echo "Time to create a release, here's a sample title:" -echo "[pre-release] Update changelogs, version [${VERSION}]" diff --git a/shim/opentelemetry-opentracing-shim/pyproject.toml b/shim/opentelemetry-opentracing-shim/pyproject.toml index 46ba16884ec..68b3faba194 100644 --- a/shim/opentelemetry-opentracing-shim/pyproject.toml +++ b/shim/opentelemetry-opentracing-shim/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ [project.optional-dependencies] test = [ - "opentelemetry-test-utils == 0.34b0", + "opentelemetry-test-utils == 0.36b0.dev", "opentracing ~= 2.2.0", ] diff --git a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py index 09b3473b7d4..fa69afa640a 100644 --- a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py +++ b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.34b0" +__version__ = "0.36b0.dev" diff --git a/tests/opentelemetry-test-utils/pyproject.toml b/tests/opentelemetry-test-utils/pyproject.toml index e4307e16f64..f280dff89f1 100644 --- a/tests/opentelemetry-test-utils/pyproject.toml +++ b/tests/opentelemetry-test-utils/pyproject.toml @@ -25,8 +25,8 @@ classifiers = [ ] dependencies = [ "asgiref ~= 3.0", - "opentelemetry-api == 1.13.0", - "opentelemetry-sdk == 1.13.0", + "opentelemetry-api == 1.15.0.dev", + "opentelemetry-sdk == 1.15.0.dev", ] [project.optional-dependencies] diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py index a590883f7e0..5ea2af4dddc 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py @@ -1 +1 @@ -__version__ = "0.34b0" +__version__ = "0.36b0.dev"