name: Project release on Github on: workflow_dispatch: # this is useful to re-generate the release page without a new tag being pushed push: tags: - "v2.[0-9]+.[0-9]+*" # Ignore release versions tagged with -rc0 suffix - "!v2.[0-9]+.[0-9]-rc0" jobs: generate-notes: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-tags: true fetch-depth: 0 # slow but needed by reno - name: Parse version id: version run: | echo "current_release=$(awk -F \\- '{print $1}' < VERSION.txt)" >> "$GITHUB_OUTPUT" echo "current_pre_release=$(awk -F \\- '{print $2}' < VERSION.txt)" >> "$GITHUB_OUTPUT" - name: Install reno run: | python -m pip install --upgrade pip pip install "reno<5" # Remove next version rc0 tag in the CI environment to prevent reno from assigning notes to future releases. # This ensures release notes are correctly aggregated for the current version. # This is a workaround. Can be removed if the release process is fully aligned with reno. - name: Delete next version rc0 tag in the CI environment run: | # Parse version X.Y.Z and increment Y for next minor version IFS='.' read -r MAJOR MINOR _ <<< "${{ steps.version.outputs.current_release }}" NEXT_MINOR=$((MINOR + 1)) NEXT_TAG="v${MAJOR}.${NEXT_MINOR}.0-rc0" if git rev-parse --verify "$NEXT_TAG" >/dev/null 2>&1; then git tag -d "$NEXT_TAG" echo "Deleted local tag $NEXT_TAG" else echo "Tag $NEXT_TAG does not exist locally" fi - name: Generate release notes env: EARLIEST_VERSION: v${{ steps.version.outputs.current_release }}-rc1 run: | reno report --no-show-source --ignore-cache --earliest-version "$EARLIEST_VERSION" -o relnotes.rst - name: Convert to Markdown uses: docker://pandoc/core:3.8 with: args: "--from rst --to gfm --syntax-highlighting=none --wrap=none relnotes.rst -o relnotes.md" # We copy the relnotes file since the original one cannot be modified due to permissions - name: Copy relnotes file run: | cat relnotes.md > enhanced_relnotes.md - name: Add contributor list # only for minor releases and minor release candidates (not bugfix releases) if: endsWith(steps.version.outputs.current_release, '.0') env: GH_TOKEN: ${{ github.token }} START: v${{ steps.version.outputs.current_release }}-rc0 END: ${{ github.ref_name }} run: | JQ_EXPR='[.commits[].author.login] | map(select(. != null and . != "HaystackBot" and . != "dependabot[bot]")) | unique | sort_by(ascii_downcase) | map("@\(.)") | join(", ")' CONTRIBUTORS=$(gh api "repos/deepset-ai/haystack/compare/$START...$END" \ --jq "$JQ_EXPR") || { echo "Unable to fetch contributors"; exit 1; } { echo "" echo "## 💙 Big thank you to everyone who contributed to this release!" echo "" echo "$CONTRIBUTORS" } >> enhanced_relnotes.md - name: Debug run: | cat enhanced_relnotes.md - uses: ncipollo/release-action@v1 with: bodyFile: "enhanced_relnotes.md" prerelease: ${{ steps.version.outputs.current_pre_release != '' }} allowUpdates: true