Skip to content

redis-cell CI

redis-cell CI #16

Workflow file for this run

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 }}