Merge branch 'feature/ci_image_for_everything' into develop #30
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: Build and Release | |
on: | |
push: | |
branches: [ "release/**", "develop", "staging/**" ] | |
tags: [ "samedec-*" ] | |
pull_request: | |
branches: [ "develop" ] | |
permissions: | |
contents: write | |
env: | |
CARGO_TERM_COLOR: always | |
RUST_BACKTRACE: 1 | |
jobs: | |
# perform basic code quality checks, | |
# then run `cargo vendor` and cache it | |
check_and_vendor: | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/cbs228/sameold/builder/x86_64-unknown-linux-gnu:latest | |
credentials: | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
env: | |
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Checking for whitespace errors (PRs only) | |
if: github.event.pull_request.base.sha | |
run: | | |
git diff --check "${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}" || { | |
echo \ | |
'::error title={Failed git diff --check}::Your pull request introduces whitespace errors, which is not allowed. Please run:%0A%0A'\ | |
' git rebase --whitespace=fix%0A'\ | |
' git push -f%0A%0Ato correct and resubmit.' | |
exit 1; | |
} | |
- name: Checking for cargo-fmt errors (PRs only) | |
if: github.event.pull_request.base.sha | |
run: | | |
cargo fmt --check || { \ | |
echo \ | |
'::error title={Failed cargo-fmt --check}::Your pull request does not conform to cargo-fmt, which is not allowed. Please run:%0A%0A' \ | |
' cargo fmt%0A' \ | |
' git commit -a --amend%0A' \ | |
' git push -f%0A%0Ato correct and resubmit. If the `cargo fmt` touches code which is not part of your original PR, please let us know in the comments.' | |
exit 1; | |
} | |
- uses: actions/cache@v4 | |
name: Update crate cargo-vendor cache | |
id: vendor_cache | |
with: | |
path: | | |
.cargo | |
vendor | |
key: cargo-vendor-${{ hashFiles('**/Cargo.lock') }} | |
restore-keys: | | |
cargo-vendor | |
enableCrossOsArchive: true | |
- uses: actions/cache@v4 | |
name: Update cargo registry cache | |
if: steps.vendor_cache.outputs.cache-hit != 'true' | |
with: | |
path: | | |
~/.cargo/bin/ | |
~/.cargo/registry/index/ | |
~/.cargo/registry/cache/ | |
~/.cargo/git/db/ | |
key: ${{ runner.os }}-cargo-cache-${{ hashFiles('**/Cargo.lock') }} | |
restore-keys: | | |
${{ runner.os }}-cargo-cache | |
- name: Vendor sources | |
if: steps.vendor_cache.outputs.cache-hit != 'true' | |
run: | | |
mkdir -p .cargo | |
mkdir -p vendor | |
cargo vendor --versioned-dirs --locked >.cargo/config.toml | |
- name: Check Rust lints (PRs only) | |
if: github.event.pull_request.base.sha | |
run: | | |
cargo check --frozen --locked --workspace || { \ | |
echo \ | |
'::error title={Failed cargo-check}::`cargo check` must pass without errors. Please correct Rust compiler lints. When you are finished, please run:%0A%0A' \ | |
' cargo fmt%0A' \ | |
' git commit -a --amend%0A' \ | |
' git push -f%0A%0Ato correct and resubmit. If this requires you to touch code which is not part of your original PR, please let us know in the comments.' | |
exit 1; | |
} | |
- name: Check documentation build (PRs only) | |
if: github.event.pull_request.base.sha | |
run: | | |
cargo doc --frozen --locked --no-deps --workspace || { \ | |
echo \ | |
'::error title={Failed cargo-doc build}::Documentation failed to build. `cargo doc` must be able to generate crate documentation without errors. Please fix. When you are finished, please run:%0A%0A' \ | |
' cargo fmt%0A' \ | |
' git commit -a --amend%0A' \ | |
' git push -f%0A%0Ato correct and resubmit. If this requires you to touch code which is not part of your original PR, please let us know in the comments.' | |
exit 1; | |
} | |
# test sameold with all crate feature combinations, | |
# in our Linux container | |
test_sameold: | |
strategy: | |
matrix: | |
features: ['', 'chrono'] | |
runs-on: ubuntu-latest | |
needs: check_and_vendor | |
container: | |
image: ghcr.io/cbs228/sameold/builder/x86_64-unknown-linux-gnu:latest | |
credentials: | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
env: | |
CARGO_NET_OFFLINE: "true" | |
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Record environment | |
run: cargo version | |
- uses: actions/cache/restore@v4 | |
name: Restore crate cargo-vendor cache | |
with: | |
path: | | |
.cargo | |
vendor | |
key: cargo-vendor-${{ hashFiles('**/Cargo.lock') }} | |
enableCrossOsArchive: true | |
fail-on-cache-miss: true | |
- name: Build and test sameold | |
shell: bash | |
run: | | |
cargo test --frozen -p sameold --verbose --no-default-features --features "${{ matrix.features }}" | |
# Test and release samedec on Linux, via containers | |
release_samedec_linux: | |
runs-on: ubuntu-latest | |
needs: check_and_vendor | |
name: linux-${{ matrix.target }} | |
strategy: | |
matrix: | |
include: | |
- target: x86_64-unknown-linux-gnu | |
- target: aarch64-unknown-linux-gnu | |
- target: armv7-unknown-linux-gnueabihf | |
- target: i686-unknown-linux-gnu | |
container: | |
image: ghcr.io/cbs228/sameold/builder/${{ matrix.target }}:latest | |
credentials: | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
env: | |
CARGO_NET_OFFLINE: "true" | |
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse | |
RUSTFLAGS: '-C strip=symbols' | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/cache/restore@v4 | |
name: Restore crate cargo-vendor cache | |
with: | |
path: | | |
.cargo | |
vendor | |
key: cargo-vendor-${{ hashFiles('**/Cargo.lock') }} | |
enableCrossOsArchive: true | |
fail-on-cache-miss: true | |
- name: "debug: cross-compile and cross-test" | |
run: | | |
cargo test --offline --frozen --workspace | |
- name: "release: cross-compile, cross-test, and install" | |
run: | | |
cargo test --offline --frozen --release --workspace && | |
cargo install --offline --frozen --path=crates/samedec | |
- name: Run integration tests on release-mode build | |
run: | | |
qemu-run-maybe samedec --version && | |
./sample/test.sh qemu-run-maybe samedec | |
- name: Copy artifact | |
run: | | |
cp /install/bin/samedec /install/bin/samedec-${{ matrix.target }} | |
- name: Store artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: samedec-${{ matrix.target }} | |
path: /install/bin/samedec-${{ matrix.target }} | |
retention-days: 3 | |
- name: Upload tagged release (tags only) | |
uses: svenstaro/upload-release-action@v2 | |
if: startsWith(github.ref, 'refs/tags/samedec-') | |
with: | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
file: /install/bin/samedec-${{ matrix.target }} | |
overwrite: true | |
- name: Update tag for nightly release (develop-branch only) | |
uses: richardsimko/update-tag@v1 | |
if: github.ref == 'refs/heads/develop' | |
with: | |
tag_name: latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload nightly release (develop-branch only) | |
uses: svenstaro/upload-release-action@v2 | |
if: github.ref == 'refs/heads/develop' | |
with: | |
tag: "latest" | |
release_name: "Nightly Release" | |
body: "This is a rolling release built from the latest `develop` branch." | |
prerelease: true | |
file: /install/bin/samedec-${{ matrix.target }} | |
overwrite: true | |
# MacOS and Windows builds | |
release_samedec_nonlinux: | |
strategy: | |
matrix: | |
include: | |
- os: windows-latest | |
os_short: windows | |
target: x86_64-pc-windows-msvc | |
rustflags: '-C strip=symbols -C target-feature=+crt-static' | |
dotexe: '.exe' | |
- os: macos-latest | |
os_short: macos | |
target: aarch64-apple-darwin | |
rustflags: '-C strip=symbols' | |
dotexe: '' | |
- os: macos-latest | |
os_short: macos | |
target: x86_64-apple-darwin | |
rustflags: '-C strip=symbols' | |
dotexe: '' | |
runs-on: ${{ matrix.os }} | |
name: ${{ matrix.os_short }}-${{ matrix.target }} | |
needs: check_and_vendor | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
CARGO_NET_OFFLINE: "true" | |
CARGO_INSTALL_ROOT: "install/" | |
RUSTFLAGS: ${{ matrix.rustflags }} | |
samedec_exe: "install/bin/samedec${{ matrix.dotexe }}" | |
samedec_target_exe: "install/bin/samedec-${{ matrix.target}}${{ matrix.dotexe }}" | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Record environment | |
shell: bash | |
run: cargo version | |
- uses: actions/cache/restore@v4 | |
name: Restore crate cargo-vendor cache | |
with: | |
path: | | |
.cargo | |
vendor | |
key: cargo-vendor-${{ hashFiles('**/Cargo.lock') }} | |
enableCrossOsArchive: true | |
fail-on-cache-miss: true | |
- name: "debug: compile and test" | |
shell: bash | |
run: | | |
rustup target add "${CARGO_BUILD_TARGET}" && | |
cargo test --offline --frozen --workspace | |
- name: "release: cross-compile, cross-test, and install" | |
shell: bash | |
run: | | |
mkdir -p "${CARGO_INSTALL_ROOT}" && | |
export PATH="$(realpath ${CARGO_INSTALL_ROOT})/bin:${PATH}" | |
cargo test --offline --frozen --release --workspace && | |
cargo install --offline --frozen --path=crates/samedec | |
- name: Run integration tests on release-mode build | |
shell: bash | |
run: | | |
export PATH="$(realpath ${CARGO_INSTALL_ROOT})/bin:${PATH}" | |
samedec --version && | |
pushd ./sample && ./test.sh samedec && popd | |
- name: Copy artifact | |
shell: bash | |
run: | | |
cp "$samedec_exe" "$samedec_target_exe" | |
- name: Store artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: samedec-${{ env.CARGO_BUILD_TARGET }} | |
path: ${{ env.samedec_target_exe }} | |
retention-days: 3 | |
- name: Upload tagged release (tags only) | |
uses: svenstaro/upload-release-action@v2 | |
if: startsWith(github.ref, 'refs/tags/samedec-') | |
with: | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
file: ${{ env.samedec_target_exe }} | |
overwrite: true | |
- name: Update tag for nightly release (develop-branch only) | |
uses: richardsimko/update-tag@v1 | |
if: github.ref == 'refs/heads/develop' | |
with: | |
tag_name: latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload nightly release (develop-only) | |
uses: svenstaro/upload-release-action@v2 | |
if: github.ref == 'refs/heads/develop' | |
with: | |
tag: "latest" | |
release_name: "Nightly Release" | |
body: "This is a rolling release built from the latest `develop` branch." | |
prerelease: true | |
file: ${{ env.samedec_target_exe }} | |
overwrite: true |