Files
openssh-portable/.github/workflows/selfhosted.yml
T
Darren Tucker c21c8fc319 Lazily unmount github workspace at end of workflow.
Sometimes when a test times out the workspace is still busy when we try
to unmount it, which leaves the runner unusable until it's cleaned up
manually. We try to unmount this in the first step, but that usually
doesn't work since it fails during setup before it starts our workflow.
Move it to the end and make it a lazy unmount so it hopefully works
eventually.
2025-03-11 19:25:44 +11:00

204 lines
7.8 KiB
YAML

name: C/C++ CI self-hosted
on:
push:
paths: [ '**.c', '**.h', '**.m4', '**.sh', '**/Makefile.in', 'configure.ac', '.github/configs', '.github/workflows/selfhosted.yml' ]
jobs:
selfhosted:
name: "${{ matrix.target }} ${{ matrix.config }}"
if: github.repository == 'openssh/openssh-portable-selfhosted'
runs-on: ${{ matrix.host }}
timeout-minutes: 600
env:
DEBUG_ACTIONS: false
HOST: ${{ matrix.host }}
TARGET_HOST: ${{ matrix.target }}
TARGET_CONFIG: ${{ matrix.config }}
TARGET_DOMAIN: ${{ startsWith(matrix.host, 'libvirt') && format('{0}-{1}-{2}', matrix.target, matrix.config, github.run_id) || matrix.target }}
EPHEMERAL: ${{ startsWith(matrix.host, 'libvirt') }}
PERSISTENT: ${{ startsWith(matrix.host, 'persist') }}
REMOTE: ${{ startsWith(matrix.host, 'remote') }}
VM: ${{ startsWith(matrix.host, 'libvirt') || startsWith(matrix.host, 'persist') }}
SSHFS: ${{ startsWith(matrix.host, 'libvirt') || startsWith(matrix.host, 'persist') || startsWith(matrix.host, 'remote') }}
BIGENDIAN: ${{ matrix.target == 'aix51' || matrix.target == 'fbsd14-ppc64' || matrix.target == 'openwrt-mips' }}
strategy:
fail-fast: false
# We use a matrix in two parts: firstly all of the VMs are tested with the
# default config. "target" corresponds to a label associated with the
# worker. The default is an ephemeral VM running under libvirt.
matrix:
target:
- alpine
- centos7
- debian-i386
- dfly30
- dfly48
- dfly60
- dfly62
- dfly64
- fbsd10
- fbsd12
- fbsd13
- fbsd14
- nbsd3
- nbsd4
- nbsd8
- nbsd9
- nbsd10
- obsd51
- obsd67
- obsd72
- obsd73
- obsd74
- obsdsnap
- obsdsnap-i386
- omnios
- openindiana
- ubuntu-2204
config:
- default
host:
- libvirt
include:
# Long-running/slow tests have access to high priority runners.
- { target: aix51, config: default, host: libvirt-hipri }
- { target: fbsd14-ppc64, config: default, host: libvirt-hipri }
- { target: openindiana, config: pam, host: libvirt-hipri }
- { target: sol10, config: default, host: libvirt-hipri }
- { target: sol10, config: pam, host: libvirt-hipri }
- { target: sol11, config: default, host: libvirt-hipri }
- { target: sol11, config: pam-krb5, host: libvirt-hipri }
- { target: sol11, config: sol64, host: libvirt-hipri }
# Then we include extra libvirt test configs.
- { target: centos7, config: pam, host: libvirt }
- { target: debian-i386, config: pam, host: libvirt }
- { target: dfly30, config: without-openssl, host: libvirt}
- { target: dfly48, config: pam ,host: libvirt }
- { target: dfly58, config: pam, host: libvirt }
- { target: dfly60, config: pam, host: libvirt }
- { target: dfly62, config: pam, host: libvirt }
- { target: dfly64, config: pam, host: libvirt }
- { target: fbsd10, config: pam, host: libvirt }
- { target: fbsd12, config: pam, host: libvirt }
- { target: fbsd13, config: pam, host: libvirt }
- { target: fbsd14, config: pam, host: libvirt }
- { target: nbsd8, config: pam, host: libvirt }
- { target: nbsd9, config: pam, host: libvirt }
- { target: nbsd10, config: pam, host: libvirt }
- { target: omnios, config: pam, host: libvirt }
# ARM64 VMs
- { target: obsd-arm64, config: default, host: libvirt-arm64 }
# VMs with persistent disks that have their own runner.
- { target: win10, config: default, host: persist-win10 }
- { target: win10, config: cygwin-release, host: persist-win10 }
# Physical hosts with native runners.
- { target: ARM, config: default, host: ARM }
- { target: ARM64, config: default, host: ARM64 }
- { target: ARM64, config: pam, host: ARM64 }
# Physical hosts with remote runners.
- { target: debian-riscv64, config: default, host: remote-debian-riscv64 }
- { target: openwrt-mips, config: default, host: remote-openwrt-mips }
- { target: openwrt-mipsel, config: default, host: remote-openwrt-mipsel }
steps:
- name: shutdown VM if running
if: env.VM == 'true'
run: vmshutdown
- uses: actions/checkout@main
- name: autoreconf
run: autoreconf
- name: startup VM
if: env.VM == 'true'
run: vmstartup
working-directory: ${{ runner.temp }}
- name: copy and mount workspace
if: env.SSHFS == 'true'
run: sshfs_mount
working-directory: ${{ runner.temp }}
- name: configure
run: vmrun ./.github/configure.sh ${{ matrix.config }}
# - name: save config
# uses: actions/upload-artifact@main
# with:
# name: ${{ matrix.target }}-${{ matrix.config }}-config
# path: config.h
- name: make clean
run: vmrun make clean
- name: make
run: vmrun make
- name: make tests
run: vmrun ./.github/run_test.sh ${{ matrix.config }}
timeout-minutes: 600
- name: save logs
if: failure()
uses: actions/upload-artifact@main
with:
name: ${{ matrix.target }}-${{ matrix.config }}-logs
path: |
config.h
config.log
regress/*.log
regress/log/*
regress/valgrind-out/
- name: unmount workspace
if: always() && env.SSHFS == 'true'
run: fusermount -u ${GITHUB_WORKSPACE} || true
working-directory: ${{ runner.temp }}
- name: bigendian interop - mount regress
if: env.SSHFS == 'true' && env.BIGENDIAN == 'true'
run: |
set -x
vmrun sudo chown -R $LOGNAME ~/$(basename ${GITHUB_WORKSPACE}) || true
vmrun "cd $(basename ${GITHUB_WORKSPACE}/regress) && sudo make clean"
sshfs_mount regress
vmrun "sudo mkdir -p $(dirname ${GITHUB_WORKSPACE})"
vmrun "sudo ln -s ~/$(basename ${GITHUB_WORKSPACE}) ${GITHUB_WORKSPACE}"
working-directory: ${{ runner.temp }}
- name: bigendian interop - host build
if: env.SSHFS == 'true' && env.BIGENDIAN == 'true'
run: |
set -x
./.github/configure.sh ${{ matrix.config }}
pwd
ls -ld regress || true
ls -l regress/check-perm || true
make clean
make
- name: bigendian interop - test
if: env.SSHFS == 'true' && env.BIGENDIAN == 'true'
env:
TEST_SSH_UNSAFE_PERMISSIONS: 1
run: |
set -x
echo "#!/bin/sh" >remote_sshd
echo "exec /usr/bin/ssh ${TARGET_DOMAIN} exec /home/builder/$(basename ${GITHUB_WORKSPACE})/sshd "'$@' >>remote_sshd
chmod 755 remote_sshd
make t-exec TEST_SSH_SSHD=`pwd`/remote_sshd LTESTS="try-ciphers kextype keytype"
- name: bigendian interop - save logs
if: failure() && env.BIGENDIAN == 'true'
uses: actions/upload-artifact@main
with:
name: ${{ matrix.target }}-${{ matrix.config }}-interop-logs
path: |
config.h
config.log
regress/*.log
regress/log/*
- name: bigendian interop - unmount regress
if: always() && env.SSHFS == 'true' && env.BIGENDIAN == 'true'
run: fusermount -z -u ${GITHUB_WORKSPACE}/regress || true
working-directory: ${{ runner.temp }}
- name: lazily unmount workspace
if: always() && env.SSHFS == 'true'
run: fusermount -z -u ${GITHUB_WORKSPACE} || true
working-directory: ${{ runner.temp }}
- name: shutdown VM
if: always() && env.VM == 'true'
run: vmshutdown