mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
242 lines
9.5 KiB
YAML
242 lines
9.5 KiB
YAML
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: <https://github.com/rust-lang/rustup/pull/2783>
|
|
# * 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: <https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message>
|
|
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: <https://github.com/rust-lang/rustup/pull/2783>
|
|
# * 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
|