Skip to content

fix: separate build and release jobs with proper artifact upload - #137

Merged
mergify[bot] merged 2 commits into
mainfrom
fix-release-assets
Jul 25, 2026
Merged

fix: separate build and release jobs with proper artifact upload#137
mergify[bot] merged 2 commits into
mainfrom
fix-release-assets

Conversation

@ashcoft

@ashcoft ashcoft commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Summary

Fix release workflow to reliably upload assets to releases.

Changes

Based on nextcloud-cad-viewer release workflow

Workflow Structure

Build Job:

  • Checkout and install dependencies (npm ci --ignore-scripts)
  • Create tt-rss.tar.gz and tt-rss.zip
  • Upload as build artifacts

Release Job:

  • Downloads artifacts from build job
  • Runs semantic-release
  • Uploads artifacts to release using gh release upload --clobber

Release Assets

Asset Description
tt-rss.tar.gz Ready to use package (tar.gz)
tt-rss.zip Ready to use package (zip)

- build job: creates tt-rss.tar.gz and tt-rss.zip
- release job: downloads artifacts and uploads to release
- Uses --clobber flag for gh release upload
- Based on nextcloud-cad-viewer release workflow
@netlify

netlify Bot commented Jul 25, 2026

Copy link
Copy Markdown

Deploy Preview for feeddony ready!

Name Link
🔨 Latest commit b4b455c
🔍 Latest deploy log https://app.netlify.com/projects/feeddony/deploys/6a644f64f0843a00087d0105
😎 Deploy Preview https://deploy-preview-137--feeddony.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@vercel

vercel Bot commented Jul 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tt-rss-non-dockerize Ready Ready Preview, Comment Jul 25, 2026 5:53am

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The release workflow now uses separate build and release jobs. The build job creates and stores tar.gz and zip archives, while the release job validates them, runs semantic-release, and uploads them to the tagged GitHub release.

Changes

Release packaging pipeline

Layer / File(s) Summary
Archive build and artifact publication
.github/workflows/release.yml
Adds concurrency and Node memory settings, then creates tt-rss.tar.gz and tt-rss.zip in a dedicated build job and uploads them as tt-rss-assets.
Release orchestration and asset upload
.github/workflows/release.yml
Adds a dependent, owner-gated release job with contents: write permission that downloads and validates artifacts, runs semantic-release, and uploads archives using the latest Git tag.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested reviewers: openhands-agent

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning It covers summary and changes, but misses key template sections like motivation, testing, screenshots, types, and checklist. Add the missing template sections: Motivation and Context, How Has This Been Tested?, Screenshots if needed, Types of Changes, and Checklist.
✅ Passed checks (4 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title matches the main change: splitting the release workflow into build and release jobs with artifact upload.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-release-assets

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ashcoft
ashcoft marked this pull request as ready for review July 25, 2026 05:51
@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@mergify

mergify Bot commented Jul 25, 2026

Copy link
Copy Markdown

Queued — the merge queue status continues in this comment ↓.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Fix release workflow by splitting build/release jobs and uploading artifacts

🐞 Bug fix ⚙️ Configuration changes 🕐 10-20 Minutes

Grey Divider

AI Description

• Split release pipeline into separate build and release jobs
• Pass packaged assets via GitHub Actions artifacts for reliable handoff
• Upload assets to the created GitHub Release using gh release upload --clobber
Diagram

graph TD
  T{{"Push to main / manual"}} --> B(["Build job"]) --> P["Package assets"] --> A[("tt-rss-assets")]
  A --> R(["Release job"]) --> S["semantic-release"] --> U["gh release upload"] --> G{{"GitHub Release"}}
  subgraph Legend
    direction LR
    _tr{{"Trigger"}} ~~~ _job(["Job"]) ~~~ _step["Step"] ~~~ _art[("Artifact")]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Let semantic-release manage assets via GitHub plugin
  • ➕ Keeps release creation and asset publication in one semantic-release lifecycle
  • ➕ Avoids shelling out to gh and reduces tag-discovery logic
  • ➖ Requires semantic-release config changes (and possibly repository-specific plugin setup)
  • ➖ May be harder to debug than explicit gh release upload steps
2. Use a dedicated release action (e.g., softprops/action-gh-release)
  • ➕ Common, well-documented approach for attaching assets to releases
  • ➕ Can reduce custom scripting and tag lookup
  • ➖ Introduces another third-party action dependency
  • ➖ May still need careful coordination with semantic-release-created tags/releases

Recommendation: The PR’s approach (build once, pass artifacts, then upload via gh release upload --clobber) is pragmatic and reliable for Actions: it avoids rebuilding at a tag checkout and makes the artifact boundary explicit. If asset handling grows more complex, consider moving upload responsibility into semantic-release’s GitHub plugin to reduce custom scripting.

Files changed (1) +75 / -41

Bug fix (1) +75 / -41
release.ymlSplit workflow into build + release jobs with artifact handoff and release upload +75/-41

Split workflow into build + release jobs with artifact handoff and release upload

• Introduces a dedicated build job to package 'tt-rss.tar.gz' and 'tt-rss.zip' and upload them as a short-lived artifact. Updates the release job to depend on the build job, download/verify artifacts, run semantic-release, then attach assets to the GitHub Release via 'gh release upload --clobber'. Adds concurrency control, a Node memory env override, owner-only gating, explicit contents write permissions, and pins actions to specific SHAs.

.github/workflows/release.yml

@gitar-bot

gitar-bot Bot commented Jul 25, 2026

Copy link
Copy Markdown
Code Review ✅ Approved

Separates the build and release workflow jobs to reliably upload release assets and adds --ignore-scripts to npm ci for improved security. No issues found.

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Important

Your trial ends in 6 days — upgrade now to keep code review, CI analysis, auto-apply, custom automations, and more.

Was this helpful? React with 👍 / 👎 | Gitar

@sonarqubecloud

Copy link
Copy Markdown

@mergify

mergify Bot commented Jul 25, 2026

Copy link
Copy Markdown

Merge Queue Status

  • Entered queue2026-07-25 05:55 UTC · Rule: default · triggered by @ashcoft with the merge queue checkbox
  • Checks skipped · PR is already up-to-date
  • Merged2026-07-25 05:55 UTC · at b4b455cee34d7632f66d5d38a978dd19dd5a8e3a

This pull request spent 22 seconds in the queue, including 2 seconds running CI.

Required conditions to merge

@mergify mergify Bot added the queued label Jul 25, 2026
@mergify
mergify Bot merged commit 4f0e5ee into main Jul 25, 2026
25 of 26 checks passed
@mergify
mergify Bot deleted the fix-release-assets branch July 25, 2026 05:55
@mergify mergify Bot removed the queued label Jul 25, 2026
@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 11 rules

Grey Divider


Action required

1. Archives bundle node_modules 🐞 Bug ≡ Correctness
Description
The build job runs npm ci and then archives . while excluding only .git/.github, so the
generated node_modules/ (and other generated files) are bundled into the release assets;
additionally the later zip command will include the already-created tt-rss.tar.gz inside
tt-rss.zip. This bloats assets and ships unintended dependencies/content, increasing the chance of
artifact/release upload failures and confusing release contents.
Code

.github/workflows/release.yml[R29-42]

+      - name: Install Dependencies
+        run: npm ci
+
+      - name: Ensure zip available
+        run: |
+          if ! command -v zip >/dev/null 2>&1; then
+            sudo apt-get update && sudo apt-get install -y zip
+          fi
+
+      - name: Create tar.gz
+        run: tar --exclude='.git' --exclude='.github' -czf tt-rss.tar.gz .
+
+      - name: Create zip
+        run: zip -r tt-rss.zip . -x '.git/*' -x '.github/*'
Relevance

⭐⭐⭐ High

Archiving “.” after npm ci likely bloats assets with node_modules and nested tarball; clear
packaging issue.

PR-#80

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
npm ci is executed immediately before archiving the whole repo (.), and the archive exclude list
does not include node_modules/; the repository also explicitly ignores node_modules/, indicating
it’s not meant to be part of distributed sources. The zip step runs after creating tt-rss.tar.gz
and zips . without excluding the tarball, so the zip will contain the tarball.

.github/workflows/release.yml[29-43]
.gitignore[5-8]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The build job archives the entire workspace after `npm ci`, so `node_modules/` and other generated files end up inside `tt-rss.tar.gz`/`tt-rss.zip`; also `tt-rss.zip` will include `tt-rss.tar.gz` because it is created first and not excluded.

## Issue Context
- `npm ci` creates `node_modules/`.
- `.gitignore` indicates `node_modules/` and `dist/` are not intended to be committed/distributed.

## Fix Focus Areas
- .github/workflows/release.yml[29-42]

## Suggested fix
- Exclude `node_modules/` (and other build outputs) in both tar and zip steps, e.g.:
 - tar: add `--exclude='node_modules' --exclude='dist' --exclude='tt-rss.tar.gz' --exclude='tt-rss.zip'`
 - zip: add `-x 'node_modules/*' -x 'dist/*' -x 'tt-rss.tar.gz' -x 'tt-rss.zip'`
- Alternatively, build/package from a clean staging directory containing only the files intended for release (copy/rsync with an allowlist), then archive that directory.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Clobbers existing release assets 🐞 Bug ≡ Correctness
Description
The workflow always runs gh release upload ... --clobber using `TAG=$(git describe --tags
--abbrev=0)`; if semantic-release does not create a new release (e.g., rerun/workflow_dispatch on an
already-released commit), this can target an existing tag and overwrite that release’s assets. This
can silently mutate previously published artifacts for an existing version.
Code

.github/workflows/release.yml[R96-103]

+      - name: Upload artifacts to release
        run: |
-          gh release upload ${{ steps.version.outputs.VERSION }} \
-            tt-rss.tar.gz \
-            tt-rss.zip \
-            --repo ${{ github.repository }}
+          TAG=$(git describe --tags --abbrev=0)
+          echo "Uploading release assets for: $TAG"
+          gh release upload "$TAG" tt-rss.tar.gz --clobber
+          gh release upload "$TAG" tt-rss.zip --clobber
+          echo "=== Uploaded ==="
+          gh release view "$TAG" --json assets
Relevance

⭐⭐⭐ High

Team previously rejected adding --clobber; concern about overwriting existing release assets aligns
with that precedent.

PR-#136

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The upload step has no if: guard and uses --clobber, and it targets the tag returned by `git
describe` rather than a tag/version explicitly produced by semantic-release. The semantic-release
configuration uses version tags (tagFormat), so git describe can resolve to an already-existing
tag when no new tag is created.

.github/workflows/release.yml[96-105]
.releaserc.json[1-4]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The upload step is unconditional and uses `--clobber` against the tag resolved via `git describe`. When semantic-release decides there is no new release to publish, the job can still overwrite assets on the latest existing release.

## Issue Context
The previous workflow gated asset creation/upload on a semantic-release output (`release_created == 'true'`). The new workflow removed that gating but kept `--clobber`.

## Fix Focus Areas
- .github/workflows/release.yml[87-103]

## Suggested fix
- Restore an explicit “new release created” gate before uploading assets. Options:
 1) Capture the tag *before* and *after* semantic-release and only upload if it changed:
    - `BEFORE=$(git describe --tags --abbrev=0 2>/dev/null || true)`
    - run semantic-release
    - `git fetch --tags`
    - `AFTER=$(git describe --tags --abbrev=0 2>/dev/null || true)`
    - if `AFTER` is empty or `AFTER == BEFORE`, skip upload.
 2) Use a semantic-release plugin/hook (e.g., exec) to write `nextRelease.version` to a file or `$GITHUB_OUTPUT`, then upload only when that output is present.
- If overwriting is not desired, remove `--clobber` and fail when assets already exist.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Tag lookup may fail 🐞 Bug ☼ Reliability
Description
The upload step relies on git describe --tags --abbrev=0, but the workflow checkout does not fetch
full history/tags; if tags are absent in the local clone, git describe will fail and the release
job will error out. This makes release asset uploads unreliable.
Code

.github/workflows/release.yml[R98-99]

+          TAG=$(git describe --tags --abbrev=0)
+          echo "Uploading release assets for: $TAG"
Relevance

⭐⭐⭐ High

Using git describe without fetching tags is brittle; prior discussion around git-describe tagging
makes this a likely fix.

PR-#135

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The release job performs a default checkout (no fetch-depth/tag options) but later requires tags for
git describe. Another workflow in this repo explicitly sets fetch-depth: 0, demonstrating that
full git history is sometimes required/expected in CI here.

.github/workflows/release.yml[64-66]
.github/workflows/release.yml[96-101]
.github/workflows/publish.yml[50-54]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`git describe --tags --abbrev=0` requires tags to be present locally. The workflow currently performs a default checkout and then immediately relies on tags for TAG resolution.

## Issue Context
This repository already uses `fetch-depth: 0` in other workflows when it needs full git context.

## Fix Focus Areas
- .github/workflows/release.yml[64-66]
- .github/workflows/release.yml[96-101]

## Suggested fix
- Update `actions/checkout` in the release job to ensure tags are available, e.g.:
 - `with: fetch-depth: 0`
 - (optionally) `fetch-tags: true` if supported by the pinned checkout version
- Or add an explicit fetch before calling `git describe`:
 - `git fetch --force --tags`
- Preferably, avoid `git describe` entirely and use an explicit version/tag output from semantic-release (and skip upload when none was created).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines +29 to +42
- name: Install Dependencies
run: npm ci --ignore-scripts

- name: Ensure zip available
run: |
if ! command -v zip >/dev/null 2>&1; then
sudo apt-get update && sudo apt-get install -y zip
fi

- name: Create tar.gz
run: tar --exclude='.git' --exclude='.github' -czf tt-rss.tar.gz .

- name: Create zip
run: zip -r tt-rss.zip . -x '.git/*' -x '.github/*'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Archives bundle node_modules 🐞 Bug ≡ Correctness

The build job runs npm ci and then archives . while excluding only .git/.github, so the
generated node_modules/ (and other generated files) are bundled into the release assets;
additionally the later zip command will include the already-created tt-rss.tar.gz inside
tt-rss.zip. This bloats assets and ships unintended dependencies/content, increasing the chance of
artifact/release upload failures and confusing release contents.
Agent Prompt
## Issue description
The build job archives the entire workspace after `npm ci`, so `node_modules/` and other generated files end up inside `tt-rss.tar.gz`/`tt-rss.zip`; also `tt-rss.zip` will include `tt-rss.tar.gz` because it is created first and not excluded.

## Issue Context
- `npm ci` creates `node_modules/`.
- `.gitignore` indicates `node_modules/` and `dist/` are not intended to be committed/distributed.

## Fix Focus Areas
- .github/workflows/release.yml[29-42]

## Suggested fix
- Exclude `node_modules/` (and other build outputs) in both tar and zip steps, e.g.:
  - tar: add `--exclude='node_modules' --exclude='dist' --exclude='tt-rss.tar.gz' --exclude='tt-rss.zip'`
  - zip: add `-x 'node_modules/*' -x 'dist/*' -x 'tt-rss.tar.gz' -x 'tt-rss.zip'`
- Alternatively, build/package from a clean staging directory containing only the files intended for release (copy/rsync with an allowlist), then archive that directory.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +96 to +103
- name: Upload artifacts to release
run: |
gh release upload ${{ steps.version.outputs.VERSION }} \
tt-rss.tar.gz \
tt-rss.zip \
--repo ${{ github.repository }}
TAG=$(git describe --tags --abbrev=0)
echo "Uploading release assets for: $TAG"
gh release upload "$TAG" tt-rss.tar.gz --clobber
gh release upload "$TAG" tt-rss.zip --clobber
echo "=== Uploaded ==="
gh release view "$TAG" --json assets

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Clobbers existing release assets 🐞 Bug ≡ Correctness

The workflow always runs gh release upload ... --clobber using `TAG=$(git describe --tags
--abbrev=0)`; if semantic-release does not create a new release (e.g., rerun/workflow_dispatch on an
already-released commit), this can target an existing tag and overwrite that release’s assets. This
can silently mutate previously published artifacts for an existing version.
Agent Prompt
## Issue description
The upload step is unconditional and uses `--clobber` against the tag resolved via `git describe`. When semantic-release decides there is no new release to publish, the job can still overwrite assets on the latest existing release.

## Issue Context
The previous workflow gated asset creation/upload on a semantic-release output (`release_created == 'true'`). The new workflow removed that gating but kept `--clobber`.

## Fix Focus Areas
- .github/workflows/release.yml[87-103]

## Suggested fix
- Restore an explicit “new release created” gate before uploading assets. Options:
  1) Capture the tag *before* and *after* semantic-release and only upload if it changed:
     - `BEFORE=$(git describe --tags --abbrev=0 2>/dev/null || true)`
     - run semantic-release
     - `git fetch --tags`
     - `AFTER=$(git describe --tags --abbrev=0 2>/dev/null || true)`
     - if `AFTER` is empty or `AFTER == BEFORE`, skip upload.
  2) Use a semantic-release plugin/hook (e.g., exec) to write `nextRelease.version` to a file or `$GITHUB_OUTPUT`, then upload only when that output is present.
- If overwriting is not desired, remove `--clobber` and fail when assets already exist.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +98 to +99
TAG=$(git describe --tags --abbrev=0)
echo "Uploading release assets for: $TAG"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Tag lookup may fail 🐞 Bug ☼ Reliability

The upload step relies on git describe --tags --abbrev=0, but the workflow checkout does not fetch
full history/tags; if tags are absent in the local clone, git describe will fail and the release
job will error out. This makes release asset uploads unreliable.
Agent Prompt
## Issue description
`git describe --tags --abbrev=0` requires tags to be present locally. The workflow currently performs a default checkout and then immediately relies on tags for TAG resolution.

## Issue Context
This repository already uses `fetch-depth: 0` in other workflows when it needs full git context.

## Fix Focus Areas
- .github/workflows/release.yml[64-66]
- .github/workflows/release.yml[96-101]

## Suggested fix
- Update `actions/checkout` in the release job to ensure tags are available, e.g.:
  - `with: fetch-depth: 0`
  - (optionally) `fetch-tags: true` if supported by the pinned checkout version
- Or add an explicit fetch before calling `git describe`:
  - `git fetch --force --tags`
- Preferably, avoid `git describe` entirely and use an explicit version/tag output from semantic-release (and skip upload when none was created).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 16-19: Add an explicit minimal permissions block to the release
workflow’s build job, scoped to the build steps that check out code and upload
the transient artifact. Grant only the read access required for checkout, such
as contents read, and leave all other GITHUB_TOKEN permissions disabled.
- Around line 38-42: Update the “Create tar.gz” and “Create zip” steps to
exclude node_modules from both archives and exclude the generated tt-rss.tar.gz
from the zip archive. Also verify the release workflow’s packaging sequence and
add the frontend build using the package.json build script before creating
either archive if the release requires built frontend assets.
- Around line 20-21: Update both actions/checkout steps in
.github/workflows/release.yml at lines 20-21 and 64-65 to set
persist-credentials to false, while leaving the existing checkout configuration
and release token usage unchanged.
- Around line 96-105: Replace the manual “Upload artifacts to release” step’s
git describe and gh release upload logic with the native assets configuration on
the `@semantic-release/github` plugin. Configure both tt-rss.tar.gz and tt-rss.zip
as release assets so semantic-release uploads them to the release it creates,
and remove the redundant tag lookup and upload commands.
- Around line 55-62: Update the release job’s permissions block to retain
contents: write and add issues: write plus pull-requests: write, enabling
semantic-release GitHub success comments on resolved issues and pull requests.
- Around line 64-65: Update the actions/checkout step in the release job to
fetch the full repository history by configuring fetch-depth to 0. Keep the
existing pinned actions/checkout reference and checkout behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b5a0341a-f981-46a1-82f9-4621dc59baf2

📥 Commits

Reviewing files that changed from the base of the PR and between f32d577 and 74931a1.

📒 Files selected for processing (1)
  • .github/workflows/release.yml

Comment on lines +16 to +19
build:
name: Build Assets
runs-on: ubuntu-latest
steps:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Build job has no explicit permissions: block.

The job inherits default (potentially broad) GITHUB_TOKEN permissions even though it only checks out code and uploads a transient artifact — it doesn't need write access to anything. Add a minimal explicit block.

🔒 Proposed fix
   build:
     name: Build Assets
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
     steps:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
build:
name: Build Assets
runs-on: ubuntu-latest
steps:
build:
name: Build Assets
runs-on: ubuntu-latest
permissions:
contents: read
steps:
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 16-53: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 16 - 19, Add an explicit minimal
permissions block to the release workflow’s build job, scoped to the build steps
that check out code and upload the transient artifact. Grant only the read
access required for checkout, such as contents read, and leave all other
GITHUB_TOKEN permissions disabled.

Source: Linters/SAST tools

Comment on lines +20 to +21
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate file and workflow excerpt =="
if [ -f .github/workflows/release.yml ]; then
  nl -ba .github/workflows/release.yml | sed -n '1,110p'
else
  echo "missing .github/workflows/release.yml"
fi

echo
echo "== search for persist-credentials and semantic-release usage =="
rg -n "actions/checkout|persist-credentials|semantic-release|`@semantic-release/github`|git push|npm ci|semantic-release" .github/workflows/release.yml . . -g '!node_modules' -g '!dist' -g '!build' || true

echo
echo "== package metadata relevant to semantic-release =="
for f in package.json package-lock.json pnpm-lock.yaml yarn.lock; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n '"`@semantic-release/`[^"]+"|`@semantic-release/github`|semantic-release|npm-ci|prepare|prepublish|postpublish|release:' "$f" || true
  fi
done

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 245


🌐 Web query:

actions/checkout v4 persist-credentials default true README

💡 Result:

In actions/checkout v4, the persist-credentials input defaults to true [1][2]. When set to true (the default), the action configures the GITHUB_TOKEN or SSH key into the local Git configuration [3][4]. This allows subsequent steps in the same job to execute authenticated Git commands [3]. The credentials are removed during the post-job cleanup process [3]. If you wish to prevent this behavior, you must explicitly set persist-credentials: false in your workflow step configuration [3]. While there have been community discussions and long-standing requests to change this default to false for security hardening, the default has remained true through version 4 [5][6][7]. Note: In later versions (e.g., v6), while the default remains true, the mechanism for storing credentials was updated to use $RUNNER_TEMP rather than the local .git/config file to enhance security [4][8].

Citations:


🌐 Web query:

@semantic-release/github publish API based GitHub releases git push persisted token

💡 Result:

The @semantic-release/github plugin primarily uses the GitHub REST API to publish releases, not standard git push commands for the release itself [1][2]. Authentication for this API is managed via the GH_TOKEN or GITHUB_TOKEN environment variable [1][3]. Regarding your query on "git push" and "persisted tokens": 1. Git Push vs. API: While the @semantic-release/github plugin uses the GitHub API for releases, other parts of the semantic-release ecosystem, particularly the @semantic-release/git plugin (used for committing generated files back to the repository), do use the git CLI and therefore perform git push operations [4][5]. 2. Persisted Tokens in GitHub Actions: In GitHub Actions, the default actions/checkout step automatically configures the git CLI with the provided GITHUB_TOKEN, which is then persisted in the local git config [4]. This can lead to authentication conflicts if you are attempting to use a different token for specific plugins, or if the default token lacks sufficient permissions for certain operations (like pushing to protected branches) [4][6]. 3. Recommended Mitigation: To prevent the CI environment from defaulting to an unwanted persisted token, you should explicitly set persist-credentials: false in your workflow's checkout step [4][6]. This prevents actions/checkout from writing the token to the git config, forcing you to rely on explicit environment variables (like GH_TOKEN) for authentication when performing git operations [4][6]. In summary, ensure that for any plugin requiring git-level access (like @semantic-release/git), you have disabled credential persistence in your checkout step if you are providing a separate authentication token, and ensure the token used has the necessary permissions (e.g., contents: write) [1][4][6].

Citations:


🌐 Web query:

github.com @semantic-release/github v23 v24 published releases use GitHub API no git push

💡 Result:

The @semantic-release/github plugin continues to use the GitHub API to manage releases rather than relying on git push for release creation [1][2]. Regarding the specific versions and changes: 1. Plugin Functionality: The plugin's core mechanism for publishing releases remains interacting with the GitHub API [1][2]. It does not use git push to create releases. 2. Versioning Context: You referenced v23 and v24, which correspond to versions of the semantic-release core, not the @semantic-release/github plugin itself. As of October 2025, the @semantic-release/github plugin released version 12.0.0, which includes a breaking change: the removal of GitHub Search API consumption [3][4]. 3. Minimum Requirements: As of this update, the plugin requires a minimum of Node.js v22.14 and a minimum semantic-release core version of v24.1.0 [3][4][5]. The plugin still requires a GitHub token (GH_TOKEN or GITHUB_TOKEN) with appropriate permissions to authenticate with the GitHub API for publishing releases and performing related actions (such as commenting on issues or PRs) [2][6].

Citations:


🌐 Web query:

github.com semantic-release/release-notes-generator use @semantic-release/github releaseName releaseNotes GitPushes commits?

💡 Result:

The @semantic-release/release-notes-generator plugin does not directly use releaseName, push commits to Git, or interact with @semantic-release/github. Instead, it serves a specific role within the semantic-release pipeline: 1. Function: The sole purpose of @semantic-release/release-notes-generator is to generate release notes by parsing commit messages since the last release [1][2][3]. It utilizes the conventional-changelog library for this task [1][2]. 2. Relationship with other plugins: - Pipeline Orchestration: In a typical semantic-release configuration, plugins are executed in a specific sequence [4][5]. The release notes generated by @semantic-release/release-notes-generator are passed to other plugins later in the pipeline that need them (such as @semantic-release/github for release descriptions or @semantic-release/git for commit messages) [4][5][6]. - @semantic-release/github: This plugin is responsible for creating releases on GitHub [6]. It may use the notes generated by the release-notes-generator to populate the release body. Options like releaseName are configured specifically within the @semantic-release/github plugin configuration, not the generator [7][8]. - Git Pushes: The @semantic-release/release-notes-generator does not perform Git operations. Pushing commits, tags, or release artifacts to a Git repository is the responsibility of plugins like @semantic-release/git or other publishing plugins [4][5][6]. In summary, the release-notes-generator only produces text; it does not control release names, execute Git pushes, or manage the GitHub API interactions [1][2][4].

Citations:


Disable credential persistence in checkout steps that do not perform authenticated Git commands.

actions/checkout keeps the GitHub token in the local Git config by default (persist-credentials: true). Set persist-credentials: false in both checkout steps; the release job can still use tokens via environment variables/API plugins without keeping them persisted on disk.

🧰 Tools
🪛 zizmor (1.26.1)

[warning] 20-21: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

📍 Affects 1 file
  • .github/workflows/release.yml#L20-L21 (this comment)
  • .github/workflows/release.yml#L64-L65
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 20 - 21, Update both
actions/checkout steps in .github/workflows/release.yml at lines 20-21 and 64-65
to set persist-credentials to false, while leaving the existing checkout
configuration and release token usage unchanged.

Source: Linters/SAST tools

Comment on lines +38 to +42
- name: Create tar.gz
run: tar --exclude='.git' --exclude='.github' -czf tt-rss.tar.gz .

- name: Create zip
run: zip -r tt-rss.zip . -x '.git/*' -x '.github/*'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow release.yml =="
if [ -f .github/workflows/release.yml ]; then
  cat -n .github/workflows/release.yml
else
  echo "missing"
fi

echo
echo "== package files =="
for f in package.json package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    if [ "$f" = "package.json" ]; then
      cat -n "$f"
    else
      sed -n '1,120p' "$f"
    fi
  fi
done

echo
echo "== workspace file list relevant =="
git ls-files | sed -n '1,200p'

echo
echo "== zip/tar exclusion behavior probe =="
python3 - <<'PY'
import os, tarfile, io, subprocess, tempfile, shutil
with tempfile.TemporaryDirectory() as d:
    os.makedirs(os.path.join(d, "node_modules"))
    with open(os.path.join(d, "node_modules", "x.js"), "w") as f:
        f.write("x=1")
    with open(os.path.join(d, ".gitignore"), "w") as f:
        f.write("ignored")
    p = subprocess.run(
        ["bash", "-c", "tar --exclude=.git --exclude=.github -czf tt-rss.tar.gz . && zip -r tt-rss.zip . -x '.git/*' -x '.github/*'"],
        cwd=d, capture_output=True, text=True
    )
    print("zip/tar exit codes:", p.returncode, "--")
    print("zip stdout:", p.stdout)
    print("zip stderr:", p.stderr)
    print("files:", sorted(os.listdir(d)))
    with tarfile.open(os.path.join(d, "tt-rss.tar.gz")) as tf:
        print("tar members:")
        for m in tf.getmembers():
            print(" ", m.name)
    with zipimport.ZipFile(os.path.join(d, "tt-rss.zip")) as zf:
        print("zip members:")
        for n in sorted(zf.namelist()):
            print(" ", n)
PY

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 19275


Exclude the tarball and node_modules from both release archives.

The zip command runs after creating tt-rss.tar.gz and excludes only .git/* and .github/*, so the tarball gets uploaded inside the zip. Both archives also include the node_modules directory installed by npm ci, adding unnecessary release artifact size. Add --exclude='node_modules' to the tar step and -x 'node_modules/*' -x 'tt-rss.tar.gz' to the zip step.

Also confirm whether the release should run a frontend build before packaging: this workflow only runs npm ci --ignore-scripts, while package.json defines npm run build via Vite.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 38 - 42, Update the “Create
tar.gz” and “Create zip” steps to exclude node_modules from both archives and
exclude the generated tt-rss.tar.gz from the zip archive. Also verify the
release workflow’s packaging sequence and add the frontend build using the
package.json build script before creating either archive if the release requires
built frontend assets.

Comment on lines 55 to +62
release:
name: Release
runs-on: ubuntu-latest
needs: build
if: github.repository_owner == 'ashcoft'
permissions:
contents: write

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== candidate files =="
git ls-files | rg '(^\.github/workflows/release\.yml$|releaserc|package\.json|README|semantic-release)' || true

echo
echo "== release workflow relevant lines =="
if [ -f .github/workflows/release.yml ]; then
  nl -ba .github/workflows/release.yml | sed -n '1,140p'
fi

echo
echo "== releaserc release branches/plugins =="
if [ -f .releaserc.json ]; then
  nl -ba .releaserc.json | sed -n '1,220p'
fi

echo
echo "== semantic release config searches =="
rg -n "`@semantic-release/github`|issues|pullRequest|githubRepo|Branches|branches" . -S --glob '!node_modules' --glob '!dist' --glob '!build' || true

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 1377


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== release workflow =="
awk '{printf "%6d\t%s\n", NR, $0}' .github/workflows/release.yml | sed -n '1,140p'

echo
echo "== .releaserc.json =="
awk '{printf "%6d\t%s\n", NR, $0}' .releaserc.json | sed -n '1,220p'

echo
echo "== all workflow permissions/greeting/comment configuration =="
rg -n "permissions:|contents:|issues:|pull-requests|`@semantic-release/github`|githubRepo|branches|comments|issue|pull" .github .releaserc.json package.json README.md -S --glob '!node_modules' --glob '!dist' --glob '!build' || true

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 10354


🌐 Web query:

semantic-release @semantic-release/github default behavior addChannels comments issues pull-requests permissions

💡 Result:

The @semantic-release/github plugin manages GitHub release artifacts, issue/pull-request comments, and release channels through specific lifecycle steps. Lifecycle Steps and Behavior: 1. addChannel: This step updates the pre-release status of a GitHub release [1][2]. It is responsible for associating the release with a specific distribution channel (e.g., updating a GitHub release's pre-release field) [1][3]. 2. success: This step executes after a successful release to add comments to GitHub issues and pull requests resolved by the release [1][2]. It also closes issues previously opened by the fail step [1][3]. 3. fail: This step opens or updates a GitHub issue with information about the errors that caused a release failure [1][2]. Permissions Required: When using the GITHUB_TOKEN in GitHub Actions, the plugin requires the following minimum permissions to function correctly [1][4][5]: - contents: write: Necessary to publish the GitHub release [1][4]. - issues: write: Necessary to add comments to resolved issues [1][4]. - pull-requests: write: Necessary to add comments to resolved pull requests [4][5]. Configuration for Comments: The behavior of adding comments can be customized using the successComment option [1][2]. - To disable all comments: Set successComment to false [1][6]. - To control where comments are posted: You can use templates or conditional logic within the successComment setting [2][6]. For example, to only comment on issues, you can use: "<% return!issue.pull_request; %>" [6]. To only comment on pull requests, you can use: "<% return issue.pull_request; %>" [6]. The plugin is included in the default semantic-release configuration [7][8]. If you override the plugins list in your configuration, you must explicitly include @semantic-release/github if you wish to retain this functionality [9].

Citations:


Grant release permissions for GitHub release comments.

.releaserc.json enables @semantic-release/github with only addChannels, so its success step can still comment on resolved issues/PRs and needs issues: write and pull-requests: write in addition to contents: write.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 55 - 62, Update the release job’s
permissions block to retain contents: write and add issues: write plus
pull-requests: write, enabling semantic-release GitHub success comments on
resolved issues and pull requests.

Comment on lines 64 to +65
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.2.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== repo files =="
git ls-files | sed -n '1,120p'

echo
echo "== workflow excerpt =="
if [ -f .github/workflows/release.yml ]; then
  cat -n .github/workflows/release.yml | sed -n '1,140p'
else
  echo "missing .github/workflows/release.yml"
fi

echo
echo "== semantic-release config files =="
git ls-files | rg '(^|/)(package\.json|\.releaserc(\..*)?|release\.config\.(js|ts|mjs|cjs)|semantic-release|package-lock\.json|pnpm-lock\.yaml|yarn\.lock)$' || true

echo
echo "== semantic-release references =="
rg -n "semantic-release|fetch-depth|git describe|tagMode|branches|plugins" .github package.json release.config.* .releaserc* . 2>/dev/null | head -200 || true

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 23017


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== release config =="
cat -n .releaserc.json

echo
echo "== package semantic-release deps =="
node - <<'JS'
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('package.json','utf8'));
for (const section of ['dependencies','devDependencies']) {
  if (pkg[section]) {
    for (const [name, version] of Object.entries(pkg[section])) {
      if (name.includes('semantic-release') || name.includes('`@semantic-release`')) {
        console.log(`${section}.${name}=${version}`);
      }
    }
  }
}
JS

echo
echo "== local checkout workflow examples with fetch-depth =="
rg -n "fetch-depth|actions/checkout|semantic-release|git describe" .github/workflows -C 3 || true

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 10001


🌐 Web query:

semantic-release GitHub actions checkout fetch-depth 0 CI setup

💡 Result:

To use semantic-release effectively with GitHub Actions, setting fetch-depth: 0 is required in the actions/checkout step [1][2]. By default, GitHub Actions' actions/checkout performs a shallow clone (fetch-depth: 1) [2][3], which fetches only the most recent commit [2][4]. Semantic-release requires the full Git history and tags to function correctly [2][3]. Specifically, it needs this history to: 1. Analyze all commits since the last release to determine the correct version bump (major, minor, or patch) based on conventional commits [2]. 2. Generate accurate release notes by reviewing the commit history [2]. 3. Identify the last release tag to calculate the delta for the next version [2]. Without the full history, semantic-release may fail to identify the correct version, skip releases, or generate incomplete changelogs [2]. Recommended GitHub Actions configuration: - uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true # Recommended for reliable tag access [3][5] If you encounter issues with credentials when using a custom token, you may also need to set persist-credentials to false [6]: - uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: false

Citations:


🌐 Web query:

github actions checkout fetch-tags default true v4 fetch-depth

💡 Result:

In the actions/checkout v4 action, the fetch-tags input defaults to false [1][2]. The fetch-depth input defaults to 1 [1][2]. When fetch-depth is set to the default of 1, only a single commit is fetched for the specific reference (SHA) that triggered the workflow [1][3]. Setting fetch-tags to true is intended to allow fetching tags even when fetch-depth is greater than 0, but users have reported that this does not always behave as expected or fetch all available tags in certain configurations [4][5][6]. To ensure all tags and the complete commit history are fetched, it is standard practice to set fetch-depth to 0 [1][7].

Citations:


Use full Git history for the release checkout.

actions/checkout defaults to fetch-depth: 1, so the release job only has the triggering commit and not the tags/previous release history that semantic-release and the later git describe --tags --abbrev=0 need.

🔧 Proposed fix
       - name: Checkout
         uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+        with:
+          fetch-depth: 0
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.2.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 64-65: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 64 - 65, Update the
actions/checkout step in the release job to fetch the full repository history by
configuring fetch-depth to 0. Keep the existing pinned actions/checkout
reference and checkout behavior unchanged.

Comment on lines +96 to +105
- name: Upload artifacts to release
run: |
gh release upload ${{ steps.version.outputs.VERSION }} \
tt-rss.tar.gz \
tt-rss.zip \
--repo ${{ github.repository }}
TAG=$(git describe --tags --abbrev=0)
echo "Uploading release assets for: $TAG"
gh release upload "$TAG" tt-rss.tar.gz --clobber
gh release upload "$TAG" tt-rss.zip --clobber
echo "=== Uploaded ==="
gh release view "$TAG" --json assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow outline =="
sed -n '1,140p' .github/workflows/release.yml

echo
echo "== releaserc =="
cat .releaserc.json
echo
fd -a '.releaserc.*|release\.yml' .

echo
echo "== package config/release deps =="
if [ -f package.json ]; then
  jq '.devDependencies, .dependencies, .scripts' package.json
fi

echo
echo "== git status diff stats =="
git status --short
git diff --stat -- .github/workflows/release.yml .releaserc.json || true

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 6207


🌐 Web query:

@semantic-release/github publish plugin GitHub Release API releases/tags create local git tag push

💡 Result:

The @semantic-release/github plugin is responsible for publishing a release to the GitHub Releases page, not for creating or pushing local git tags [1][2][3]. In the standard semantic-release workflow, the responsibility for managing Git tags and commits is as follows: 1. Core Workflow (Tagging): The semantic-release core automatically creates a Git tag locally for the new release version [3]. This tag identifies the commit associated with that specific version [4][3]. 2. Git Plugin (Pushing Tags/Commits): The @semantic-release/git plugin is typically used in conjunction with the other plugins to handle the pushing of these locally created tags and any automated changes (such as updated package.json files or changelogs) back to your remote Git repository [5][6][7]. Without this plugin, semantic-release may create a tag in your local CI environment, but that tag will not be automatically pushed to the remote repository [4]. To summarize, if you want your release process to include creating and pushing a Git tag to your remote repository, you should include the @semantic-release/git plugin in your configuration [5][6]. The @semantic-release/github plugin focuses exclusively on interacting with the GitHub Releases API to create the release entity on GitHub itself [1][2][8].

Citations:


🌐 Web query:

actions/checkout default fetch depth shallow fetch tags false

💡 Result:

In the actions/checkout GitHub Action, the default behavior for shallow fetching and tag fetching is as follows: - Default fetch-depth: The default value for fetch-depth is 1 [1][2]. This means the action performs a shallow clone, fetching only a single commit for the specific ref or SHA that triggered the workflow [1][3]. To fetch all history (including all branches and tags), you must explicitly set fetch-depth to 0 [1][4]. - Default fetch-tags: The default value for fetch-tags is false [1][2]. When set to false, the action does not fetch tags during the initial clone/fetch, even if the fetch-depth is greater than 1 [2][5]. Note that while setting fetch-depth: 0 ensures all history and tags are fetched, some users have reported complexities when attempting to use fetch-tags: true in combination with shallow clones (fetch-depth > 0), as specific Git configurations or repository states may sometimes require fetch-depth: 0 to ensure all tags are properly accessible for commands like git describe [6][7].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== release.yml checkout inputs =="
rg -n "uses: actions/checkout|fetch-depth|fetch-tags|persist-credentials" .github/workflows/release.yml

echo
echo "== root config files that might affect semantic-release =="
fd -a '^(package\.json|\.releaserc.*|package-lock\.json|pnpm-lock\.yaml|yarn\.lock)$' . | sed 's#^\./##' | sort

Repository: ashcoft/tt-rss-non-dockerize

Length of output: 757


Use semantic-release’s native asset upload instead of git describe.

actions/checkout does a shallow checkout with tags fetched separately, and @semantic-release/github creates the GitHub Release tag via the Releases API rather than pushing a local tag. This makes git describe --tags --abbrev=0 unreliable: it can miss the newly published tag (or resolve to an old one), so assets may be uploaded to the wrong release or the job can fail. Let @semantic-release/github upload the assets atomically by adding the assets option instead of looking up the tag in the following step.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 96 - 105, Replace the manual
“Upload artifacts to release” step’s git describe and gh release upload logic
with the native assets configuration on the `@semantic-release/github` plugin.
Configure both tt-rss.tar.gz and tt-rss.zip as release assets so
semantic-release uploads them to the release it creates, and remove the
redundant tag lookup and upload commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants