forked from SerenityOS/serenity
-
Notifications
You must be signed in to change notification settings - Fork 0
209 lines (185 loc) Β· 8.33 KB
/
serenity-template.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
name: SerenityOS Template
on:
workflow_call:
inputs:
toolchain:
required: true
type: string
os:
required: true
type: string
arch:
required: true
type: string
debug_options:
required: false
type: string
default: 'NORMAL_DEBUG'
coverage:
required: false
type: string
default: 'OFF'
env:
# runner.workspace = /home/runner/work/serenity
# github.workspace = /home/runner/work/serenity/serenity
SERENITY_SOURCE_DIR: ${{ github.workspace }}
SERENITY_CCACHE_DIR: ${{ github.workspace }}/.ccache
TOOLCHAIN_CCACHE_DIR: ${{ github.workspace }}/Toolchain/.ccache
jobs:
CI:
runs-on: ${{ inputs.os }}
steps:
# Pull requests can trail behind `master` and can cause breakage if merging before running the CI checks on an updated branch.
# Luckily, GitHub creates and maintains a merge branch that is updated whenever the target or source branch is modified. By
# checking this branch out, we gain a stabler `master` at the cost of reproducibility.
- uses: actions/checkout@v4
if: ${{ github.event_name != 'pull_request' }}
- uses: actions/checkout@v4
if: ${{ github.event_name == 'pull_request' }}
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Set Up Environment
uses: ./.github/actions/setup
with:
os: 'Serenity'
arch: ${{ inputs.arch }}
# === PREPARE FOR BUILDING ===
- name: Lint
run: ${{ github.workspace }}/Meta/lint-ci.sh
- name: Restore Caches
uses: ./.github/actions/cache-restore
id: 'cache-restore'
with:
os: 'Serenity'
arch: ${{ inputs.arch }}
toolchain: ${{ inputs.toolchain }}
cache_key_extra: ${{ inputs.debug_options }}-COVERAGE_${{ inputs.coverage }}
serenity_ccache_path: ${{ env.SERENITY_CCACHE_DIR }}
toolchain_ccache_path: ${{ env.TOOLCHAIN_CCACHE_DIR }}
download_cache_path: ${{ github.workspace }}/Build/caches
- name: Assign Build Parameters
id: 'build-parameters'
run: |
if ${{ inputs.toolchain == 'Clang' }} ; then
echo "build_directory=${{ github.workspace }}/Build/${{ inputs.arch }}clang" >> "$GITHUB_OUTPUT"
elif ${{ inputs.toolchain == 'GNU' }} ; then
echo "build_directory=${{ github.workspace }}/Build/${{ inputs.arch }}" >> "$GITHUB_OUTPUT"
fi
- name: Build Toolchain
if: ${{ !steps.cache-restore.outputs.toolchain_prebuilt_hit }}
run: |
${{ github.workspace }}/Toolchain/Build${{ inputs.toolchain }}.sh --ci
env:
ARCH: ${{ inputs.arch}}
CCACHE_DIR: ${{ env.TOOLCHAIN_CCACHE_DIR }}
- name: Build AArch64 Qemu
if: ${{ inputs.arch == 'aarch64' && !steps.cache-restore.outputs.qemu_cache_hit }}
run: ${{ github.workspace }}/Toolchain/BuildQemu.sh
env:
CCACHE_DIR: ${{ env.TOOLCHAIN_CCACHE_DIR }}
- name: Create Build Environment
if: ${{ inputs.debug_options == 'ALL_DEBUG' }}
# Build the entire project with all available debug options turned on, to prevent code rot.
# However, it is unwieldy and slow to run tests with them enabled, so we will build twice.
run: |
cmake -S Meta/CMake/Superbuild -B Build/superbuild -GNinja \
-DSERENITY_ARCH=${{ inputs.arch }} \
-DSERENITY_TOOLCHAIN=${{ inputs.toolchain }} \
-DBUILD_LAGOM=ON \
-DCMAKE_C_COMPILER=gcc-13 \
-DCMAKE_CXX_COMPILER=g++-13 \
-DENABLE_ALL_DEBUG_FACILITIES=ON \
-DENABLE_PCI_IDS_DOWNLOAD=OFF \
-DENABLE_USB_IDS_DOWNLOAD=OFF
env:
CCACHE_DIR: ${{ env.SERENITY_CCACHE_DIR }}
- name: Create Build Environment
if: ${{ inputs.debug_options == 'NORMAL_DEBUG' }}
working-directory: ${{ github.workspace }}
# Note that we do not set BUILD_LAGOM for the normal debug build
# We build and run the Lagom tests in a separate job, and sanitizer builds take a good while longer than non-sanitized.
run: |
cmake -S Meta/CMake/Superbuild -B Build/superbuild -GNinja \
-DSERENITY_ARCH=${{ inputs.arch }} \
-DSERENITY_TOOLCHAIN=${{ inputs.toolchain }} \
-DCMAKE_C_COMPILER=gcc-13 \
-DCMAKE_CXX_COMPILER=g++-13 \
-DENABLE_UNDEFINED_SANITIZER=ON \
-DUNDEFINED_BEHAVIOR_IS_FATAL=ON \
-DENABLE_USERSPACE_COVERAGE_COLLECTION=${{ inputs.coverage }} \
-DDUMP_REGIONS_ON_CRASH=ON \
-DENABLE_PCI_IDS_DOWNLOAD=OFF \
-DENABLE_USB_IDS_DOWNLOAD=OFF
env:
CCACHE_DIR: ${{ env.SERENITY_CCACHE_DIR }}
# === BUILD ===
- name: Build Serenity and Tests
working-directory: ${{ github.workspace }}/Build/superbuild
run: cmake --build .
env:
CCACHE_DIR: ${{ env.SERENITY_CCACHE_DIR }}
- name: Save Caches
uses: ./.github/actions/cache-save
with:
arch: ${{ inputs.arch }}
qemu_cache_primary_key: ${{ steps.cache-restore.outputs.qemu_cache_primary_key }}
qemu_cache_hit: ${{ steps.cache-restore.outputs.qemu_cache_hit }}
serenity_ccache_path: ${{ env.SERENITY_CCACHE_DIR }}
serenity_ccache_primary_key: ${{ steps.cache-restore.outputs.serenity_ccache_primary_key }}
toolchain_ccache_path: ${{ env.TOOLCHAIN_CCACHE_DIR }}
toolchain_ccache_primary_key: ${{ steps.cache-restore.outputs.toolchain_ccache_primary_key }}
toolchain_prebuilt_path: ${{ steps.cache-restore.outputs.toolchain_prebuilt_path }}
toolchain_prebuilt_primary_key: ${{ steps.cache-restore.outputs.toolchain_prebuilt_primary_key }}
toolchain_prebuilt_hit: ${{ steps.cache-restore.outputs.toolchain_prebuilt_hit }}
# === TEST ===
- name: Create Serenity Rootfs
if: ${{ inputs.debug_options == 'NORMAL_DEBUG' }}
working-directory: ${{ steps.build-parameters.outputs.build_directory }}
run: ninja install && ninja qemu-image
- name: Run On-Target Tests
if: ${{ inputs.debug_options == 'NORMAL_DEBUG' && inputs.arch != 'aarch64' }}
working-directory: ${{ steps.build-parameters.outputs.build_directory }}
env:
SERENITY_QEMU_CPU: "max,vmx=off"
SERENITY_KERNEL_CMDLINE: "graphics_subsystem_mode=off panic=shutdown system_mode=self-test"
SERENITY_RUN: "ci"
run: |
echo "::group::ninja run # Qemu output"
ninja run
echo "::endgroup::"
echo "::group::Verify Output File"
mkdir fsmount
sudo mount -t ext2 -o loop,rw _disk_image fsmount
echo "Results: "
sudo cat fsmount/home/anon/test-results.log
if ! sudo grep -q "Failed: 0" fsmount/home/anon/test-results.log
then
echo "::error:: :^( Tests failed, failing job"
exit 1
fi
echo "::endgroup::"
timeout-minutes: 60
- name: Print Target Logs
# Extremely useful if Serenity hangs trying to run one of the tests
if: ${{ !cancelled() && inputs.debug_options == 'NORMAL_DEBUG'}}
working-directory: ${{ steps.build-parameters.outputs.build_directory }}
run: '[ ! -e debug.log ] || cat debug.log'
# === COVERAGE ===
- name: Aggregate Coverage Results
if: ${{ inputs.coverage == 'ON' }}
working-directory: ${{ github.workspace }}
run: ./Meta/analyze-qemu-coverage.sh
env:
SERENITY_TOOLCHAIN: ${{ matrix.toolchain }}
SERENITY_ARCH: ${{ matrix.arch }}
# FIXME: Deploy the static html pages somewhere
# FIXME: Alter script to also (instead?) produce a raw coverage.txt file for ingestion into sonar cloud
# Note: tmp_profile_data/Coverage.profdata has the entire combined profile data, but creating the raw txt requires
# all of the instrumented binaries and the profdata file.
- name: Upload Coverage Results
if: ${{ inputs.coverage == 'ON' }}
uses: actions/upload-artifact@v4
with:
name: serenity-coverage
path: ${{ steps.build-parameters.outputs.build_directory }}/reports
retention-days: 90