svenstaro/upload-release-action
GitHub: svenstaro/upload-release-action
Stars: 710 | Forks: 119
# Upload files to a GitHub release [](https://github.com/svenstaro/upload-release-action/actions)
This action allows you to select which files to upload to the just-tagged release.
It runs on all operating systems types offered by GitHub.
## Input variables
You must provide:
- `file`: A local file to be uploaded as the asset.
### Optional Arguments
| **Argument** | **Default** | **Description** |
|--------------------|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `repo_token` | `github.token` | Defaults to `github.token`. |
| `tag` | `github.ref` | The tag to upload into. If you want the current event's tag or branch name, use `${{ github.ref }}` (the `refs/tags/` and `refs/heads/` prefixes will be automatically stripped). |
| `asset_name` | Filename | The name the file gets as an asset on a release. Use `$tag` to include the tag name. This is not used if `file_glob` is set to `true`. |
| `file_glob` | `false` | If set to true, the `file` argument can be a glob pattern (`asset_name` is ignored in this case). |
| `overwrite` | `false` | If an asset with the same name already exists, overwrite it. |
| `check_duplicates` | `true` | Check for existing assets with the same name. Disabling removes this validity check, and allows reduced Github API usage when there are a large number of files. |
| `promote` | `false` | If a prerelease already exists, promote it to a release. |
| `draft` | `false` | Sets the release as a draft instead of publishing it, allowing you to make any edits needed before releasing. |
| `release_id` | --- | Used for searching for existing release, instead of tag. Must be used if uploading files to an existing draft release. |
| `prerelease` | `false` | Mark the release as a pre-release. |
| `make_latest` | `true` | Mark the release as the latest release for the repository. |
| `release_name` | Same as `tag` | Explicitly set a release name. |
| `target_commit` | Default branch (usually `main`) | Sets the commit hash or branch for the tag to be based on. |
| `body` | `""` | Content of the release text. |
| `repo_name` | Current repository | Specify the name of the GitHub repository in which the GitHub release will be created, edited, and deleted. |
## Output variables
- `browser_download_url`: The publicly available URL of the asset.
- `release_id`: The numerical ID of the created or updated release.
## Usage
This usage assumes you want to build on tag creations only.
This is a common use case as you will want to upload release binaries for your tags.
Simple example:
name: Publish
on:
push:
tags:
- '*'
jobs:
build:
name: Publish binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: cargo build --release
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/mything
asset_name: mything
tag: ${{ github.ref }}
overwrite: true
body: "This is my release text"
Complex example with more operating systems:
name: Publish
on:
push:
tags:
- '*'
jobs:
publish:
name: Publish for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
artifact_name: mything
asset_name: mything-linux-amd64
- os: windows-latest
artifact_name: mything.exe
asset_name: mything-windows-amd64
- os: macos-latest
artifact_name: mything
asset_name: mything-macos-amd64
steps:
- uses: actions/checkout@v4
- name: Build
run: cargo build --release --locked
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/${{ matrix.artifact_name }}
asset_name: ${{ matrix.asset_name }}
tag: ${{ github.ref }}
Example with `file_glob`:
name: Publish
on:
push:
tags:
- '*'
jobs:
build:
name: Publish binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: cargo build --release
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/my*
tag: ${{ github.ref }}
overwrite: true
file_glob: true
Example for creating a release in a foreign repository using `repo_name`:
name: Publish
on:
push:
tags:
- '*'
jobs:
build:
name: Publish binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: cargo build --release
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_name: owner/repository-name
# A personal access token for the GitHub repository in which the release will be created and edited.
# It is recommended to create the access token with the following scopes: `repo, user, admin:repo_hook`.
repo_token: ${{ secrets.YOUR_PERSONAL_ACCESS_TOKEN }}
file: target/release/mything
asset_name: mything
tag: ${{ github.ref }}
overwrite: true
body: "This is my release text"
**Example for feeding a file from repo to the `body` tag:**
This example covers following points:
* Reading a file present on the repo. For example, `release.md` which is placed in root directory of the repo.
* Modify & push the `release.md` file before triggering this action (create tag for this example) to dynamically change the body of the release.
name: Publish
on:
push:
tags:
- '*'
jobs:
build:
name: Publish binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# This step reads a file from repo and use it for body of the release
# This works on any self-hosted runner OS
- name: Read release.md and use it as a body of new release
id: read_release
shell: bash
run: |
r=$(cat path/to/release.md) # <--- Read release.md (Provide correct path as per your repo)
r="${r//'%'/'%25'}" # Multiline escape sequences for %
r="${r//$'\n'/'%0A'}" # Multiline escape sequences for '\n'
r="${r//$'\r'/'%0D'}" # Multiline escape sequences for '\r'
echo "RELEASE_BODY=$r" >> $GITHUB_OUTPUT # <--- Set environment variable
- name: Upload Binaries to Release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref }}
body: |
${{ steps.read_release.outputs.RELEASE_BODY }} # <--- Use environment variables that was created earlier
### Permissions
This actions requires writes access to the release. If you are encountering "resource not accessible by integration" errors, you will need to add the `contents: write` permission to the token using [granular permissions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions):
permissions:
contents: write
By default, these permissions are granted on `push` but not on `pr` - and you should be wary of adding them to workflows that run on pr, as they allow [wide access to changing the entire repo's contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents)
## Releasing
To release this Action:
- Bump version in `package.json`
- Create `CHANGELOG.md` entry
- `npm update`
- `npm run all`
- `git commit -am `
- `git tag -sm `
- `git push --follow-tags`
- Go to https://github.com/svenstaro/upload-release-action/releases and publish the new version
标签:自动化攻击