GitHub Action
Build and upload Rust binary to GitHub Releases
GitHub Action for building and uploading Rust binary to GitHub Releases.
- Usage
- Inputs
- Example workflow: Basic usage
- Example workflow: Basic usage (multiple platforms)
- Example workflow: Customize archive name
- Example workflow: Build with different features on different platforms
- Example workflow: Cross-compilation
- Example workflow: Include additional files
- Other examples
- Optimize Rust binary
- Related Projects
- License
This action builds and uploads Rust binary that specified by bin
option to
GitHub Releases.
Currently, this action is basically intended to be used in combination with an action like create-gh-release-action that creates a GitHub release when a tag is pushed.
Name | Required | Description | Type | Default |
---|---|---|---|---|
bin | true | Comma-separated list of binary names (non-extension portion of filename) to build and upload | String | |
archive | false | Archive name (non-extension portion of filename) to be uploaded | String | $bin-$target |
target | false | Target triple, default is host triple | String | (host triple) |
features | false | Comma-separated list of cargo build features to enable | String | |
tar | false | On which platform to distribute the .tar.gz file (all, unix, windows, or none) |
String | unix |
zip | false | On which platform to distribute the .zip file (all, unix, windows, or none) |
String | windows |
checksum | false | Comma-separated list of algorithms to be used for checksum (sha256, sha512, sha1, or md5) | String | |
include | false | Comma-separated list of additional files to be included to the archive | String | |
asset | false | Comma-separated list of additional files to be uploaded separately | String | |
leading_dir | false | Whether to create the leading directory in the archive or not | Boolean | false |
build_tool | false | Tool to build binaries (cargo or cross, see cross-compilation example for more) | String |
In this example, when a new tag is pushed, creating a new GitHub Release by using create-gh-release-action, then uploading Rust binary to the created GitHub Release.
An archive file with a name like $bin-$target.tar.gz
will be uploaded to
GitHub Release.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
You can specify multiple binaries when the root manifest is a virtual manifest or specified binaries are in the same crate.
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: app1,app2
# (optional) Archive name (non-extension portion of filename) to be uploaded.
# [default value: $bin-$target]
# [possible values: the following variables and any string]
# variables:
# - $bin - Binary name (non-extension portion of filename).
# - $target - Target triple.
# - $tag - Tag of this release.
# When multiple binary names are specified, default archive name or $bin variable cannot be used.
archive: app-$target
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
This action supports Linux, macOS, and Windows as a host OS and supports binaries for various targets.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) On which platform to distribute the `.tar.gz` file.
# [default value: unix]
# [possible values: all, unix, windows, none]
tar: unix
# (optional) On which platform to distribute the `.zip` file.
# [default value: windows]
# [possible values: all, unix, windows, none]
zip: windows
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
By default, this action will upload an archive file with a name like
$bin-$target.$extension
.
You can customize archive name by archive
option.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
bin: ...
# (optional) Archive name (non-extension portion of filename) to be uploaded.
# [default value: $bin-$target]
# [possible values: the following variables and any string]
# variables:
# - $bin - Binary name (non-extension portion of filename).
# - $target - Target triple.
# - $tag - Tag of this release.
# When multiple binary names are specified, default archive name or $bin variable cannot be used.
archive: $bin-$tag-$target
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
This action enables the systemd
and io_uring
features for Linux, and leave macOS, and Windows with default set of features.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
- os: ubuntu-latest
features: systemd,io_uring
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) On which platform to distribute the `.tar.gz` file.
# [default value: unix]
# [possible values: all, unix, windows, none]
tar: unix
# (optional) On which platform to distribute the `.zip` file.
# [default value: windows]
# [possible values: all, unix, windows, none]
zip: windows
# (optional) Build with the given set of features if any.
features: ${{ matrix.features || '' }}
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
By default, this action uses cross for cross-compilation (if cross supports that target). In the following example, only aarch64-unknown-linux-gnu uses cross, the rest use cargo.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
include:
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-apple-darwin
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) Target triple, default is host triple.
target: ${{ matrix.target }}
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
However, if the host has another cross-compilation setup, it will be respected. The following is an example using setup-cross-toolchain-action. In this example, this action uses cargo for all targets.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
include:
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-apple-darwin
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Install cross-compilation tools
uses: taiki-e/setup-cross-toolchain-action@v1
with:
target: ${{ matrix.target }}
if: startsWith(matrix.os, 'ubuntu')
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) Target triple, default is host triple.
target: ${{ matrix.target }}
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
If the heuristic to detect host cross-compilation setups does not work well, or if you want to force the use of cargo or cross, you can use the build_tool
input option.
name: Release
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional)
changelog: CHANGELOG.md
env:
# (required)
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
include:
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
build_tool: cross
- target: aarch64-apple-darwin
os: macos-latest
build_tool: cargo
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Install cross-compilation tools
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required)
bin: ...
# (optional) Target triple, default is host triple.
target: ${{ matrix.target }}
# (optional) Tool to build binaries (cargo, or cross)
build_tool: ${{ matrix.build_tool }}
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
If you want include additional file to the archive, you can use the include
option.
name: Release
permissions:
contents: write
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/create-gh-release-action@v1
with:
# (optional) Path to changelog.
changelog: CHANGELOG.md
env:
# (required) GitHub token for creating GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) Comma-separated list of additional files to be included to archive.
# Note that glob pattern is not supported yet.
include: LICENSE,README.md
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
By default, the expanded archive does not include the leading directory. In the above example, the directory structure of the archive would be as follows:
/<bin>
/LICENSE
/README.md
You can use the leading_dir
option to create the leading directory.
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) Comma-separated list of additional files to be included to archive.
# Note that glob pattern is not supported yet.
include: LICENSE,README.md
# (optional) Whether to create the leading directory in the archive or not. default to false.
leading_dir: true
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
In the above example, the directory structure of the archive would be as follows:
/<archive>/
/<archive>/<bin>
/<archive>/LICENSE
/<archive>/README.md
If you want upload additional file separately, you can use the asset
option.
upload-assets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: taiki-e/upload-rust-binary-action@v1
with:
# (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload.
# Note that glob pattern is not supported yet.
bin: ...
# (optional) Comma-separated list of additional files to be uploaded separately.
# Note that glob pattern is not supported yet.
asset: LICENSE,README.md
env:
# (required) GitHub token for uploading assets to GitHub Releases.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
In the above example, the following 3 files will be uploaded:
<bin>-<target>.tar.gz
LICENSE
README.md
You can optimize Rust binaries by passing the profile options.
The profile options can be specified by [profile]
table in Cargo.toml
, cargo config, environment variables, etc.
The followings are examples of using environment variables to specify profile options:
-
env: CARGO_PROFILE_RELEASE_LTO: true
-
env: CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 1
Note: These options may increase the build time.
- create-gh-release-action: GitHub Action for creating GitHub Releases based on changelog.
- setup-cross-toolchain-action: GitHub Action for setup toolchains for cross compilation and cross testing for Rust.
- install-action: GitHub Action for installing development tools.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.