name: "[Package] Release"
on:
  workflow_dispatch:
    inputs:
      package:
        type: choice
        options:
        - opentelemetry-propagator-aws-xray
        - opentelemetry-resource-detector-azure
        - opentelemetry-sdk-extension-aws
        - opentelemetry-instrumentation-openai-v2
        - opentelemetry-instrumentation-vertexai
        - opentelemetry-instrumentation-google-genai
        description: 'Package to be released'
        required: true
run-name: "[Package][${{ inputs.package }}] Release"
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - run: |
          if [[ $GITHUB_REF_NAME != package-release/${{ inputs.package }}* ]]; then
            echo this workflow should only be run against package-release/${{ inputs.package }}* branches
            exit 1
          fi

      - uses: actions/checkout@v4

      - name: Set environment variables
        run: |
          version=$(./scripts/eachdist.py version --package ${{ inputs.package }})
          if [[ $version =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
            major="${BASH_REMATCH[1]}"
            minor="${BASH_REMATCH[2]}"
            patch="${BASH_REMATCH[3]}"
            if [[ $patch != 0 ]]; then
              prior_version_when_patch="${major}.${minor}.$((patch - 1))"
            fi
          elif [[ $version =~ ^([0-9]+)\.([0-9]+)b([0-9]+)$ ]]; then
            major="${BASH_REMATCH[1]}"
            minor="${BASH_REMATCH[2]}"
            patch="${BASH_REMATCH[3]}"

            if [[ $patch != 0 ]]; then
              prior_version_when_patch="${major}.${minor}b$((patch - 1))"
            fi
          else
            echo "unexpected version: $version"
            exit 1
          fi

          path=$(./scripts/eachdist.py find-package --package ${{ inputs.package }})
          echo "CHANGELOG=./$path/CHANGELOG.md" >> $GITHUB_ENV
          echo "PACKAGE_NAME=${{ inputs.package }}" >> $GITHUB_ENV
          echo "VERSION=$version" >> $GITHUB_ENV
          echo "RELEASE_TAG=${{ inputs.package }}==$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@v4
        with:
          ref: main

      - name: Check that change log update was merged to main
        run: |
          if [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; then
            # not making a patch release
            if ! grep --quiet "^## Version ${VERSION}" ${CHANGELOG}; 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@v4

        # next few steps publish to pypi
      - uses: actions/setup-python@v5
        with:
          python-version: '3.8'

      - name: Build wheels
        run: ./scripts/build_a_package.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.
      # EDIT: 5/31/2024 - TestPypi now requires a verified email. Commenting out as a temporary measure
      # until we found TestPypi credentials.
      # - 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: ./scripts/generate_release_notes.sh

      - name: Create GitHub release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh release create --target $GITHUB_REF_NAME \
                            --title "${PACKAGE_NAME} ${VERSION}" \
                            --notes-file /tmp/release-notes.txt \
                            --discussion-category announcements \
                            $RELEASE_TAG

      - uses: actions/checkout@v4
        with:
          ref: main

      - name: Copy change log updates to main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: ./scripts/merge_changelog_to_main.sh

      - 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.OPENTELEMETRYBOT_GITHUB_TOKEN }}
        run: |
          message="Copy changelog updates from $GITHUB_REF_NAME"
          body="Copy changelog updates from \`$GITHUB_REF_NAME\`."
          branch="opentelemetrybot/changelog-${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
