22#
33# This workflow handles the complete LoongSuite release process:
44#
5- # 1. PyPI packages (loongsuite-util-genai, loongsuite-distro) - .whl only, NOT loongsuite-python-agent.tar.gz
6- # 2. GitHub Release (instrumentation-genai/*, instrumentation-loongsuite/* as tar.gz)
5+ # 1. Create release/{version} branch from main
6+ # 2. Build packages (bootstrap_gen.py, PyPI wheels, GitHub Release tar.gz)
7+ # 3. Collect changelogs and archive Unreleased sections
8+ # 4. Commit & push release branch
9+ # 5. Create GitHub Release
10+ # 6. Publish to PyPI / Test PyPI
11+ #
12+ # The core logic lives in scripts/loongsuite/loongsuite_release.sh, which can also be
13+ # run locally for the same workflow.
714#
815# Trigger:
916# - workflow_dispatch: Manual trigger with version inputs
3037 upstream_version :
3138 description : ' Upstream OTel version (e.g., 0.60b1) - for opentelemetry-* packages in bootstrap_gen.py'
3239 required : true
33- release_notes :
34- description : ' Release notes (optional, uses CHANGELOG-loongsuite.md Unreleased if empty)'
35- required : false
3640 skip_pypi :
3741 description : ' Skip PyPI publish (for testing)'
3842 type : boolean
4852 tags :
4953 - ' v*'
5054
51- permissions :
52- contents : read
53-
5455env :
5556 PYTHON_VERSION : ' 3.11'
5657
5758jobs :
58- # Build all packages
59+ # Build all packages, create release branch, archive changelogs
5960 build :
6061 runs-on : ubuntu-latest
62+ permissions :
63+ contents : write
6164 outputs :
6265 loongsuite_version : ${{ steps.version.outputs.loongsuite_version }}
6366 upstream_version : ${{ steps.version.outputs.upstream_version }}
6467 steps :
6568 - uses : actions/checkout@v4
69+ with :
70+ fetch-depth : 0
6671
6772 - name : Set versions from tag or input
6873 id : version
6974 run : |
7075 if [[ "${{ github.event_name }}" == "push" && "${{ github.ref_type }}" == "tag" ]]; then
71- # Tag-based release: extract version from tag (v0.1.0 -> 0.1.0)
7276 tag="${GITHUB_REF#refs/tags/}"
7377 loongsuite_version="${tag#v}"
74- # For tag-based release, upstream_version must be set via environment or default
7578 upstream_version="${UPSTREAM_VERSION:-0.60b1}"
7679 else
77- # Manual release: use inputs
7880 loongsuite_version="${{ github.event.inputs.loongsuite_version }}"
7981 upstream_version="${{ github.event.inputs.upstream_version }}"
8082 fi
9092
9193 echo "loongsuite_version=$loongsuite_version" >> $GITHUB_OUTPUT
9294 echo "upstream_version=$upstream_version" >> $GITHUB_OUTPUT
93- echo "LOONGSUITE_VERSION=$loongsuite_version" >> $GITHUB_ENV
94- echo "UPSTREAM_VERSION=$upstream_version" >> $GITHUB_ENV
9595
9696 echo "LoongSuite version: $loongsuite_version"
9797 echo "Upstream version: $upstream_version"
@@ -100,51 +100,34 @@ jobs:
100100 with :
101101 python-version : ${{ env.PYTHON_VERSION }}
102102
103- - name : Install build dependencies
103+ - name : Configure git for CI
104104 run : |
105- python -m pip install --upgrade pip
106- python -m pip install -r pkg-requirements.txt
105+ git config user.name "github-actions[bot]"
106+ git config user.email "github-actions[bot]@users.noreply.github.com"
107107
108- - name : Generate bootstrap_gen.py with versions
108+ - name : Run release script
109109 run : |
110- python scripts/generate_loongsuite_bootstrap.py \
110+ ./scripts/loongsuite/loongsuite_release.sh \
111+ --loongsuite-version ${{ steps.version.outputs.loongsuite_version }} \
111112 --upstream-version ${{ steps.version.outputs.upstream_version }} \
112- --loongsuite-version ${{ steps.version.outputs.loongsuite_version }}
113-
114- echo "Generated bootstrap_gen.py:"
115- head -30 loongsuite-distro/src/loongsuite/distro/bootstrap_gen.py
116-
117- - name : Build PyPI packages
118- run : |
119- python scripts/build_loongsuite_package.py \
120- --build-pypi \
121- --version ${{ steps.version.outputs.loongsuite_version }}
122-
123- echo "PyPI packages built:"
124- ls -la dist/*.whl
125-
126- - name : Build GitHub Release packages
127- run : |
128- python scripts/build_loongsuite_package.py \
129- --build-github-release \
130- --version ${{ steps.version.outputs.loongsuite_version }}
131-
132- echo "GitHub Release tar:"
133- ls -la dist/*.tar.gz
113+ --skip-install \
114+ --skip-github-release
134115
135116 - name : Upload PyPI artifacts
136117 uses : actions/upload-artifact@v4
137118 with :
138119 name : pypi-packages
139120 path : |
140- dist/loongsuite_util_genai-*.whl
141- dist/loongsuite_distro-*.whl
121+ dist-pypi /loongsuite_util_genai-*.whl
122+ dist-pypi /loongsuite_distro-*.whl
142123
143- - name : Upload GitHub Release artifact
124+ - name : Upload GitHub Release artifacts
144125 uses : actions/upload-artifact@v4
145126 with :
146127 name : github-release
147- path : dist/loongsuite-python-agent-*.tar.gz
128+ path : |
129+ dist/loongsuite-python-agent-*.tar.gz
130+ dist/release-notes.md
148131
149132 # Publish to production PyPI
150133 publish-pypi :
@@ -157,7 +140,7 @@ jobs:
157140 name : pypi
158141 url : https://pypi.org/project/loongsuite-distro/
159142 permissions :
160- id-token : write # For OIDC; or use PYPI_API_TOKEN secret
143+ id-token : write
161144 steps :
162145 - name : Download PyPI artifacts
163146 uses : actions/download-artifact@v4
@@ -195,78 +178,20 @@ jobs:
195178 needs : build
196179 runs-on : ubuntu-latest
197180 permissions :
198- contents : write # Required for creating releases
181+ contents : write
199182 steps :
200- - uses : actions/checkout@v4
201-
202- - name : Download GitHub Release artifact
183+ - name : Download GitHub Release artifacts
203184 uses : actions/download-artifact@v4
204185 with :
205186 name : github-release
206187 path : dist/
207188
208- - name : Generate release notes
209- id : release_notes
210- run : |
211- LOONGSUITE_VERSION="${{ needs.build.outputs.loongsuite_version }}"
212- UPSTREAM_VERSION="${{ needs.build.outputs.upstream_version }}"
213-
214- if [[ -n "${{ github.event.inputs.release_notes }}" ]]; then
215- echo "${{ github.event.inputs.release_notes }}" > /tmp/release-notes.txt
216- else
217- # Start with header
218- cat > /tmp/release-notes.txt << EOF
219- # LoongSuite Python Agent v${LOONGSUITE_VERSION}
220-
221- ## Installation
222-
223- \`\`\`bash
224- pip install loongsuite-distro==${LOONGSUITE_VERSION}
225- loongsuite-bootstrap -a install --version ${LOONGSUITE_VERSION}
226- \`\`\`
227-
228- ## Package Versions
229-
230- - loongsuite-* packages: ${LOONGSUITE_VERSION}
231- - opentelemetry-* packages: ${UPSTREAM_VERSION}
232-
233- ---
234-
235- EOF
236-
237- # Collect from root CHANGELOG-loongsuite.md
238- if [[ -f CHANGELOG-loongsuite.md ]]; then
239- echo "## loongsuite-distro" >> /tmp/release-notes.txt
240- echo "" >> /tmp/release-notes.txt
241- sed -n '/^## \[*Unreleased\]*$/,/^## /p' CHANGELOG-loongsuite.md | sed '/^## /d' >> /tmp/release-notes.txt
242- echo "" >> /tmp/release-notes.txt
243- fi
244-
245- # Collect from instrumentation-loongsuite/*/CHANGELOG.md
246- for changelog in instrumentation-loongsuite/*/CHANGELOG.md; do
247- if [[ -f "$changelog" ]]; then
248- pkg_dir=$(dirname "$changelog")
249- pkg_name=$(basename "$pkg_dir")
250- unreleased_content=$(sed -n '/^## \[*Unreleased\]*$/,/^## /p' "$changelog" | sed '/^## /d')
251- if [[ -n "$unreleased_content" && "$unreleased_content" =~ [^[:space:]] ]]; then
252- echo "## $pkg_name" >> /tmp/release-notes.txt
253- echo "" >> /tmp/release-notes.txt
254- echo "$unreleased_content" >> /tmp/release-notes.txt
255- echo "" >> /tmp/release-notes.txt
256- fi
257- fi
258- done
259- fi
260-
261- echo "Release notes:"
262- cat /tmp/release-notes.txt
263-
264189 - name : Create GitHub release
265190 env :
266191 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
267192 run : |
268193 VERSION="${{ needs.build.outputs.loongsuite_version }}"
269194 gh release create "v${VERSION}" \
270195 --title "LoongSuite Python Agent v${VERSION}" \
271- --notes-file /tmp/ release-notes.txt \
196+ --notes-file dist/ release-notes.md \
272197 dist/loongsuite-python-agent-${VERSION}.tar.gz
0 commit comments