Files
dosh/.github/workflows/ci.yml
T

132 lines
4.7 KiB
YAML

name: ci
on:
push:
pull_request:
workflow_dispatch:
schedule:
- cron: "17 7 * * 1"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Format check
run: cargo fmt -- --check
- name: Test
run: cargo test
- name: Build release
run: cargo build --release
- name: Docker SSH benchmark gate
run: sh scripts/ci-docker-ssh-bench.sh
fuzz-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install nightly toolchain
id: nightly
continue-on-error: true
uses: dtolnay/rust-toolchain@nightly
- name: Install cargo-fuzz
id: install
if: steps.nightly.outcome == 'success'
continue-on-error: true
run: cargo install cargo-fuzz --locked
- name: Run fuzz targets briefly
if: steps.nightly.outcome == 'success' && steps.install.outcome == 'success'
run: |
set -e
if [ "${{ github.event_name }}" = "schedule" ] || [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
DOSH_FUZZ_SECONDS="${DOSH_FUZZ_SECONDS:-300}" sh scripts/fuzz-run.sh
else
sh scripts/fuzz-run.sh 20
fi
- name: Note when fuzzing was skipped
if: steps.nightly.outcome != 'success' || steps.install.outcome != 'success'
run: echo "cargo-fuzz / nightly toolchain unavailable; skipped fuzz smoke run."
package-release:
if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/')
strategy:
matrix:
include:
- os: ubuntu-latest
name: linux-x86_64
- os: macos-14
name: macos-aarch64
- os: macos-13
name: macos-x86_64
- os: windows-latest
name: windows-x86_64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Package release
shell: bash
run: sh scripts/package-release.sh
- uses: actions/upload-artifact@v4
with:
name: dosh-${{ matrix.name }}
path: |
target/dosh-release/dosh-*
!target/dosh-release/stage/**
remote-bench:
runs-on: ubuntu-latest
env:
DOSH_BENCH_HOST: ${{ secrets.DOSH_BENCH_HOST }}
DOSH_BENCH_USER: ${{ secrets.DOSH_BENCH_USER }}
DOSH_BENCH_SSH_KEY: ${{ secrets.DOSH_BENCH_SSH_KEY }}
DOSH_BENCH_SSH_PORT: ${{ secrets.DOSH_BENCH_SSH_PORT }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Check remote benchmark configuration
id: config
run: |
if [ -n "$DOSH_BENCH_HOST" ] && [ -n "$DOSH_BENCH_USER" ] && [ -n "$DOSH_BENCH_SSH_KEY" ]; then
echo "configured=true" >> "$GITHUB_OUTPUT"
else
echo "configured=false" >> "$GITHUB_OUTPUT"
echo "Skipping remote benchmark; configure DOSH_BENCH_HOST, DOSH_BENCH_USER, and DOSH_BENCH_SSH_KEY secrets to enable it."
fi
- name: Build release
if: steps.config.outputs.configured == 'true'
run: cargo build --release
- name: Configure SSH key
if: steps.config.outputs.configured == 'true'
run: |
port="${DOSH_BENCH_SSH_PORT:-22}"
mkdir -p ~/.ssh
printf '%s\n' "$DOSH_BENCH_SSH_KEY" > ~/.ssh/dosh_bench
chmod 600 ~/.ssh/dosh_bench
ssh-keyscan -p "$port" "$DOSH_BENCH_HOST" >> ~/.ssh/known_hosts
- name: Copy binaries
if: steps.config.outputs.configured == 'true'
run: |
port="${DOSH_BENCH_SSH_PORT:-22}"
scp -P "$port" -i ~/.ssh/dosh_bench \
target/release/dosh-server target/release/dosh-auth \
"$DOSH_BENCH_USER@$DOSH_BENCH_HOST:/tmp/"
- name: Start remote server
if: steps.config.outputs.configured == 'true'
run: |
port="${DOSH_BENCH_SSH_PORT:-22}"
ssh -p "$port" -i ~/.ssh/dosh_bench "$DOSH_BENCH_USER@$DOSH_BENCH_HOST" \
'mkdir -p ~/.local/bin && install -m 0755 /tmp/dosh-server /tmp/dosh-auth ~/.local/bin/ && pkill -f "dosh-server serve" || true; nohup ~/.local/bin/dosh-server serve >/tmp/dosh-server-ci.log 2>&1 &'
sleep 1
- name: Run remote benchmark
if: steps.config.outputs.configured == 'true'
run: |
port="${DOSH_BENCH_SSH_PORT:-22}"
target/release/dosh-bench \
--server "$DOSH_BENCH_USER@$DOSH_BENCH_HOST" \
--ssh-port "$port" \
--ssh-key ~/.ssh/dosh_bench \
--ssh-auth-command "~/.local/bin/dosh-auth" \
--iterations 3