-
Notifications
You must be signed in to change notification settings - Fork 4.1k
185 lines (161 loc) · 6.58 KB
/
msvc.yml
File metadata and controls
185 lines (161 loc) · 6.58 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
name: MSVC Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
build:
runs-on: windows-2025
permissions:
contents: read
packages: write
env:
THRIFT_BUILD_DIR: C:\thrift-build
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
- name: Ensure expected workspace path
shell: pwsh
run: |
if (-not (Test-Path 'C:\src')) { New-Item -Path 'C:\src' -ItemType Directory | Out-Null }
if (Test-Path 'C:\src\thrift') { Remove-Item 'C:\src\thrift' -Recurse -Force }
cmd /c mklink /J C:\src\thrift $env:GITHUB_WORKSPACE
- name: Configure build output directory
shell: pwsh
run: |
New-Item -Path $env:THRIFT_BUILD_DIR -ItemType Directory -Force | Out-Null
- name: Configure Docker credential store
shell: pwsh
run: |
$dockerConfig = Join-Path $env:RUNNER_TEMP 'docker-config'
New-Item -Path $dockerConfig -ItemType Directory -Force | Out-Null
if (-not (Get-Command 'docker-credential-wincred.exe' -ErrorAction SilentlyContinue)) {
Write-Error 'docker-credential-wincred.exe is not available on this runner'
exit 1
}
'{"credsStore":"wincred"}' | Out-File -FilePath (Join-Path $dockerConfig 'config.json') -Encoding ascii
"DOCKER_CONFIG=$dockerConfig" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Set Docker image name
shell: pwsh
env:
OWNER: ${{ github.repository_owner }}
run: |
$image = "ghcr.io/{0}/thrift-build" -f $env:OWNER.ToLower()
"DOCKER_IMAGE=$image" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Compute Docker image tag
shell: pwsh
run: |
$hash = (Get-FileHash -Algorithm SHA256 'build/docker/msvc/Dockerfile').Hash.ToLower().Substring(0, 12)
"IMAGE_TAG=msvc-$hash" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Log in to GHCR
if: github.event_name != 'pull_request'
shell: pwsh
env:
GHCR_USERNAME: ${{ github.actor }}
GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$env:GHCR_TOKEN | docker login ghcr.io --username $env:GHCR_USERNAME --password-stdin
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to log in to GHCR"
exit 1
}
- name: Pull cached image
id: pull_cached
continue-on-error: true
timeout-minutes: 40
shell: pwsh
run: |
$needBuild = $true
if ([string]::IsNullOrWhiteSpace($env:DOCKER_IMAGE) -or [string]::IsNullOrWhiteSpace($env:IMAGE_TAG)) {
Write-Error "DOCKER_IMAGE or IMAGE_TAG is empty. DOCKER_IMAGE='$env:DOCKER_IMAGE' IMAGE_TAG='$env:IMAGE_TAG'"
exit 1
}
Write-Host "Attempting to pull hash-based tag: $($env:DOCKER_IMAGE):$($env:IMAGE_TAG)"
$output = docker pull "$($env:DOCKER_IMAGE):$($env:IMAGE_TAG)" 2>&1
$output | Out-Host
if ($LASTEXITCODE -eq 0) {
Write-Host "Successfully pulled cached image with hash tag"
$needBuild = $false
} elseif ($output -match 'not found|does not exist|404|manifest unknown') {
Write-Host "Image not found in registry, will build from scratch."
$needBuild = $true
} else {
Write-Host "##[error]Docker pull failed with unexpected error. Check logs above."
Write-Host "This may indicate an authentication issue, registry problem, or network error."
exit 1
}
Write-Host "Setting outputs: need_build=$needBuild"
"need_build=$needBuild" >> $env:GITHUB_OUTPUT
- name: Build Docker image
if: steps.pull_cached.outputs.need_build == 'true'
timeout-minutes: 60
shell: pwsh
run: |
Write-Host "Building with tag: $($env:DOCKER_IMAGE):$($env:IMAGE_TAG)"
docker build -t "$($env:DOCKER_IMAGE):$($env:IMAGE_TAG)" -f build\docker\msvc\Dockerfile 'build\'
if ($LASTEXITCODE -ne 0) {
Write-Error "Docker build failed"
exit 1
}
Write-Host "Verifying tags were created:"
docker images "$($env:DOCKER_IMAGE)"
- name: Push Docker image
if: github.event_name != 'pull_request' && steps.pull_cached.outputs.need_build == 'true'
timeout-minutes: 20
shell: pwsh
run: |
Write-Host "Pushing hash-based tag only: $($env:DOCKER_IMAGE):$($env:IMAGE_TAG)"
docker push "$($env:DOCKER_IMAGE):$($env:IMAGE_TAG)"
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to push hash-based tag"
exit 1
}
Write-Host "Successfully pushed hash-tagged image"
- name: Build and test inside container
timeout-minutes: 120
shell: pwsh
run: |
docker run -v c:\src\thrift:C:\Thrift -v "${env:THRIFT_BUILD_DIR}:C:\build" --rm -t "$($env:DOCKER_IMAGE):$($env:IMAGE_TAG)" c:\thrift\build\docker\msvc\build.bat
if ($LASTEXITCODE -ne 0) {
Write-Error "Container build failed with exit code $LASTEXITCODE"
exit $LASTEXITCODE
}
- name: Check test results
if: always()
shell: pwsh
run: |
$logPath = Join-Path $env:THRIFT_BUILD_DIR 'Testing\Temporary\LastTest.log'
if (Test-Path $logPath) {
$content = Get-Content $logPath -Raw
if ($content -match 'Test Failed\.') {
Write-Error "Tests failed - check LastTest.log artifact for details"
exit 1
} else {
Write-Host "All tests passed"
}
} else {
Write-Error "LastTest.log not found at $logPath"
exit 1
}
- name: Upload LastTest log
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: msvc-LastTest-log
path: ${{ env.THRIFT_BUILD_DIR }}\Testing\Temporary\LastTest.log
if-no-files-found: warn
- name: Remove Docker credential store
if: always()
shell: pwsh
run: |
if (-not [string]::IsNullOrWhiteSpace($env:DOCKER_CONFIG) -and (Test-Path $env:DOCKER_CONFIG)) {
Remove-Item $env:DOCKER_CONFIG -Recurse -Force
}