diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..341c6d3c1 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,254 @@ +# +# Copyright (C) 2022-2025 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +name: release + +on: + workflow_dispatch: + inputs: + version: + description: 'Version to release' + required: true + branch: + description: 'Branch to use for the release' + required: true + default: main +env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + DEBUG: electron-builder + +permissions: + contents: read + +jobs: + + tag: + name: Tagging + runs-on: ubuntu-24.04 + permissions: + contents: write + outputs: + githubTag: ${{ steps.TAG_UTIL.outputs.githubTag}} + kortexVersion: ${{ steps.TAG_UTIL.outputs.kortexVersion}} + releaseId: ${{ steps.create_release.outputs.id}} + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ github.event.inputs.branch }} + token: ${{ secrets.KORTEX_BOT_TOKEN }} + - name: Generate tag utilities + id: TAG_UTIL + run: | + TAG_PATTERN=${{ github.event.inputs.version }} + echo "githubTag=v$TAG_PATTERN" >> ${GITHUB_OUTPUT} + echo "kortexVersion=$TAG_PATTERN" >> ${GITHUB_OUTPUT} + + - name: tag + run: | + git config --local user.name ${{ github.actor }} + git config --local user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com" + + # Add the new version in package.json file + sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${{ steps.TAG_UTIL.outputs.kortexVersion }}\",#g" package.json + find packages/* -maxdepth 1 -name "package.json" | xargs -I {} sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${{ steps.TAG_UTIL.outputs.kortexVersion }}\",#g" {} + find extensions/* -maxdepth 3 -name "package.json" | xargs -I {} sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${{ steps.TAG_UTIL.outputs.kortexVersion }}\",#g" {} + git add package.json extensions/*/package.json extensions/*/packages/*/package.json packages/*/package.json + + # Update the issue template with the new version and move old version below + nextVersionLineNumber=$(grep -n "next (development version)" .github/ISSUE_TEMPLATE/bug_report.yml | cut -d ":" -f 1 | head -n 1) + currentVersionItem=$(sed "$(expr ${nextVersionLineNumber} - 1)q;d" .github/ISSUE_TEMPLATE/bug_report.yml) + newVersionItem=$(echo "$currentVersionItem" | sed -r -e "s|\".*\"|\"${{ steps.TAG_UTIL.outputs.kortexVersion }}\"|") + # delete the lines before the next version line + sed -i "$(expr ${nextVersionLineNumber} - 1)d" .github/ISSUE_TEMPLATE/bug_report.yml + # insert the version being tagged + sed -i "$(expr ${nextVersionLineNumber} - 1)i\\${newVersionItem}" .github/ISSUE_TEMPLATE/bug_report.yml + sed -i "$(expr ${nextVersionLineNumber} + 1)i\\${currentVersionItem}" .github/ISSUE_TEMPLATE/bug_report.yml + # add the changes + git add .github/ISSUE_TEMPLATE/bug_report.yml + + # Add the new version in the appdata.xml file + xmlReleasesLineNumber=$(grep -n "" .flatpak-appdata.xml | cut -d ":" -f 1 | head -n 1) + newFlatpakReleaseItem=" " + sed -i "$(expr ${xmlReleasesLineNumber} + 1)i\\${newFlatpakReleaseItem}" .flatpak-appdata.xml + git add .flatpak-appdata.xml + + # commit the changes + git commit -m "chore: 🥁 tagging ${{ steps.TAG_UTIL.outputs.githubTag }} 🥳" + echo "Tagging with ${{ steps.TAG_UTIL.outputs.githubTag }}" + git tag ${{ steps.TAG_UTIL.outputs.githubTag }} + git push origin ${{ steps.TAG_UTIL.outputs.githubTag }} + - name: Create Release + id: create_release + uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd # v1.21.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag: ${{ steps.TAG_UTIL.outputs.githubTag }} + name: ${{ steps.TAG_UTIL.outputs.githubTag }} + draft: true + prerelease: true + - name: Create the PR to bump the version in the main branch (only if we're tagging from main branch) + if: ${{ github.event.inputs.branch == 'main' }} + run: | + git config --local user.name ${{ github.actor }} + git config --local user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com" + CURRENT_VERSION=$(echo "${{ steps.TAG_UTIL.outputs.kortexVersion }}") + tmp=${CURRENT_VERSION%.*} + minor=${tmp#*.} + bumpedVersion=${CURRENT_VERSION%%.*}.$((minor + 1)).0 + bumpedBranchName="bump-to-${bumpedVersion}" + git checkout -b "${bumpedBranchName}" + sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${bumpedVersion}-next\",#g" package.json + find extensions/* -maxdepth 3 -name "package.json" | xargs -I {} sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${bumpedVersion}-next\",#g" {} + find packages/* -maxdepth 1 -name "package.json" | xargs -I {} sed -i "s#version\":\ \"\(.*\)\",#version\":\ \"${bumpedVersion}-next\",#g" {} + git add package.json extensions/*/package.json extensions/*/packages/*/package.json packages/*/package.json + + git commit -s --amend -m "chore: bump version to ${bumpedVersion}" + git push origin "${bumpedBranchName}" + echo -e "📢 Bump version to ${bumpedVersion}\n\n${{ steps.TAG_UTIL.outputs.kortexVersion }} has been released.\n\n Time to switch to the new ${bumpedVersion} version 🥳" > /tmp/pr-title + pullRequestUrl=$(gh pr create --title "chore: 📢 Bump version to ${bumpedVersion}" --body-file /tmp/pr-title --head "${bumpedBranchName}" --base "main") + echo "📢 Pull request created: ${pullRequestUrl}" + echo "➡️ Flag the PR as being ready for review" + gh pr ready "${pullRequestUrl}" + echo "🔅 Mark the PR as being ok to be merged automatically" + gh pr merge "${pullRequestUrl}" --auto --rebase + env: + GITHUB_TOKEN: ${{ secrets.KORTEX_BOT_TOKEN }} + + build: + name: Build / ${{ matrix.os }} + needs: tag + permissions: + contents: write + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-2025, ubuntu-24.04, macos-15] + timeout-minutes: 60 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ needs.tag.outputs.githubTag}} + + - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 + name: Install pnpm + with: + run_install: false + + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: 'pnpm' + + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.x" + + - name: setup telemetry key for production + run: | + jq --arg key "${{ secrets.SEGMENT_WRITE_KEY }}" '.telemetry.key = $key' product.json > product.json.tmp && rm product.json && mv product.json.tmp product.json + + - name: Execute pnpm + run: pnpm install + + - name: Install flatpak on Linux + if: ${{ matrix.os=='ubuntu-24.04' }} + run: | + sudo apt-get update + sudo apt-get install flatpak -y + sudo apt-get install flatpak-builder -y + sudo apt-get install elfutils -y + flatpak remote-add --if-not-exists flathub --user https://flathub.org/repo/flathub.flatpakrepo + flatpak install flathub --no-static-deltas --user -y org.freedesktop.Platform//25.08 org.freedesktop.Sdk//25.08 + - name: Set macOS environment variables + if: startsWith(matrix.os, 'macos') + run: | + echo "CSC_LINK=${{secrets.CSC_LINK}}" >> $GITHUB_ENV + echo "CSC_KEY_PASSWORD=${{secrets.CSC_KEY_PASSWORD}}" >> $GITHUB_ENV + echo "APPLE_ID=${{secrets.APPLE_ID}}" >> $GITHUB_ENV + echo "APPLE_APP_SPECIFIC_PASSWORD=${{secrets.APPLE_APP_SPECIFIC_PASSWORD}}" >> $GITHUB_ENV + echo "APPLE_TEAM_ID=${{secrets.APPLE_TEAM_ID}}" >> $GITHUB_ENV + + - name: Install Azure SignTool on Windows + if: startsWith(matrix.os, 'windows') + run: | + dotnet tool install --global AzureSignTool --version 3.0.0 + echo "AZURE_KEY_VAULT_CERTIFICATE=${{secrets.AZURE_KEY_VAULT_CERTIFICATE}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "AZURE_KEY_VAULT_CLIENT_ID=${{secrets.AZURE_KEY_VAULT_CLIENT_ID}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "AZURE_KEY_VAULT_SECRET=${{secrets.AZURE_KEY_VAULT_SECRET}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "AZURE_KEY_VAULT_TENANT_ID=${{secrets.AZURE_KEY_VAULT_TENANT_ID}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "AZURE_KEY_VAULT_URL=${{secrets.AZURE_KEY_VAULT_URL}}" | Out-File -FilePath $env:GITHUB_ENV -Append + + - name: Build & Publish artifacts + timeout-minutes: 40 + run: pnpm compile:next + env: + GITHUB_TOKEN: ${{ secrets.KORTEX_BOT_TOKEN }} + + release: + needs: [tag, build] + name: Release + permissions: + contents: write + runs-on: ubuntu-24.04 + steps: + - name: id + run: echo the release id is ${{ needs.tag.outputs.releaseId}} + + - name: Publish release + uses: StuYarrow/publish-release@01f2a1365bacd77bad861873a7fdf274ab49eefd # v1.1.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + id: ${{ needs.tag.outputs.releaseId}} + + # publish the pnpm store for flathub builds + pnpm-store: + needs: [tag, release] + name: pnpm-store-${{ matrix.arch }} + runs-on: ubuntu-24.04 + permissions: + contents: write + strategy: + matrix: + arch: [amd64, arm64] + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ needs.tag.outputs.githubTag}} + + - name: Set up QEMU + uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 + - name: create the pnpm store from the dependencies + run: | + podman run --platform linux/${{ matrix.arch }} -v $(pwd):/project --rm -it --entrypoint=sh node:24 -c "cd /project && npm install -g corepack@latest && corepack enable pnpm && COREPACK_ENABLE_DOWNLOAD_PROMPT=0 pnpm install --frozen-lockfile --store-dir pnpm-store" + # now the store is in the pnpm-store directory + # create a tarball of the store + echo "Creating the archive store-cache-pnpm-${{ matrix.arch }}.tgz" + tar -czf store-cache-pnpm-${{ matrix.arch }}.tgz pnpm-store + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: store-cache-pnpm-${{ matrix.arch }}.tgz + tag: ${{ needs.tag.outputs.githubTag }}