-
Notifications
You must be signed in to change notification settings - Fork 4.1k
134 lines (117 loc) · 4.49 KB
/
msvc.yml
File metadata and controls
134 lines (117 loc) · 4.49 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
name: MSVC Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
permissions:
contents: read
packages: write
jobs:
build:
runs-on: windows-2025
env:
THRIFT_BUILD_DIR: C:\thrift-build
steps:
- name: Checkout
uses: actions/checkout@v6
- 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: 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
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull cached image
id: pull_cached
continue-on-error: true
shell: pwsh
run: |
$needBuild = $true
Write-Host "Attempting to pull hash-based tag: $($env:DOCKER_IMAGE):$($env:IMAGE_TAG)"
docker pull "$($env:DOCKER_IMAGE):$($env:IMAGE_TAG)" 2>&1 | Out-Host
if ($LASTEXITCODE -eq 0) {
Write-Host "Successfully pulled cached image with hash tag"
$needBuild = $false
} else {
Write-Host "Hash tag not found, no fallback configured. Will build from scratch."
$needBuild = $true
}
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'
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'
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
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@v7
with:
name: msvc-LastTest-log
path: ${{ env.THRIFT_BUILD_DIR }}\Testing\Temporary\LastTest.log
if-no-files-found: warn