Skip to content

Commit d4642c1

Browse files
authored
Improve CI workflows and release process (#119)
1 parent afa8cf5 commit d4642c1

4 files changed

Lines changed: 125 additions & 136 deletions

File tree

.github/workflows/check.yaml

Lines changed: 60 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -10,146 +10,139 @@ concurrency:
1010

1111
jobs:
1212
build:
13-
name: Build plugin
13+
name: 📦 Build
1414
runs-on: ubuntu-latest
15-
outputs:
16-
version: ${{ steps.properties.outputs.version }}
17-
changelog: ${{ steps.properties.outputs.changelog }}
18-
pluginVerifierHomeDir: ${{ steps.properties.outputs.pluginVerifierHomeDir }}
19-
platformVersion: ${{ steps.properties.outputs.platformVersion }}
2015
steps:
21-
- name: Maximize Build Space
16+
- name: 🧹 Free disk space
2217
uses: jlumbroso/free-disk-space@main
2318
with:
2419
tool-cache: false
2520
large-packages: false
26-
- name: Checkout git repository
21+
- name: 📥 Checkout
2722
uses: actions/checkout@v6
28-
- name: Set up Java
23+
- name: Set up Java
2924
uses: actions/setup-java@v5
3025
with:
3126
distribution: zulu
3227
java-version: 21
33-
- name: Set up Gradle
28+
- name: 🐘 Set up Gradle
3429
uses: gradle/actions/setup-gradle@v5
35-
- name: Build plugin
30+
- name: 🔨 Build plugin
3631
run: ./gradlew --console=plain buildPlugin
37-
- name: Prepare Plugin Artifact
32+
- name: 📁 Prepare artifact
3833
id: artifact
39-
shell: bash
4034
run: |
4135
cd ${{ github.workspace }}/build/distributions
4236
FILENAME=`ls *.zip`
4337
unzip "$FILENAME" -d content
4438
echo "filename=${FILENAME:0:-4}" >> $GITHUB_OUTPUT
45-
- name: Upload artifact for later download
39+
- name: 📤 Upload artifact
4640
uses: actions/upload-artifact@v6
4741
with:
4842
name: ${{ steps.artifact.outputs.filename }}
4943
path: ./build/distributions/content/*/*
50-
- name: Export plugin properties
51-
id: properties
52-
shell: bash
53-
run: |
54-
PROPERTIES="$(./gradlew properties --console=plain -q)"
55-
VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')"
56-
echo "version=$VERSION" >> $GITHUB_OUTPUT
57-
echo "pluginVerifierHomeDir=$HOME/.pluginVerifier" >> $GITHUB_OUTPUT
58-
echo "platformVersion=$(echo "$PROPERTIES" | grep "^platformVersion:" | cut -f2- -d ' ')" >> $GITHUB_OUTPUT
59-
CHANGELOG="$(./gradlew getChangelog --unreleased --no-header --console=plain -q)"
60-
echo "changelog<<EOF" >> $GITHUB_OUTPUT
61-
echo "$CHANGELOG" >> $GITHUB_OUTPUT
62-
echo "EOF" >> $GITHUB_OUTPUT
6344

6445
verify:
65-
name: Verify (${{ matrix.ide }})
66-
needs: [build]
46+
name: 🔍 Verify (${{ matrix.ide }})
6747
runs-on: ubuntu-latest
6848
strategy:
6949
fail-fast: false
7050
matrix:
71-
ide: [PC, PY]
51+
ide: ${{ github.event_name == 'pull_request' && fromJson('["PC"]') || fromJson('["PC", "PY"]') }}
7252
steps:
73-
- name: Free disk space
53+
- name: 🧹 Free disk space
7454
uses: jlumbroso/free-disk-space@main
7555
with:
7656
tool-cache: false
7757
large-packages: false
7858
android: true
7959
dotnet: true
80-
- name: Checkout git repository
60+
haskell: true
61+
docker-images: true
62+
- name: 📥 Checkout
8163
uses: actions/checkout@v6
82-
- name: Set up Java
64+
- name: Set up Java
8365
uses: actions/setup-java@v5
8466
with:
8567
distribution: zulu
8668
java-version: 21
87-
- name: Set up Gradle
69+
- name: 🐘 Set up Gradle
8870
uses: gradle/actions/setup-gradle@v5
89-
with:
90-
validate-wrappers: false
91-
cache-read-only: false
92-
- name: Cache plugin verifier IDEs
71+
- name: 💾 Cache verifier IDEs
9372
uses: actions/cache@v5
9473
with:
9574
path: ~/.pluginVerifier/ides
96-
key: plugin-verifier-ides-${{ matrix.ide }}-${{ needs.build.outputs.platformVersion }}
97-
- name: Clean corrupted Gradle transforms
98-
run: rm -rf ~/.gradle/caches/*/transforms
99-
- name: Run verification
75+
key: plugin-verifier-ides-${{ matrix.ide }}-${{ hashFiles('gradle.properties') }}
76+
- name: ✅ Run verification
10077
run: ./gradlew verifyPlugin -PverifyIde=${{ matrix.ide }}
101-
- name: Collect verification result
78+
- name: 📤 Upload results
10279
if: ${{ always() }}
10380
uses: actions/upload-artifact@v6
10481
with:
10582
name: pluginVerifier-result-${{ matrix.ide }}
10683
path: ${{ github.workspace }}/build/reports/pluginVerifier
10784

10885
lint:
109-
name: Lint
110-
needs: [build]
86+
name: 🧹 Lint
11187
runs-on: ubuntu-latest
11288
steps:
113-
- name: Checkout git repository
89+
- name: 🧹 Free disk space
90+
uses: jlumbroso/free-disk-space@main
91+
with:
92+
tool-cache: false
93+
large-packages: false
94+
- name: 📥 Checkout
11495
uses: actions/checkout@v6
115-
- name: Set up Java
96+
- name: Set up Java
11697
uses: actions/setup-java@v5
11798
with:
11899
distribution: zulu
119100
java-version: 21
120-
- name: Set up Gradle
101+
- name: 🐘 Set up Gradle
121102
uses: gradle/actions/setup-gradle@v5
122-
with:
123-
cache-read-only: false
124-
- name: Clean corrupted Gradle transforms
125-
run: rm -rf ~/.gradle/caches/*/transforms
126-
- name: Run linter
103+
- name: 🔍 Run linter
127104
run: ./gradlew ktlintCheck
128105

129106
test:
130-
name: Run tests
131-
needs: [build]
107+
name: 🧪 Unit tests
132108
runs-on: ubuntu-latest
133109
steps:
134-
- name: Checkout git repository
110+
- name: 🧹 Free disk space
111+
uses: jlumbroso/free-disk-space@main
112+
with:
113+
tool-cache: false
114+
large-packages: false
115+
- name: 📥 Checkout
135116
uses: actions/checkout@v6
136-
- name: Set up Java
117+
- name: Set up Java
137118
uses: actions/setup-java@v5
138119
with:
139120
distribution: zulu
140121
java-version: 21
141-
- name: Set up Gradle
122+
- name: 🐘 Set up Gradle
142123
uses: gradle/actions/setup-gradle@v5
124+
- name: ✅ Run tests with coverage
125+
run: ./gradlew test koverVerify
126+
127+
ui-test:
128+
name: 🖥️ UI tests
129+
runs-on: ubuntu-latest
130+
steps:
131+
- name: 🧹 Free disk space
132+
uses: jlumbroso/free-disk-space@main
143133
with:
144-
validate-wrappers: false
145-
cache-read-only: false
146-
- name: Clean corrupted Gradle transforms
147-
run: rm -rf ~/.gradle/caches/*/transforms
148-
- name: Run unit tests
149-
run: ./gradlew test
150-
- name: Verify 100% coverage
151-
run: ./gradlew koverVerify
152-
- name: Run UI tests
134+
tool-cache: false
135+
large-packages: false
136+
- name: 📥 Checkout
137+
uses: actions/checkout@v6
138+
- name: ☕ Set up Java
139+
uses: actions/setup-java@v5
140+
with:
141+
distribution: zulu
142+
java-version: 21
143+
- name: 🐘 Set up Gradle
144+
uses: gradle/actions/setup-gradle@v5
145+
- name: 🖥️ Run UI tests
153146
run: |
154147
export DISPLAY=:99.0
155148
Xvfb :99 -screen 0 1920x1080x24 &
@@ -159,31 +152,3 @@ jobs:
159152
echo "IDE is ready"
160153
./gradlew uiTest
161154
kill %1 %2 || true
162-
163-
releaseDraft:
164-
name: Create release draft
165-
if: github.event_name != 'pull_request'
166-
needs: [build, lint, test, verify]
167-
runs-on: ubuntu-latest
168-
permissions:
169-
contents: write
170-
steps:
171-
- name: Checkout git repository
172-
uses: actions/checkout@v6
173-
- name: Remove old release drafts
174-
env:
175-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
176-
run: |
177-
gh api repos/{owner}/{repo}/releases --jq '.[] | select(.draft == true) | .id' \
178-
| xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{}
179-
- name: Create release draft
180-
env:
181-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
182-
run: |
183-
gh release create "v${{ needs.build.outputs.version }}" \
184-
--draft \
185-
--title "v${{ needs.build.outputs.version }}" \
186-
--notes "$(cat << 'EOM'
187-
${{ needs.build.outputs.changelog }}
188-
EOM
189-
)"

.github/workflows/release.yaml

Lines changed: 46 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
# Running the following secrets to be provided: PUBLISH_TOKEN, PRIVATE_KEY, PRIVATE_KEY_PASSWORD, CERTIFICATE_CHAIN.
1+
# Secrets required: PUBLISH_TOKEN, PRIVATE_KEY, PRIVATE_KEY_PASSWORD, CERTIFICATE_CHAIN.
22
name: Release
33
on:
44
release:
5-
types: [prereleased, released]
5+
types: [released]
6+
67
jobs:
7-
release:
8-
name: Publish Plugin
8+
publish:
9+
name: 🚀 Publish
910
runs-on: ubuntu-latest
1011
permissions:
1112
contents: write
@@ -14,73 +15,79 @@ jobs:
1415
name: release
1516
url: https://plugins.jetbrains.com/plugin/20536-pyvenv-manage-2
1617
steps:
17-
- name: Checkout git repository
18+
- name: 📥 Checkout
1819
uses: actions/checkout@v6
1920
with:
2021
ref: ${{ github.event.release.tag_name }}
21-
- name: Maximize Build Space
22+
- name: 🧹 Free disk space
2223
uses: jlumbroso/free-disk-space@main
2324
with:
2425
tool-cache: false
2526
large-packages: false
26-
- name: Set up Java
27+
- name: Set up Java
2728
uses: actions/setup-java@v5
2829
with:
2930
distribution: zulu
3031
java-version: 21
31-
- name: Set up Gradle
32+
- name: 🐘 Set up Gradle
3233
uses: gradle/actions/setup-gradle@v5
33-
- name: Extract plugin properties
34-
id: properties
35-
shell: bash
34+
- name: 🏷️ Set version from tag
35+
id: version
3636
run: |
37-
CHANGELOG="$(cat << 'EOM' | sed -e 's/^[[:space:]]*$//g' -e '/./,$!d'
38-
${{ github.event.release.body }}
39-
EOM
40-
)"
41-
echo "changelog<<EOF" >> $GITHUB_OUTPUT
42-
echo "$CHANGELOG" >> $GITHUB_OUTPUT
43-
echo "EOF" >> $GITHUB_OUTPUT
44-
- name: Update changelog
45-
if: ${{ steps.properties.outputs.changelog != '' }}
46-
env:
47-
CHANGELOG: ${{ steps.properties.outputs.changelog }}
37+
VERSION="${{ github.event.release.tag_name }}"
38+
VERSION="${VERSION#v}"
39+
echo "version=$VERSION" >> $GITHUB_OUTPUT
40+
sed -i "s/^pluginVersion=.*/pluginVersion=$VERSION/" gradle.properties
41+
- name: 📝 Update changelog
42+
if: ${{ github.event.release.body != '' }}
4843
run: |
49-
./gradlew patchChangelog --release-note="$CHANGELOG"
50-
- name: Publish to Jetbrains Marketplace
44+
cat > /tmp/release-notes.txt << 'RELEASE_NOTES_EOF'
45+
${{ github.event.release.body }}
46+
RELEASE_NOTES_EOF
47+
./gradlew patchChangelog --release-note="$(cat /tmp/release-notes.txt)"
48+
- name: 📤 Publish to JetBrains Marketplace
5149
env:
5250
PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
5351
CERTIFICATE_CHAIN: ${{ secrets.CERTIFICATE_CHAIN }}
5452
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
5553
PRIVATE_KEY_PASSWORD: ${{ secrets.PRIVATE_KEY_PASSWORD }}
5654
run: ./gradlew publishPlugin
57-
- name: Upload published plugin as release artifact
55+
- name: 📎 Upload release artifact
5856
env:
5957
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6058
run: gh release upload ${{ github.event.release.tag_name }} ./build/distributions/*
61-
- name: Create pull request with the release
62-
if: ${{ steps.properties.outputs.changelog != '' }}
59+
- name: 🔢 Calculate next dev version
60+
id: next
61+
run: |
62+
VERSION="${{ steps.version.outputs.version }}"
63+
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
64+
NEXT_VERSION="$MAJOR.$MINOR.$((PATCH + 1))-dev"
65+
echo "next_version=$NEXT_VERSION" >> $GITHUB_OUTPUT
66+
- name: 📝 Create post-release PR
6367
env:
6468
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6569
run: |
6670
VERSION="${{ github.event.release.tag_name }}"
67-
BRANCH="changelog-update-$VERSION"
68-
LABEL="release changelog"
71+
NEXT_VERSION="${{ steps.next.outputs.next_version }}"
72+
BRANCH="post-release-$VERSION"
73+
74+
# Save patched changelog before switching branches
75+
cp CHANGELOG.md /tmp/CHANGELOG.md
6976
7077
git config user.email "action@github.com"
7178
git config user.name "GitHub Action"
7279
73-
git checkout -b $BRANCH
74-
git commit -am "Changelog update - $VERSION"
75-
git push --set-upstream origin $BRANCH
80+
git fetch origin main
81+
git checkout -b $BRANCH origin/main
7682
77-
gh label create "$LABEL" \
78-
--description "Pull requests with release changelog update" \
79-
--force \
80-
|| true
83+
sed -i "s/^pluginVersion=.*/pluginVersion=$NEXT_VERSION/" gradle.properties
84+
cp /tmp/CHANGELOG.md CHANGELOG.md
85+
86+
git add gradle.properties CHANGELOG.md
87+
git commit -m "Bump version to $NEXT_VERSION after $VERSION release"
88+
git push --set-upstream origin $BRANCH
8189
8290
gh pr create \
83-
--title "Changelog update - \`$VERSION\`" \
84-
--body "Current pull request contains patched \`CHANGELOG.md\` file for the \`$VERSION\` version." \
85-
--label "$LABEL" \
91+
--title "Bump version to \`$NEXT_VERSION\`" \
92+
--body "Post-release version bump after $VERSION release." \
8693
--head $BRANCH

build.gradle.kts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,24 @@ plugins {
1717
}
1818

1919
group = providers.gradleProperty("pluginGroup").get()
20-
version = providers.gradleProperty("pluginVersion").get()
20+
version =
21+
providers
22+
.gradleProperty("pluginVersion")
23+
.get()
24+
.let { baseVersion ->
25+
if (baseVersion.endsWith("-dev")) {
26+
val gitHash =
27+
providers
28+
.exec { commandLine("git", "rev-parse", "--short=8", "HEAD") }
29+
.standardOutput
30+
.asText
31+
.get()
32+
.trim()
33+
"$baseVersion+$gitHash"
34+
} else {
35+
baseVersion
36+
}
37+
}
2138
val platformVersion = providers.gradleProperty("platformVersion").get()
2239
kotlin {
2340
jvmToolchain(17)

0 commit comments

Comments
 (0)