MCPcopy
hub / github.com/softprops/action-gh-release

github.com/softprops/action-gh-release @v3.0.1 sqlite

repository ↗ · DeepWiki ↗ · release v3.0.1 ↗
71 symbols 180 edges 7 files 0 documented · 0%
README

📦 :octocat:

action gh-release

A GitHub Action for creating GitHub Releases on Linux, Windows, and macOS virtual environments

🤸 Usage

🚥 Limit releases to pushes to tags

Typically usage of this action involves adding a step to a build that is gated pushes to git tags. You may find step.if field helpful in accomplishing this as it maximizes the reuse value of your workflow for non-tag pushes.

v3 requires a GitHub Actions runtime that supports Node 24. If you still need the last Node 20-compatible line, stay on v2.6.2.

Below is a simple example of step.if tag gating

name: Main

on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Release
        uses: softprops/action-gh-release@v3
        if: github.ref_type == 'tag'

You can also use push config tag filter

name: Main

on:
  push:
    tags:
      - "v*.*.*"

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Release
        uses: softprops/action-gh-release@v3

⬆️ Uploading release assets

You can configure a number of options for your GitHub release and all are optional.

A common case for GitHub releases is to upload your binary after its been validated and packaged. Use the with.files input to declare a newline-delimited list of glob expressions matching the files you wish to upload to GitHub releases. If you'd like you can just list the files by name directly. If a tag already has a GitHub release, the existing release will be updated with the release assets.

Below is an example of uploading a single asset named Release.txt

name: Main

on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Build
        run: echo ${{ github.sha }} > Release.txt
      - name: Test
        run: cat Release.txt
      - name: Release
        uses: softprops/action-gh-release@v3
        if: github.ref_type == 'tag'
        with:
          files: Release.txt

Below is an example of uploading more than one asset with a GitHub release

name: Main

on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Build
        run: echo ${{ github.sha }} > Release.txt
      - name: Test
        run: cat Release.txt
      - name: Release
        uses: softprops/action-gh-release@v3
        if: github.ref_type == 'tag'
        with:
          files: |
            Release.txt
            LICENSE

⚠️ Note: Notice the | in the yaml syntax above ☝️. That lets you effectively declare a multi-line yaml string. You can learn more about multi-line yaml syntax here

⚠️ Note for Windows: Both \ and / path separators are accepted in files globs. If you need to match a literal glob metacharacter such as [ or ], keep escaping the metacharacter itself in the pattern.

If your release assets are generated under a subdirectory, set working_directory and keep the files patterns relative to that directory.

- name: Release
  uses: softprops/action-gh-release@v3
  if: github.ref_type == 'tag'
  with:
    working_directory: dist
    files: |
      Release.txt
      checksums/*.txt

📝 External release notes

Many systems exist that can help generate release notes for you. This action supports loading release notes from a path in your repository's build to allow for the flexibility of using any changelog generator for your releases, including a human 👩‍💻

name: Main

on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Generate Changelog
        run: echo "# Good things have arrived" > ${{ github.workspace }}-CHANGELOG.txt
      - name: Release
        uses: softprops/action-gh-release@v3
        if: github.ref_type == 'tag'
        with:
          body_path: ${{ github.workspace }}-CHANGELOG.txt
          repository: my_gh_org/my_gh_repo
          # note you'll typically need to create a personal access token
          # with permissions to create releases in the other repo.
          # A non-empty explicit token overrides GITHUB_TOKEN.
          # Omit the input to use github.token; passing "" treats the token as unset.
          token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}

When you use GitHub's built-in generate_release_notes support, you can optionally pin the comparison base explicitly with previous_tag. This is useful when the default comparison range does not match the release series you want to publish.

- name: Release
  uses: softprops/action-gh-release@v3
  with:
    tag_name: stage-2026-03-15
    target_commitish: ${{ github.sha }}
    previous_tag: prod-2026-03-01
    generate_release_notes: true

💅 Customizing

inputs

The following are optional as step.with keys

Name Type Description
body String Text communicating notable changes in this release
body_path String Path to load text communicating notable changes in this release
draft Boolean Keep the release as a draft. Defaults to false. When reusing an existing draft release, set this to true to keep it draft; omit it to publish after upload.
prerelease Boolean Indicator of whether or not is a prerelease
preserve_order Boolean Upload assets sequentially in the provided order. This controls the action's upload behavior, but it does not control the final asset ordering that GitHub may display on the release page or return from the Releases API.
files String Newline-delimited globs of paths to assets to upload for release. Escape glob metacharacters when you need to match a literal filename that contains them, such as [ or ]. ~/... expands to the runner home directory. On Windows, both \ and / separators are accepted. GitHub may normalize raw asset filenames that contain special characters; the action restores the asset label when possible, but the final download name remains GitHub-controlled.
working_directory String Base directory to resolve files globs against. Use this when release assets live under a subdirectory. If omitted, the action resolves files from ${{ github.workspace }}.
overwrite_files Boolean Indicator of whether files should be overwritten when they already exist. Defaults to true
name String Name of the release. defaults to tag name
tag_name String Name of a tag. defaults to github.ref_name. refs/tags/<name> values are normalized to <name>.
fail_on_unmatched_files Boolean Indicator of whether to fail if any of the files globs match nothing
repository String Name of a target repository in <owner>/<repo> format. Defaults to GITHUB_REPOSITORY env variable
target_commitish String Commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Defaults to repository default branch. When creating a new tag for an older commit, github.token may not have permission to create the ref; use a PAT or another token with sufficient contents permissions if you hit 403 Resource not accessible by integration.
token String Authorized GitHub token or PAT. Defaults to ${{ github.token }} when omitted. A non-empty explicit token overrides GITHUB_TOKEN. Passing "" treats the token as explicitly unset, so omit the input entirely or use an expression such as ${{ inputs.token || github.token }} when wrapping this action in a composite action.
discussion_category_name String If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository. For more information, see "Managing categories for discussions in your repository."
generate_release_notes Boolean Whether to automatically generate the name and body for this release. If

Extension points exported contracts — how you extend this code

Releaser (Interface)
(no doc) [2 implementers]
src/github.ts
Config (Interface)
(no doc)
src/util.ts
ReleaseAsset (Interface)
(no doc)
src/github.ts
Release (Interface)
(no doc)
src/github.ts
ReleaseResult (Interface)
(no doc)
src/github.ts

Core symbols most depended-on inside this repo

parseConfig
called by 13
src/util.ts
parseInputFiles
called by 11
src/util.ts
upload
called by 10
src/github.ts
release
called by 10
src/github.ts
releaseBody
called by 7
src/util.ts
findTagFromReleases
called by 6
src/github.ts
finalizeRelease
called by 5
src/github.ts
isTag
called by 5
src/util.ts

Shape

Function 40
Method 24
Interface 5
Class 2

Languages

TypeScript100%

Modules by API surface

src/github.ts53 symbols
src/util.ts16 symbols
src/main.ts2 symbols

Dependencies from manifests, versioned

@actions/core3.0.1 · 1×
@actions/github9.1.1 · 1×
@octokit/plugin-retry8.1.0 · 1×
@octokit/plugin-throttling11.0.3 · 1×
@types/glob9.0.0 · 1×
@types/mime-types3.0.1 · 1×
@types/node24 · 1×
@vitest/coverage-v84.1.8 · 1×
esbuild0.28.1 · 1×
glob13.0.6 · 1×
mime-types3.0.2 · 1×
prettier3.8.3 · 1×

For agents

$ claude mcp add action-gh-release \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact