From a5019278befc7fc8e91bf4fb98692cff99fffcd6 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 22:08:40 +0200 Subject: [PATCH 01/13] build: support for changelog - initial changelog file. - gradle plugin to automatically manage the changelog (ex: replacing unreleased tag with an actual version at release time) --- CHANGELOG.md | 8 ++++++++ build.gradle.kts | 15 ++++++++++++--- gradle.properties | 2 ++ gradle/libs.versions.toml | 4 +++- 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 gradle.properties diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6867b6f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Coder Toolbox Plugin Changelog + +## Unreleased + +### Added + +- initial support for JetBrains Toolbox 2.6.0.38311 with the possibility to manage the workspaces - i.e. start, stop, + update and delete actions and also quick shortcuts to templates, web terminal and dashboard. \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 4c89011..914beb2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,6 +13,7 @@ plugins { alias(libs.plugins.dependency.license.report) alias(libs.plugins.ksp) alias(libs.plugins.gradle.wrapper) + alias(libs.plugins.changelog) } buildscript { @@ -50,6 +51,15 @@ dependencies { testImplementation(kotlin("test")) } +val pluginId = properties("group") +val pluginVersion = properties("version") + +changelog { + version.set(pluginVersion) + groups.set(emptyList()) + title.set("Coder Toolbox Plugin Changelog") +} + licenseReport { renderers = arrayOf(JsonReportRenderer("dependencies.json")) filters = arrayOf(ExcludeTransitiveDependenciesFilter()) @@ -65,9 +75,6 @@ tasks.test { useJUnitPlatform() } -val pluginId = "com.coder.toolbox" -val pluginVersion = "0.0.1" - val assemblePlugin by tasks.registering(Jar::class) { archiveBaseName.set(pluginId) from(sourceSets.main.get().output) @@ -163,3 +170,5 @@ tasks.register("classpath") { ) } } + +fun properties(key: String) = project.findProperty(key).toString() \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..2ff1126 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +version=0.1.0 +group=com.coder.toolbox diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc96a97..00bb2c7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,6 +12,7 @@ exec = "1.12" moshi = "1.15.1" ksp = "2.1.0-1.0.29" retrofit = "2.8.2" +changelog = "2.2.1" [libraries] toolbox-core-api = { module = "com.jetbrains.toolbox:core-api", version.ref = "toolbox-plugin-api" } @@ -40,4 +41,5 @@ kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } dependency-license-report = { id = "com.github.jk1.dependency-license-report", version.ref = "dependency-license-report" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"} -gradle-wrapper = { id = "me.filippov.gradle.jvm.wrapper", version.ref = "gradle-wrapper" } \ No newline at end of file +gradle-wrapper = { id = "me.filippov.gradle.jvm.wrapper", version.ref = "gradle-wrapper" } +changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" } \ No newline at end of file From 8e23671fbe7195ae2ad29ad3868650074859f742 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 22:12:45 +0200 Subject: [PATCH 02/13] chore: update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ba33143..01b3214 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,7 @@ build jvm/ # IntelliJ IDEA -.idea \ No newline at end of file +.idea + +# hidden macOS metadata files +.DS_Store From 5d80bdea35439c2ad8b62b4bf12acc605cd12296 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 22:45:17 +0200 Subject: [PATCH 03/13] build: github workflow to build, run tests and publish release draft - builds the zip and runs the unit tests --- .github/workflows/build.yml | 132 ++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0934bb9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,132 @@ +# GitHub Actions workflow for testing and preparing the plugin release. +# GitHub Actions reference: https://help.github.com/en/actions + +name: Coder Toolbox Plugin Build + +on: + push: + branches: + - main + pull_request: + +jobs: + # Run plugin tests on every supported platform. + test: + strategy: + matrix: + platform: + - ubuntu-latest + - macos-latest + - windows-latest + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v4.2.2 + + - uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + cache: gradle + + - uses: gradle/wrapper-validation-action@v3.5.0 + + # Run tests + - run: ./gradlew test --info + + # Collect Tests Result of failed tests + - if: ${{ failure() }} + uses: actions/upload-artifact@v4 + with: + name: tests-result + path: ${{ github.workspace }}/build/reports/tests + + build: + name: Build + needs: test + runs-on: ubuntu-latest + outputs: + version: ${{ steps.properties.outputs.version }} + changelog: ${{ steps.properties.outputs.changelog }} + steps: + # Check out current repository + - name: Fetch Sources + uses: actions/checkout@v4.2.2 + + # Setup Java 21 environment for the next steps + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + cache: gradle + + # Set environment variables + - name: Export Properties + id: properties + shell: bash + run: | + PROPERTIES="$(./gradlew properties --console=plain -q)" + VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')" + NAME="$(echo "$PROPERTIES" | grep "^group:" | cut -f2- -d ' ')" + CHANGELOG="$(./gradlew getChangelog --unreleased --no-header --console=plain -q)" + CHANGELOG="${CHANGELOG//'%'/'%25'}" + CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" + CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" + echo "::set-output name=version::$VERSION" + echo "::set-output name=name::$NAME" + echo "::set-output name=changelog::$CHANGELOG" + + # Run plugin build + - name: Run Build + run: ./gradlew clean buildZip --info + + # Prepare plugin archive content for creating artifact + - name: Prepare Plugin Artifact + id: artifact + shell: bash + run: | + cd ${{ github.workspace }}/build/distributions + FILENAME=`ls *.zip` + unzip "$FILENAME" -d content + echo "::set-output name=filename::${FILENAME:0:-4}" + # Store already-built plugin as an artifact for downloading + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.artifact.outputs.filename }} + path: ./build/distributions/content/*/* + + # Prepare a draft release for GitHub Releases page for the manual verification + # If accepted and published, release workflow would be triggered + releaseDraft: + name: Release Draft + if: github.event_name != 'pull_request' + needs: build + runs-on: ubuntu-latest + steps: + + # Check out current repository + - name: Fetch Sources + uses: actions/checkout@v4.2.2 + + # Remove old release drafts by using the curl request for the available releases with draft flag + - name: Remove Old Release Drafts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api repos/{owner}/{repo}/releases \ + --jq '.[] | select(.draft == true) | .id' \ + | xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{} + # Create new release draft - which is not publicly visible and requires manual acceptance + - name: Create Release Draft + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create v${{ needs.build.outputs.version }} \ + --draft \ + --target ${GITHUB_REF_NAME} \ + --title "v${{ needs.build.outputs.version }}" \ + --notes "$(cat << 'EOM' + ${{ needs.build.outputs.changelog }} + EOM + )" From 27630845ae4178b63e1b045848e74faa399ffa9c Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 22:50:56 +0200 Subject: [PATCH 04/13] fix: name of gradle task to zip the plugin --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0934bb9..493733f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,7 +78,7 @@ jobs: # Run plugin build - name: Run Build - run: ./gradlew clean buildZip --info + run: ./gradlew clean pluginZip --info # Prepare plugin archive content for creating artifact - name: Prepare Plugin Artifact From 2b5708f6b7b687601b7041f008441dad215d711d Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 23:21:49 +0200 Subject: [PATCH 05/13] fix: plugin artefacts should go in a folder without version - jar artefacts should be grouped under a folder whose name acts as a plugin id, which means the version should not be present in the name. - with this patch we differentiate between plugin name (root folder) and plugin id (second level folder) --- build.gradle.kts | 4 +++- gradle.properties | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 914beb2..018240e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { } val pluginId = properties("group") +val pluginName = properties("name") val pluginVersion = properties("version") changelog { @@ -145,7 +146,8 @@ val pluginZip by tasks.creating(Zip::class) { include("icon.svg") rename("icon.svg", "pluginIcon.svg") } - archiveBaseName.set("$pluginId-$pluginVersion") + into(pluginId) + archiveBaseName.set(pluginName) } val uploadPlugin by tasks.creating { diff --git a/gradle.properties b/gradle.properties index 2ff1126..77308ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ version=0.1.0 group=com.coder.toolbox +name=coder-toolbox From 7cfd5af5f8001be06dea3bcf124242724d327c63 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 23:35:24 +0200 Subject: [PATCH 06/13] impl: workflow actions for release - patch unreleased section in the changelog with version and release date - publish the plugin to the marketplace (disabled for now) - promote draft artefact as released --- .github/workflows/release.yml | 91 +++++++++++++++++++++++++++++++++++ build.gradle.kts | 7 ++- 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..2a262db --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,91 @@ +# GitHub Actions Workflow created for handling the release process based on the draft release prepared with the Build workflow. + +name: Release +on: + release: + types: [ prereleased, released ] + +jobs: + + # Prepare and publish the plugin to the Marketplace repository + release: + name: Publish Plugin + runs-on: ubuntu-latest + steps: + + # Check out current repository + - name: Fetch Sources + uses: actions/checkout@v4.2.2 + with: + ref: ${{ github.event.release.tag_name }} + + # Setup Java 21 environment for the next steps + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + cache: gradle + + # Set environment variables + - name: Export Properties + id: properties + shell: bash + run: | + CHANGELOG="$(cat << 'EOM' | sed -e 's/^[[:space:]]*$//g' -e '/./,$!d' + ${{ github.event.release.body }} + EOM + )" + + CHANGELOG="${CHANGELOG//'%'/'%25'}" + CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" + CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" + + echo "::set-output name=changelog::$CHANGELOG" + + # Update Unreleased section with the current release note + - name: Patch Changelog + if: ${{ steps.properties.outputs.changelog != '' }} + env: + CHANGELOG: ${{ steps.properties.outputs.changelog }} + run: | + ./gradlew patchChangelog --release-note="$CHANGELOG" + + # Publish the plugin to the Marketplace + # TODO - enable this step (by removing the `if` block) when JetBrains is clear about release procedures + - name: Publish Plugin + if: false + env: + PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + CERTIFICATE_CHAIN: ${{ secrets.CERTIFICATE_CHAIN }} + PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} + PRIVATE_KEY_PASSWORD: ${{ secrets.PRIVATE_KEY_PASSWORD }} + run: ./gradlew publishPlugin --info + + # Upload artifact as a release asset + - name: Upload Release Asset + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh release upload ${{ github.event.release.tag_name }} ./build/distributions/* + + # Create pull request + - name: Create Pull Request + if: ${{ steps.properties.outputs.changelog != '' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + VERSION="${{ github.event.release.tag_name }}" + BRANCH="changelog-update-$VERSION" + + git config user.email "action@github.com" + git config user.name "GitHub Action" + + git checkout -b $BRANCH + git commit -am "Changelog update - $VERSION" + git push --set-upstream origin $BRANCH + + gh pr create \ + --title "Changelog update - \`$VERSION\`" \ + --body "Current pull request contains patched \`CHANGELOG.md\` file for the \`$VERSION\` version." \ + --base main \ + --head $BRANCH \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 018240e..14c1203 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -150,11 +150,14 @@ val pluginZip by tasks.creating(Zip::class) { archiveBaseName.set(pluginName) } -val uploadPlugin by tasks.creating { +val publishPlugin by tasks.creating { dependsOn(pluginZip) doLast { - val instance = PluginRepositoryFactory.create("https://plugins.jetbrains.com", project.property("pluginMarketplaceToken").toString()) + val instance = PluginRepositoryFactory.create( + "https://plugins.jetbrains.com", + project.property("PUBLISH_TOKEN").toString() + ) // first upload // instance.uploader.uploadNewPlugin(pluginZip.outputs.files.singleFile, listOf("toolbox", "gateway"), LicenseUrl.APACHE_2_0, ProductFamily.TOOLBOX) From b94bee62673383bcdddbd932820b618b7a5a383d Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Fri, 28 Feb 2025 23:54:35 +0200 Subject: [PATCH 07/13] impl: initial version for dependabot - upgrades gradle dependencies and plugins - upgrades github actions - runs weekly --- .github/dependabot.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..4cb1368 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,25 @@ +# Dependabot configuration: +# https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + # Maintain dependencies for Gradle dependencies + - package-ecosystem: "gradle" + directory: "/" + target-branch: "main" + schedule: + interval: "weekly" + time: "06:00" + timezone: "America/Chicago" + commit-message: + prefix: "chore" + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "main" + schedule: + interval: "weekly" + time: "06:00" + timezone: "America/Chicago" + commit-message: + prefix: "chore" \ No newline at end of file From 439750d0987ba2d23d4a60296cff3d23e8b45a3b Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Sat, 1 Mar 2025 00:04:13 +0200 Subject: [PATCH 08/13] fix: skip some of the dependencies from automatic upgrade - kotlin and serialization plugins depend on the minimum targeted Toolbox version --- .github/dependabot.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4cb1368..6db3a41 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,6 +11,15 @@ updates: interval: "weekly" time: "06:00" timezone: "America/Chicago" + ignore: + # these depend on the toolbox API and should be updated manually + - dependency-name: "org.jetbrains.kotlin.jvm" + - dependency-name: "org.jetbrains.kotlin.plugin.serialization" + - dependency-name: "com.google.devtools.ksp" + # these can have breaking changes + - dependency-name: "com.jetbrains.toolbox:core-api" + - dependency-name: "com.jetbrains.toolbox:ui-api" + - dependency-name: "com.jetbrains.toolbox:remote-dev-api" commit-message: prefix: "chore" # Maintain dependencies for GitHub Actions From c9f3bce82675c408307a9e878cc8b13320eec989 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Mon, 3 Mar 2025 22:23:18 +0200 Subject: [PATCH 09/13] fix: include compile dependencies when building the zip --- build.gradle.kts | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 14c1203..a541a15 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -83,7 +83,12 @@ val assemblePlugin by tasks.registering(Jar::class) { val copyPlugin by tasks.creating(Sync::class.java) { dependsOn(assemblePlugin) + fromCompileDependencies() + into(getPluginInstallDir()) +} + +fun CopySpec.fromCompileDependencies() { from(assemblePlugin.get().outputs.files) from("src/main/resources") { include("extension.json") @@ -105,8 +110,14 @@ val copyPlugin by tasks.creating(Sync::class.java) { } }, ) +} - into(getPluginInstallDir()) +val pluginZip by tasks.creating(Zip::class) { + dependsOn(assemblePlugin) + + fromCompileDependencies() + into(pluginId) + archiveBaseName.set(pluginName) } tasks.register("cleanAll", Delete::class.java) { @@ -134,22 +145,6 @@ private fun getPluginInstallDir(): Path { return pluginsDir / pluginId } -val pluginZip by tasks.creating(Zip::class) { - dependsOn(assemblePlugin) - - from(assemblePlugin.get().outputs.files) - from("src/main/resources") { - include("extension.json") - include("dependencies.json") - } - from("src/main/resources") { - include("icon.svg") - rename("icon.svg", "pluginIcon.svg") - } - into(pluginId) - archiveBaseName.set(pluginName) -} - val publishPlugin by tasks.creating { dependsOn(pluginZip) From ed8a82af4f8ea41ab369127886e5c0f27b58c16b Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Mon, 3 Mar 2025 22:57:11 +0200 Subject: [PATCH 10/13] fix: use $GITHUB_OUTPUT to set step parameters - set-output is deprecated --- .github/workflows/build.yml | 9 +++++---- .github/workflows/release.yml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 493733f..fb158b7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,9 +72,9 @@ jobs: CHANGELOG="${CHANGELOG//'%'/'%25'}" CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" - echo "::set-output name=version::$VERSION" - echo "::set-output name=name::$NAME" - echo "::set-output name=changelog::$CHANGELOG" + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "name=$NAME" >> $GITHUB_OUTPUT + echo "changelog=$CHANGELOG" >> $GITHUB_OUTPUT # Run plugin build - name: Run Build @@ -88,7 +88,8 @@ jobs: cd ${{ github.workspace }}/build/distributions FILENAME=`ls *.zip` unzip "$FILENAME" -d content - echo "::set-output name=filename::${FILENAME:0:-4}" + echo "filename=${FILENAME:0:-4}" >> $GITHUB_OUTPUT + # Store already-built plugin as an artifact for downloading - name: Upload artifact uses: actions/upload-artifact@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a262db..7eccb36 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,7 +41,7 @@ jobs: CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" - echo "::set-output name=changelog::$CHANGELOG" + echo "changelog=$CHANGELOG" >> $GITHUB_OUTPUT # Update Unreleased section with the current release note - name: Patch Changelog From a0d595926fa7ab8848445c08a2467d03e32219bc Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Mon, 3 Mar 2025 23:32:29 +0200 Subject: [PATCH 11/13] fix: use github workflow context properties - github.repository instead of the {owner}/{repo} --- .github/workflows/build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fb158b7..95309c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -110,14 +110,15 @@ jobs: - name: Fetch Sources uses: actions/checkout@v4.2.2 - # Remove old release drafts by using the curl request for the available releases with draft flag + # Remove old release drafts by using GitHub CLI - name: Remove Old Release Drafts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - gh api repos/{owner}/{repo}/releases \ + gh api repos/${{ github.repository }}/releases \ --jq '.[] | select(.draft == true) | .id' \ - | xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{} + | xargs -I '{}' gh api -X DELETE repos/${{ github.repository }}/releases/{} + # Create new release draft - which is not publicly visible and requires manual acceptance - name: Create Release Draft env: From 376bdf514e3ca1dcfc299ff0d7b4c814d541d00f Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Mon, 3 Mar 2025 23:37:48 +0200 Subject: [PATCH 12/13] fix: use modern bash command substitution - backticks command substitution is deprecated --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 95309c3..2275e87 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -86,7 +86,7 @@ jobs: shell: bash run: | cd ${{ github.workspace }}/build/distributions - FILENAME=`ls *.zip` + FILENAME=$(ls *.zip) unzip "$FILENAME" -d content echo "filename=${FILENAME:0:-4}" >> $GITHUB_OUTPUT From 9f9ac77c3a3427bcc862980279603e7609de6018 Mon Sep 17 00:00:00 2001 From: Faur Ioan-Aurel Date: Tue, 4 Mar 2025 00:15:51 +0200 Subject: [PATCH 13/13] fix: ensure changelog multiline output doesn't break - by saving the content into an intermediate file --- .github/workflows/build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2275e87..70187f5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -124,11 +124,9 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + echo "${{ needs.build.outputs.changelog }}" > RELEASE_NOTES.md gh release create v${{ needs.build.outputs.version }} \ --draft \ --target ${GITHUB_REF_NAME} \ --title "v${{ needs.build.outputs.version }}" \ - --notes "$(cat << 'EOM' - ${{ needs.build.outputs.changelog }} - EOM - )" + --notes-file RELEASE_NOTES.md pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy