1name: C/C++ CI self-hosted
2
3on:
4  push:
5    paths: [ '**.c', '**.h', '**.m4', '**.sh', '.github/**', '**/Makefile.in', 'configure.ac' ]
6
7jobs:
8  selfhosted:
9    if: github.repository == 'openssh/openssh-portable-selfhosted'
10    runs-on: ${{ matrix.host }}
11    timeout-minutes: 600
12    env:
13      HOST: ${{ matrix.host }}
14      TARGET_HOST: ${{ matrix.target }}
15      TARGET_CONFIG: ${{ matrix.config }}
16    strategy:
17      fail-fast: false
18      # We use a matrix in two parts: firstly all of the VMs are tested with the
19      # default config.  "target" corresponds to a label associated with the
20      # worker.  The default is an ephemeral VM running under libvirt.
21      matrix:
22        target:
23          - alpine
24          - centos7
25          - debian-i386
26          - dfly30
27          - dfly48
28          - dfly60
29          - dfly62
30          - dfly64
31          - fbsd10
32          - fbsd12
33          - fbsd13
34          - fbsd14
35          - minix3
36          - nbsd3
37          - nbsd4
38          - nbsd8
39          - nbsd9
40          - obsd51
41          - obsd67
42          - obsd72
43          - obsd73
44          - obsd74
45          - obsdsnap
46          - obsdsnap-i386
47          - openindiana
48          - ubuntu-2204
49        config:
50          - default
51        host:
52          - libvirt
53        include:
54          # Long-running/slow tests have access to high priority runners.
55          - { target: aix51, config: default, host: libvirt-hipri }
56          - { target: openindiana, config: pam, host: libvirt-hipri }
57          - { target: sol10,  config: default, host: libvirt-hipri }
58          - { target: sol10,  config: pam, host: libvirt-hipri }
59          - { target: sol11,  config: default, host: libvirt-hipri }
60          - { target: sol11,  config: pam-krb5, host: libvirt-hipri }
61          - { target: sol11,  config: sol64, host: libvirt-hipri }
62          # Then we include extra libvirt test configs.
63          - { target: centos7, config: pam, host: libvirt }
64          - { target: debian-i386, config: pam, host: libvirt }
65          - { target: dfly30, config: without-openssl, host: libvirt}
66          - { target: dfly48, config: pam ,host: libvirt }
67          - { target: dfly58, config: pam, host: libvirt }
68          - { target: dfly60, config: pam, host: libvirt }
69          - { target: dfly62, config: pam, host: libvirt }
70          - { target: fbsd10, config: pam, host: libvirt }
71          - { target: fbsd12, config: pam, host: libvirt }
72          - { target: fbsd13, config: pam, host: libvirt }
73          - { target: fbsd14, config: pam, host: libvirt }
74          - { target: nbsd8,  config: pam, host: libvirt }
75          - { target: nbsd9,  config: pam, host: libvirt }
76          # VMs with persistent disks that have their own runner.
77          - { target: win10, config: default, host: win10 }
78          - { target: win10, config: cygwin-release, host: win10 }
79          # Physical hosts, with either native runners or remote via ssh.
80          - { target: ARM, config: default, host: ARM }
81          - { target: ARM64, config: default, host: ARM64 }
82          - { target: ARM64, config: pam, host: ARM64 }
83          - { target: debian-riscv64, config: default, host: debian-riscv64 }
84          - { target: obsd-arm64, config: default, host: obsd-arm64 }
85          - { target: openwrt-mips, config: default, host: openwrt-mips }
86          - { target: openwrt-mipsel, config: default, host: openwrt-mipsel }
87    steps:
88    - name: shutdown VM if running
89      run: vmshutdown
90      working-directory: ${{ runner.temp }}
91    - uses: actions/checkout@main
92    - name: autoreconf
93      run: autoreconf
94    - name: startup VM
95      run: vmstartup
96      working-directory: ${{ runner.temp }}
97    - name: configure
98      run: vmrun ./.github/configure.sh ${{ matrix.config }}
99    - name: save config
100      uses: actions/upload-artifact@main
101      with:
102        name: ${{ matrix.target }}-${{ matrix.config }}-config
103        path: config.h
104    - name: make clean
105      run: vmrun make clean
106    - name: make
107      run: vmrun make
108    - name: make tests
109      run: vmrun ./.github/run_test.sh ${{ matrix.config }}
110      timeout-minutes: 600
111    - name: save logs
112      if: failure()
113      uses: actions/upload-artifact@main
114      with:
115        name: ${{ matrix.target }}-${{ matrix.config }}-logs
116        path: |
117          config.h
118          config.log
119          regress/*.log
120          regress/log/*
121          regress/valgrind-out/
122    - name: shutdown VM
123      if: always()
124      run: vmshutdown
125      working-directory: ${{ runner.temp }}
126