-
Notifications
You must be signed in to change notification settings - Fork 16
386 lines (332 loc) · 14 KB
/
Copy pathwindows.yml
File metadata and controls
386 lines (332 loc) · 14 KB
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
name: Windows
on:
push:
paths-ignore:
- 'doc/**'
- '**/man/*'
- '**.md'
- '**.rdoc'
- '**/.document'
- '.*.yml'
pull_request:
# Do not use paths-ignore for required status checks
# https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks
merge_group:
concurrency:
group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }}
cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }}
permissions:
contents: read
jobs:
make:
continue-on-error: ${{ matrix.os == '11-arm' }}
strategy:
matrix:
include:
- os: 2022
test_task: check
- os: 2022
test_task: test-bundled-gems
- os: 2025-vs2026
test_task: check
- os: 2025-vs2026
test_task: test-bundled-gems
- os: 2025-vs2026
test_task: check
target: x86
- os: 11-arm
test_task: check
target: arm64
fail-fast: false
runs-on: windows-${{ matrix.os }}
if: >-
${{!(false
|| contains(github.event.head_commit.message, '[DOC]')
|| contains(github.event.pull_request.title, '[DOC]')
|| contains(github.event.pull_request.labels.*.name, 'Documentation')
|| (github.event.pull_request.user.login == 'dependabot[bot]' && !startsWith(github.head_ref, 'dependabot/vcpkg'))
)}}
name: Windows ${{ matrix.os }}${{ case(matrix.target == 'x86', ' x86', '') }} (${{ matrix.test_task }})
permissions:
contents: read
packages: write
env:
GITPULLOPTIONS: --no-tags origin ${{ github.ref }}
VCPKG_DEFAULT_TRIPLET: ${{ matrix.target || 'x64' }}-windows
FEED_URL: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
NoDefaultCurrentDirectoryInExePath: 1
steps:
- run: md build
working-directory:
- uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0
with:
# windows-11-arm has only 3.4.1, 3.4.2, 3.4.3, head
ruby-version: ${{ !endsWith(matrix.os, 'arm') && '3.1' || '3.4' }}
bundler: none
windows-toolchain: none
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
sparse-checkout-cone-mode: false
sparse-checkout: /.github
- uses: ./.github/actions/setup/directories
with:
srcdir: src
builddir: build
make-command: nmake
clean: true
bundled-gems-src-cache: ${{ matrix.test_task == 'test-bundled-gems' }}
- name: Install tools with scoop
run: |
if ((vcpkg.exe help install) -match "manifest") { exit }
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
iwr -useb get.scoop.sh | iex
Join-Path (Resolve-Path ~).Path "scoop\shims" >> $Env:GITHUB_PATH
scoop install vcpkg
shell: pwsh
- name: Set up vcpkg binary cache
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FEED_OWNER: ${{ github.repository_owner }}
# The GITHUB_TOKEN of pull_request events (forks, dependabot) is
# read-only; packages are uploaded on push and merge_group only.
FEED_MODE: ${{ github.event_name != 'pull_request' && 'readwrite' || 'read' }}
run: |
$nuget = (vcpkg fetch nuget) | Select-Object -Last 1
& $nuget sources add -Source $Env:FEED_URL -StorePasswordInClearText `
-Name GitHubPackages -UserName $Env:FEED_OWNER -Password $Env:GH_TOKEN
& $nuget setapikey $Env:GH_TOKEN -Source $Env:FEED_URL
"VCPKG_BINARY_SOURCES=clear;nuget,$Env:FEED_URL,$Env:FEED_MODE" >> $Env:GITHUB_ENV
- name: Install libraries with vcpkg
# The registry pinned by `builtin-baseline` can need a newer tool
# than the vcpkg.exe shipped in the runner image, so re-bootstrap
# it to the version the pulled registry asks for.
run: |
git -C "%VCPKG_INSTALLATION_ROOT%" pull --quiet
call "%VCPKG_INSTALLATION_ROOT%\bootstrap-vcpkg.bat"
vcpkg install
working-directory: src
- name: setup env
# Available Ruby versions: https://github.com/actions/runner-images/blob/main/images/windows/Windows2019-Readme.md#ruby
# %TEMP% is inconsistent with %TMP% and test-all expects they are consistent.
# https://github.com/actions/virtual-environments/issues/712#issuecomment-613004302
run: |
set > old.env
call ..\src\win32\vssetup.cmd ^
-arch=${{ matrix.target || 'amd64' }} ^
${{ matrix.vcvars && '-vcvars_ver=' || '' }}${{ matrix.vcvars }}
nmake -f nul
set TMP=%RUNNER_TEMP%
set TEMP=%RUNNER_TEMP%
set MAKEFLAGS=l
set /a TEST_JOBS=(15 * %NUMBER_OF_PROCESSORS% / 10) > nul
set RUBY_OPT_DIR=%GITHUB_WORKSPACE:\=/%/src/vcpkg_installed/%VCPKG_DEFAULT_TRIPLET%
set > new.env
- name: update env
shell: pwsh
run: |
$old = (Get-Content old.env); $new = (Get-Content new.env)
del *.env
Compare-Object $old $new |
Where-Object { $_.SideIndicator -eq '=>' } |
Select-Object -ExpandProperty InputObject |
Add-Content -Path $env:GITHUB_ENV
- name: baseruby version
run: ruby -v
- name: compiler version
run: cl
- name: volume info
run: Get-Volume
shell: pwsh
# TODO: We should use `../src` instead of `D:/a/ruby/ruby/src`
- name: Configure
run: >-
../src/win32/configure.bat --disable-install-doc
--with-opt-dir=%RUBY_OPT_DIR%
--with-gmp
--enable-debug-env
- run: nmake prepare-vcpkg
- run: nmake incs
- run: nmake extract-extlibs
# On all other platforms, test-spec depending on extract-gems (in common.mk) is enough.
# But not for this Visual Studio workflow. So here we extract gems before building.
- run: nmake extract-gems
# windows-11-arm runner cannot run `ruby tool/file2lastrev.rb --revision.h --output=revision.h`
- name: make revision.h
run: |
win32\lastrev.bat | win32\ifchange.bat --timestamp=.revision.time revision.h -
type revision.h
working-directory: src
- run: nmake
- name: Set up Launchable
uses: ./.github/actions/launchable/setup
with:
os: windows-${{ matrix.os }}${{ case(matrix.target == 'x86', '-x86', '') }}
launchable-token: ${{ secrets.LAUNCHABLE_TOKEN }}
builddir: build
srcdir: src
test-task: ${{ matrix.test_task || 'check' }}
continue-on-error: true
if: ${{ matrix.test_task != 'test-bundled-gems' }}
timeout-minutes: 3
# Minidumps only, as a full dump would carry the environment with
# LAUNCHABLE_TOKEN into the artifact.
- name: Set up crash dumps
run: |
md "%GITHUB_WORKSPACE%\crashdumps"
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "%GITHUB_WORKSPACE%\crashdumps" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 1 /f
- run: nmake ${{ matrix.test_task || 'check' }}
env:
RUBY_TESTOPTS: -j${{ env.TEST_JOBS || 4 }}
RUBY_DEBUG: wer
timeout-minutes: 70
- run: nmake binary-package
if: ${{ matrix.test_task == 'check' }}
timeout-minutes: 10
- name: Verify binary package
shell: pwsh
if: ${{ matrix.test_task == 'check' }}
run: |
$zip = Get-Item ruby-*-mswin*.zip
$dest = Join-Path $env:RUNNER_TEMP "binpkg"
if (Test-Path $dest) { Remove-Item -Recurse -Force $dest }
New-Item -ItemType Directory $dest | Out-Null
& "$env:SystemRoot\System32\tar.exe" -x -f $zip.FullName -C $dest
if ((Get-ChildItem $dest).Count -ne 1) { throw "zip must contain a single root directory" }
$root = (Get-ChildItem $dest)[0].FullName
if (!(Test-Path "$root\bin\ruby.exe")) { throw "bin\ruby.exe not found" }
if (Get-ChildItem "$root\bin" | Where-Object Name -match '^vcruntime140(_\w+)?\.dll$') { throw "the VC runtime must not be bundled" }
if (!(Get-ChildItem "$root\LICENSES" -ErrorAction SilentlyContinue)) { throw "LICENSES missing" }
$env:PATH = "$env:SystemRoot\System32"
& "$root\bin\ruby.exe" -v -ropenssl -rfiddle -rpsych -rzlib -e 'abort "configure_args has an absolute path: #{RbConfig::CONFIG[%q(configure_args)]}" if RbConfig::CONFIG[%q(configure_args)] =~ /\b[A-Za-z]:[\/\\]/; puts %q(binary package OK)'
if ($LASTEXITCODE -ne 0) { throw "smoke test failed" }
timeout-minutes: 5
- name: Upload crash dumps
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: crashdumps-${{ matrix.os }}${{ case(matrix.target == 'x86', '-x86', '') }}-${{ matrix.test_task }}
path: |
crashdumps
build/*.exe
build/*.dll
build/**/*.pdb
!build/**/vc*.pdb
build/.ext/**/*.so
src/vcpkg_installed/*/bin
include-hidden-files: true
retention-days: 7
overwrite: true
if: ${{ always() && hashFiles('crashdumps/**') != '' }}
- uses: ./.github/actions/slack
with:
label: Windows ${{ matrix.os }}${{ case(matrix.target == 'x86', ' x86', '') }} / ${{ matrix.test_task || 'check' }}
SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot
if: ${{ failure() }}
# Check that ruby can still be built with the older supported MSVC
# toolsets. The runner images no longer preinstall VS 2017/2019, so
# install the v141/v142 toolset into the preinstalled VS 2022 and
# select it with -vcvars_ver. This only builds up to ruby.exe;
# extensions and tests are not covered.
make-old-toolset:
strategy:
matrix:
include:
- vs: 2017
toolset: '14.16'
component: Microsoft.VisualStudio.Component.VC.v141.x86.x64
clver: '19.16'
- vs: 2019
toolset: '14.29'
component: Microsoft.VisualStudio.ComponentGroup.VC.Tools.142.x86.x64
clver: '19.29'
fail-fast: false
runs-on: windows-2022
if: >-
${{!(false
|| contains(github.event.head_commit.message, '[DOC]')
|| contains(github.event.pull_request.title, '[DOC]')
|| contains(github.event.pull_request.labels.*.name, 'Documentation')
|| github.event.pull_request.user.login == 'dependabot[bot]'
)}}
name: Windows 2022 (VS${{ matrix.vs }} toolset)
env:
GITPULLOPTIONS: --no-tags origin ${{ github.ref }}
steps:
- run: md build
working-directory:
- uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0
with:
ruby-version: '3.1'
bundler: none
windows-toolchain: none
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
sparse-checkout-cone-mode: false
sparse-checkout: /.github
- uses: ./.github/actions/setup/directories
with:
srcdir: src
builddir: build
make-command: nmake
clean: true
- name: Install MSVC v${{ matrix.toolset }} toolset
shell: pwsh
run: |
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$installPath = & $vswhere -products '*' -latest -property installationPath
$setup = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe"
$arguments = @('modify', '--installPath', "`"$installPath`"",
'--add', '${{ matrix.component }}',
'--quiet', '--norestart', '--nocache')
$proc = Start-Process -FilePath $setup -ArgumentList $arguments -Wait -PassThru
if ($proc.ExitCode -notin 0, 3010) { throw "VS installer exited with $($proc.ExitCode)" }
timeout-minutes: 20
- name: setup env
run: |
set > old.env
call ..\src\win32\vssetup.cmd -arch=amd64 -vcvars_ver=${{ matrix.toolset }}
nmake -f nul
set TMP=%RUNNER_TEMP%
set TEMP=%RUNNER_TEMP%
set MAKEFLAGS=l
set > new.env
- name: update env
shell: pwsh
run: |
$old = (Get-Content old.env); $new = (Get-Content new.env)
del *.env
Compare-Object $old $new |
Where-Object { $_.SideIndicator -eq '=>' } |
Select-Object -ExpandProperty InputObject |
Add-Content -Path $env:GITHUB_ENV
- name: baseruby version
run: ruby -v
- name: compiler version
run: cl 2>&1 | findstr /c:"Compiler Version ${{ matrix.clver }}"
- name: Configure
run: ../src/win32/configure.bat --disable-install-doc
- run: nmake ruby
timeout-minutes: 50
- name: ruby version
run: .\ruby.exe -v --disable-gems -e "puts :ok"
- uses: ./.github/actions/slack
with:
label: Windows 2022 / VS${{ matrix.vs }} toolset
SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot
if: ${{ failure() }}
result:
if: ${{ always() }}
name: ${{ github.workflow }} result
runs-on: windows-2025-vs2026
needs: [make, make-old-toolset]
steps:
- run: exit 1
working-directory:
if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
defaults:
run:
working-directory: build
shell: cmd