redis-cell CI #7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: redis-cell CI | |
on: | |
pull_request: | |
push: | |
schedule: | |
# Weekly. | |
- cron: "0 0 * * 0" | |
jobs: | |
# | |
# BUILD JOBS | |
# | |
build: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
rust_toolchain: | |
- stable | |
- nightly | |
timeout-minutes: 5 | |
steps: | |
- name: "Checkout" | |
uses: actions/checkout@v2 | |
- name: "Cache: Cargo registry" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/registry | |
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo index" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/git | |
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo build" | |
uses: actions/cache@v1 | |
with: | |
path: target | |
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Install: Rust toolchain" | |
uses: actions-rs/toolchain@v1 | |
with: | |
components: clippy, rustfmt | |
override: true | |
profile: minimal | |
toolchain: ${{ matrix.rust_toolchain }} | |
- name: "Cargo: Check" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: check | |
- name: "Cargo: Build" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: build | |
- name: "Cargo: Test" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: test | |
- name: "Check: Clippy" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: clippy | |
args: -- -D warnings | |
- name: "Check: Rustfmt" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: fmt | |
args: --all -- --check | |
# | |
# RELEASE JOBS | |
# | |
# Note that releases are only pushed on `vX.X.X` tags, and those releases are | |
# only *drafts*. We still expect someone to go in and manually edit the title | |
# description to give the final product a more human touch. | |
# | |
# This is pretty insane, but unfortunately a side effect inherent to the | |
# design/misdesign of GitHub Actions: | |
# | |
# We want to publish a number of different build artifacts (one per | |
# architecture), but any use of the `actions/create-release` action cuts a | |
# brand new release instead of reusing an existing one. To work around the | |
# problem, we cut the release in this separate job. Unfortunately, because | |
# outputs cannot be shared across jobs, that prevents other jobs from | |
# accessing the upload URL, which is need to publish artifacts. | |
# | |
# The workaround is to put the upload URL in a file and publish that as an | |
# artifact. Other jobs then download it, export it to other steps, and | |
# publish artifacts independently. | |
release_create: | |
if: contains(github.ref, 'tags/v') | |
runs-on: ubuntu-latest | |
steps: | |
- name: "Create release" | |
id: create_release | |
uses: actions/create-release@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
draft: true | |
release_name: "${{ github.ref }}" | |
tag_name: ${{ github.ref }} | |
- name: "Save release URL to file" | |
run: echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt | |
- name: "Upload release URL file" | |
uses: actions/upload-artifact@v1 | |
with: | |
name: release_url | |
path: release_url.txt | |
release_linux: | |
if: contains(github.ref, 'tags/v') | |
needs: | |
- build | |
- release_create | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
target: | |
- aarch64-unknown-linux-gnu | |
- armv7-unknown-linux-gnueabihf | |
- x86_64-unknown-linux-gnu | |
timeout-minutes: 10 | |
steps: | |
- name: "Checkout" | |
uses: actions/checkout@v2 | |
- name: "Cache: Cargo registry" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/registry | |
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo index" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/git | |
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo build" | |
uses: actions/cache@v1 | |
with: | |
path: target | |
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Install: Rust toolchain" | |
uses: actions-rs/toolchain@v1 | |
with: | |
override: true | |
profile: minimal | |
target: ${{ matrix.target }} | |
toolchain: stable | |
- name: "Cargo: Build release" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: build | |
args: --release --target=${{ matrix.target }} | |
use-cross: true | |
- name: "Download release URL file" | |
uses: actions/download-artifact@v1 | |
with: | |
name: release_url | |
- name: "Get release info" | |
id: get_release_info | |
run: | | |
echo ::set-output name=file_name::${REPOSITORY_NAME##*/}-${TAG_REF_NAME##*/}-${{ matrix.target }}.tar.gz # RepositoryName-v1.0.0-arch.tar.gz | |
value=`cat release_url/release_url.txt` | |
echo ::set-output name=upload_url::$value | |
env: | |
REPOSITORY_NAME: ${{ github.repository }} | |
TAG_REF_NAME: ${{ github.ref }} | |
- name: "Create release bundle" | |
run: | | |
main() { | |
local src=$(pwd) | |
local stage=$(mktemp -d) | |
echo $stage | |
cp target/${{ matrix.target }}/release/libredis_cell.* $stage/ | |
cd $stage | |
tar czf $src/${{ steps.get_release_info.outputs.file_name }} * | |
cd $src | |
rm -rf $stage | |
} | |
main | |
- name: "Upload release asset" | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
asset_content_type: application/zip | |
asset_name: ${{ steps.get_release_info.outputs.file_name }} | |
asset_path: ./${{ steps.get_release_info.outputs.file_name }} | |
upload_url: ${{ steps.get_release_info.outputs.upload_url }} | |
# A separate release step for Mac OS. Technically this seems like something | |
# that might fit into a build matrix, but in practice the architecture | |
# targets for Mac OS versus Ubuntu are completing exclusive, so the exclude | |
# list would be huge. Unfortunately this results in more copy + paste, but so | |
# it is. | |
release_macos: | |
if: contains(github.ref, 'tags/v') | |
needs: | |
- build | |
- release_create | |
runs-on: macos-latest | |
strategy: | |
matrix: | |
target: | |
- x86_64-apple-darwin | |
timeout-minutes: 10 | |
steps: | |
- name: "Checkout" | |
uses: actions/checkout@v2 | |
- name: "Cache: Cargo registry" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/registry | |
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo index" | |
uses: actions/cache@v1 | |
with: | |
path: ~/.cargo/git | |
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Cache: Cargo build" | |
uses: actions/cache@v1 | |
with: | |
path: target | |
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} | |
- name: "Install: Rust toolchain" | |
uses: actions-rs/toolchain@v1 | |
with: | |
override: true | |
profile: minimal | |
target: ${{ matrix.target }} | |
toolchain: stable | |
- name: "Cargo: Build release" | |
uses: actions-rs/cargo@v1 | |
with: | |
command: build | |
args: --release --target=${{ matrix.target }} | |
use-cross: true | |
- name: "Download release URL file" | |
uses: actions/download-artifact@v1 | |
with: | |
name: release_url | |
- name: "Get release info" | |
id: get_release_info | |
run: | | |
echo ::set-output name=file_name::${REPOSITORY_NAME##*/}-${TAG_REF_NAME##*/}-${{ matrix.target }}.tar.gz # RepositoryName-v1.0.0-arch.tar.gz | |
value=`cat release_url/release_url.txt` | |
echo ::set-output name=upload_url::$value | |
env: | |
REPOSITORY_NAME: ${{ github.repository }} | |
TAG_REF_NAME: ${{ github.ref }} | |
- name: "Create release bundle" | |
run: | | |
main() { | |
local src=$(pwd) | |
local stage=$(mktemp -d) | |
echo $stage | |
cp target/${{ matrix.target }}/release/libredis_cell.* $stage/ | |
cd $stage | |
tar czf $src/${{ steps.get_release_info.outputs.file_name }} * | |
cd $src | |
rm -rf $stage | |
} | |
main | |
- name: "Upload release asset" | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
asset_content_type: application/zip | |
asset_name: ${{ steps.get_release_info.outputs.file_name }} | |
asset_path: ./${{ steps.get_release_info.outputs.file_name }} | |
upload_url: ${{ steps.get_release_info.outputs.upload_url }} |