name: OpenBSD # spell-checker:ignore sshfs usesh vmactions taiki esac fdescfs fdesc sccache nextest copyback logind bindgen libclang env: # * style job configuration STYLE_FAIL_ON_FAULT: true ## (bool) fail the build if a style job contains a fault (error or warning); may be overridden on a per-job basis on: pull_request: push: branches: - '*' permissions: contents: read # to fetch code (actions/checkout) # End the current execution if there is a new changeset in the PR. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: style: name: Style and Lint runs-on: ubuntu-latest timeout-minutes: 60 strategy: fail-fast: false matrix: job: - { features: unix } steps: - uses: actions/checkout@v6 with: persist-credentials: false - name: Prepare, build and test uses: vmactions/openbsd-vm@v1 with: usesh: true sync: rsync copyback: false mem: 4096 # We need jq and GNU coreutils to run show-utils.sh and bash to use inline shell string replacement # Use sudo-- to get the default sudo package without ambiguity # Install rust and cargo from OpenBSD packages prepare: | # Clean up disk space before installing packages df -h pkg_add curl sudo-- jq coreutils bash rust rust-clippy rust-rustfmt llvm-- python3 rm -rf /usr/share/relink/* /usr/X11R6/* /usr/share/doc/* /usr/share/man/* & # Clean up package cache after installation pkg_delete -a & df -h run: | ## Prepare, build, and test # implementation modelled after ref: # * NOTE: All steps need to be run in this block, otherwise, we are operating back on the mac host set -e # export CARGO_INCREMENTAL=0 TEST_USER=tester REPO_NAME=${GITHUB_WORKSPACE##*/} WORKSPACE_PARENT="/home/runner/work/${REPO_NAME}" WORKSPACE="${WORKSPACE_PARENT}/${REPO_NAME}" # useradd -m -G wheel ${TEST_USER} chown -R ${TEST_USER}:wheel /root/ "${WORKSPACE_PARENT}"/ whoami # # Further work needs to be done in a sudo as we are changing users sudo -i -u ${TEST_USER} bash << EOF set -e whoami # Rust is installed from packages, no need for rustup # Set up PATH for cargo export PATH="/usr/local/bin:$PATH" ## VARs setup cd "${WORKSPACE}" unset FAIL_ON_FAULT ; case '${{ env.STYLE_FAIL_ON_FAULT }}' in ''|0|f|false|n|no|off) FAULT_TYPE=warning ;; *) FAIL_ON_FAULT=true ; FAULT_TYPE=error ;; esac; FAULT_PREFIX=\$(echo "\${FAULT_TYPE}" | tr '[:lower:]' '[:upper:]') # * determine sub-crate utility list UTILITY_LIST="\$(./util/show-utils.sh --features ${{ matrix.job.features }})" ## Info echo "::group::environment" echo "CI='${CI}'" echo "REPO_NAME='${REPO_NAME}'" echo "TEST_USER='${TEST_USER}'" echo "WORKSPACE_PARENT='${WORKSPACE_PARENT}'" echo "WORKSPACE='${WORKSPACE}'" echo "FAULT_PREFIX='\${FAULT_PREFIX}'" echo "UTILITY_LIST='\${UTILITY_LIST}'" env | sort echo "::endgroup::" echo "::group::tooling info" cargo -V rustc -V echo "::endgroup::" # # To ensure that files are cleaned up, we don't want to exit on error set +e unset FAULT ## cargo fmt testing echo "::group::cargo fmt" # * convert any errors/warnings to GHA UI annotations; ref: S=\$(cargo fmt -- --check) && printf "%s\n" "\$S" || { printf "%s\n" "\$S" ; printf "%s\n" "\$S" | sed -E -n -e "s/^Diff[[:space:]]+in[[:space:]]+\${PWD//\//\\\\/}\/(.*)[[:space:]]+at[[:space:]]+[^0-9]+([0-9]+).*\$/::\${FAULT_TYPE} file=\1,line=\2::\${FAULT_PREFIX}: \\\`cargo fmt\\\`: style violation (file:'\1', line:\2; use \\\`cargo fmt -- \"\1\"\\\`)/p" ; FAULT=true ; } echo "::endgroup::" ## cargo clippy lint testing if [ -z "\${FAULT}" ]; then echo "::group::cargo clippy" CLIPPY_ARGS="--features ${{ matrix.job.features }} --fault-type \${FAULT_TYPE}" if [ -n "\${FAIL_ON_FAULT}" ]; then CLIPPY_ARGS="\${CLIPPY_ARGS} --fail-on-fault"; fi python3 util/run-clippy.py \${CLIPPY_ARGS} || FAULT=true echo "::endgroup::" fi # Clean to avoid to rsync back the files and free up disk space cargo clean if [ -n "\${FAIL_ON_FAULT}" ] && [ -n "\${FAULT}" ]; then exit 1 ; fi EOF test: name: Tests runs-on: ubuntu-latest timeout-minutes: 60 strategy: fail-fast: false matrix: job: - { features: unix } steps: - uses: actions/checkout@v6 with: persist-credentials: false - name: Avoid no space left on device # shared with guest? shell: bash run: | mkdir /tmp/empty sudo rsync -a --delete /tmp/empty/ /usr/lib/jvm/ sudo rsync -a --delete /tmp/empty/ /usr/share/dotnet/ sudo rsync -a --delete /tmp/empty/ /usr/local/lib/android/ - name: Prepare, build and test uses: vmactions/openbsd-vm@v1 with: usesh: true sync: rsync copyback: false mem: 6144 # Install rust and build dependencies from OpenBSD packages (llvm provides libclang for bindgen) prepare: | # Clean up disk space before installing packages df -h mkdir -p empty rsync -a --delete empty/ /usr/share/relink/ rsync -a --delete empty/ /usr/X11R6/ rsync -a --delete empty/ /usr/share/doc/ rsync -a --delete empty/ /usr/share/man/ pkg_add curl gmake sudo-- jq rust llvm-- # Clean up package cache after installation pkg_delete -a df -h run: | ## Prepare, build, and test # implementation modelled after ref: # * NOTE: All steps need to be run in this block, otherwise, we are operating back on the mac host set -e # export CARGO_INCREMENTAL=0 TEST_USER=tester REPO_NAME=${GITHUB_WORKSPACE##*/} WORKSPACE_PARENT="/home/runner/work/${REPO_NAME}" WORKSPACE="${WORKSPACE_PARENT}/${REPO_NAME}" # useradd -m -G wheel ${TEST_USER} chown -R ${TEST_USER}:wheel /root/ "${WORKSPACE_PARENT}"/ whoami # Add fake host for reverse DNS lookup (needed for hostname test) printf "10.0.2.15\topenbsd.my.domain openbsd\n" >> /etc/hosts # # Further work needs to be done in a sudo as we are changing users sudo -i -u ${TEST_USER} sh << EOF set -e whoami # Increase max open files (512 by default) ulimit -n 1024 # Rust is installed from packages, no need for rustup # Set up PATH for cargo export PATH="/usr/local/bin:$PATH" # Install nextest mkdir -p ~/.cargo/bin # Note: nextest might not have OpenBSD builds, so we'll use regular cargo test ## Info echo "::group::environment" echo "CI='${CI}'" echo "REPO_NAME='${REPO_NAME}'" echo "TEST_USER='${TEST_USER}'" echo "WORKSPACE_PARENT='${WORKSPACE_PARENT}'" echo "WORKSPACE='${WORKSPACE}'" env | sort echo "::endgroup::" echo "::group::tooling info" cargo -V rustc -V echo "::endgroup::" # # To ensure that files are cleaned up, we don't want to exit on error set +e cd "${WORKSPACE}" unset FAULT # openbsd is very slow. Omit duplicated cargo build and do test only export PATH=~/.cargo/bin:${PATH} export RUST_BACKTRACE=1 export CARGO_TERM_COLOR=always # Avoid filling disk space export RUSTFLAGS="-C strip=symbols" # Use cargo test since nextest might not support OpenBSD if (test -z "\$FAULT"); then echo "::group::cargo test (workspace)" cargo test --features '${{ matrix.job.features }}' || FAULT=1 echo "::endgroup::" fi # There is no systemd-logind on OpenBSD, so test all features except feat_systemd_logind if (test -z "\$FAULT"); then echo "::group::cargo test (uucore)" UUCORE_FEATURES=\$(cargo metadata --format-version=1 --no-deps | jq -r '.packages[] | select(.name == "uucore") | .features | keys | .[]' | grep -v "feat_systemd_logind" | paste -s -d "," -) cargo test --features "\$UUCORE_FEATURES" -p uucore || FAULT=1 echo "::endgroup::" fi # Test building with make if (test -z "\$FAULT"); then echo "::group::make MULTICALL=Y" make MULTICALL=Y || FAULT=1 echo "::endgroup::" fi # Clean to avoid to rsync back the files and free up disk space cargo clean # Additional cleanup to free disk space if (test -n "\$FAULT"); then exit 1 ; fi EOF