-
Notifications
You must be signed in to change notification settings - Fork 13
166 lines (146 loc) · 6.07 KB
/
Copy pathrelease.yml
File metadata and controls
166 lines (146 loc) · 6.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
name: Build and upload to PyPI and create GitHub release
# https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
concurrency:
group: ${{ github.workflow }}-${{ github.event.number }}-${{ github.event.ref }}
cancel-in-progress: true
on:
push:
tags:
- "[0-9]+.[0-9]+.[0-9]+*" # Push events for official release tags
- "test-release/[0-9]+.[0-9]+.[0-9]+*" # Push events for test release tags
jobs:
# Call the reusable build workflow to build both PyPI and Conda artifacts
build:
name: Build distribution artifacts
uses: ./.github/workflows/_build.yml
# Job that pushes dist artifacts to public PyPI for official release tags
official-pypi-publish:
name: Upload official release to PyPI
# Prevent running on test-release tags
if: startsWith(github.ref, 'refs/tags/test-release') == false
needs:
- build
runs-on: ubuntu-latest
environment:
name: official-pypi-publish-environment
url: https://pypi.org/p/space_packet_parser # Public PyPI
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
steps:
# This downloads the build artifacts from the build job
- name: Download distribution artifacts
uses: actions/download-artifact@v8
with:
name: python-package-distributions
path: dist/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.14.2
# Job that pushes dist artifacts to TestPyPI for test release tags
test-pypi-publish:
name: Upload testing release to TestPyPI
# Only run on test-release tags
if: startsWith(github.ref, 'refs/tags/test-release')
needs:
- build
runs-on: ubuntu-latest
environment:
name: test-pypi-publish-environment
url: https://test.pypi.org/p/space_packet_parser # TestPyPI
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
steps:
# This downloads the build artifacts from the build job
- name: Download distribution artifacts
uses: actions/download-artifact@v8
with:
name: python-package-distributions
path: dist/
- name: Publish to TestPyPI
uses: pypa/gh-action-pypi-publish@v1.14.2
with:
repository-url: https://test.pypi.org/legacy/
# Job that publishes Conda package to Anaconda.org
anaconda-publish:
name: Publish Anaconda package
needs:
- build
runs-on: ubuntu-latest
environment:
name: conda-publish-environment
steps:
- name: Download Conda artifact
uses: actions/download-artifact@v8
with:
name: conda-package
path: conda-package/
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v4
with:
channels: conda-forge,defaults
auto-update-conda: true
python-version: "3.11"
- name: Publish to Anaconda
shell: bash -l {0}
env:
# We set "--channel test-release" if the tag starts with refs/tags/test-release
ANACONDA_CHANNEL_OPTION: ${{ startsWith(github.ref, 'refs/tags/test-release') && '--channel test-release' || '' }}
ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_TOKEN }}
run: |
conda install -y anaconda-client
anaconda upload --user ${{ vars.ANACONDA_USER_NAME }} $ANACONDA_CHANNEL_OPTION conda-package/**/space_packet_parser-*.conda
# Job that publishes a release to GitHub
create-github-release:
name: Create GitHub Release
runs-on: ubuntu-latest
environment:
name: create-github-release-environment
permissions:
id-token: write # IMPORTANT: mandatory for sigstore
contents: write # IMPORTANT: mandatory for making GitHub Releases
steps:
- name: Determine if the release is a prerelease
# Checks the regex form of the tag to see if there is a suffix after the semver
# Marks final releases only for tags matching the regex (no version suffixes)
# All other releases are marked as prereleases
# Sets the behavior by setting the PRE_RELEASE_OPTION environment variable in the GITHUB_ENV file.
# Note: This environment variable is only available to later steps via the ${{ env.PRE_RELEASE_OPTION }}
# syntax
run: |
if [[ ${{ github.ref_name }} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "PRE_RELEASE_OPTION=''" >> $GITHUB_ENV # Not a prerelease
else
echo "PRE_RELEASE_OPTION=--prerelease" >> $GITHUB_ENV # Is a prerelease
fi
- name: Get latest non-prerelease release
# This fetches the "latest" (non-prerelease) release ref,
# so we can generate release notes from that point instead of the most recent prerelease.
# Sets LATEST_RELEASE environment variable in the GITHUB_ENV file
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
latest_release=$(gh release list --repo "${{ github.repository }}" --limit 100 --json tagName,isPrerelease --jq '.[] | select(.isPrerelease == false) | .tagName' | head -n 1)
if [ -z "$latest_release" ]; then
echo "No non-prerelease release found."
exit 1
fi
echo "LATEST_RELEASE_TAG=$latest_release" >> $GITHUB_ENV
- name: Create GitHub Release
env:
GITHUB_TOKEN: ${{ github.token }}
# Uses the GitHub CLI to generate the Release and auto-generate the release notes. Also generates
# the Release title based on the annotation on the git tag.
run: |
RELEASE_NAME=$(basename "${{ github.ref_name }}")
ARGS=(
"${{ github.ref_name }}"
--repo "${{ github.repository }}"
--title "$RELEASE_NAME"
)
if [ "${{ env.PRE_RELEASE_OPTION }}" = "--prerelease" ]; then
ARGS+=(--prerelease)
fi
ARGS+=(
--generate-notes
--notes-start-tag "${{ env.LATEST_RELEASE_TAG }}"
)
gh release create "${ARGS[@]}"