-
Notifications
You must be signed in to change notification settings - Fork 8
159 lines (140 loc) · 5.52 KB
/
dotnet-test.yml
File metadata and controls
159 lines (140 loc) · 5.52 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
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: .NET Test Pull Requests
on:
pull_request:
branches: ["master", "main"]
workflow_dispatch:
inputs:
dotnet-version:
description: ".NET SDK version"
required: false
default: "10.0.x"
solution:
description: "Solution or project path to build/test"
required: false
default: "SQLHelper.sln"
test-filter:
description: "Optional dotnet test filter"
required: false
default: ""
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
timeout-minutes: 30
permissions:
contents: write
env:
BUILD_CONFIG: "Debug"
SOLUTION_FILE: "${{ inputs.solution || 'SQLHelper.sln' }}"
TEST_FILTER: "${{ inputs.test-filter || '' }}"
SQL_HOST: "127.0.0.1"
SQL_PORT: "1433"
SQLHELPER_SQL_SERVER: "127.0.0.1,1433"
SQLHELPER_SQL_PASSWORD: "${{ secrets.SQLHELPER_SQL_PASSWORD || 'YourStrong!Passw0rd' }}"
runs-on: ubuntu-latest
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
env:
ACCEPT_EULA: "Y"
MSSQL_PID: "Developer"
SA_PASSWORD: "${{ secrets.SQLHELPER_SQL_PASSWORD || 'YourStrong!Passw0rd' }}"
ports:
- 1433:1433
options: --pull always
strategy:
matrix:
dotnet-version: ["${{ inputs.dotnet-version || '10.0.x' }}"]
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: Setup .NET SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v5.2.0
with:
dotnet-version: ${{ matrix.dotnet-version }}
- name: Wait for SQL Server
shell: bash
run: |
for i in {1..60}; do
if timeout 1 bash -c "</dev/tcp/$SQL_HOST/$SQL_PORT" 2>/dev/null; then
echo "SQL Server port is reachable."
exit 0
fi
echo "Waiting for SQL Server... attempt $i"
sleep 2
done
echo "SQL Server did not become reachable in time."
exit 1
- name: Debug SQL Server service state
shell: bash
run: |
echo "Service container id: ${{ job.services.sqlserver.id }}"
docker ps -a
docker inspect "${{ job.services.sqlserver.id }}" --format 'Status={{.State.Status}} Health={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}} StartedAt={{.State.StartedAt}}'
if [ -n "$SQLHELPER_SQL_PASSWORD" ]; then
echo "SQLHELPER_SQL_PASSWORD is set (value masked)."
echo "Password length: ${#SQLHELPER_SQL_PASSWORD}"
else
echo "SQLHELPER_SQL_PASSWORD is empty."
fi
- name: Wait for SQL login readiness
shell: bash
run: |
for i in {1..45}; do
if docker exec "${{ job.services.sqlserver.id }}" /opt/mssql-tools18/bin/sqlcmd \
-S localhost \
-U sa \
-P "$SQLHELPER_SQL_PASSWORD" \
-C \
-Q "SELECT 1" >/dev/null 2>&1; then
echo "SQL Server accepted sa login."
exit 0
fi
echo "Waiting for SQL login readiness... attempt $i"
if [ "$i" -eq 1 ] || [ $((i % 10)) -eq 0 ]; then
docker logs --tail 80 "${{ job.services.sqlserver.id }}" || true
fi
sleep 2
done
echo "SQL Server never accepted sa login. Dumping container logs."
docker logs "${{ job.services.sqlserver.id }}" || true
exit 1
- name: Create test databases
shell: bash
run: |
docker exec "${{ job.services.sqlserver.id }}" /opt/mssql-tools18/bin/sqlcmd \
-S localhost \
-U sa \
-P "$SQLHELPER_SQL_PASSWORD" \
-C \
-Q "IF DB_ID(N'TestDatabase') IS NULL CREATE DATABASE [TestDatabase]; IF DB_ID(N'TestDatabase2') IS NULL CREATE DATABASE [TestDatabase2]; IF DB_ID(N'MockDatabase') IS NULL CREATE DATABASE [MockDatabase]; IF DB_ID(N'MockDatabaseForMockMapping') IS NULL CREATE DATABASE [MockDatabaseForMockMapping];"
- name: Debug SQL logs on failure
if: ${{ failure() }}
shell: bash
run: |
echo "Dumping SQL Server container logs due to earlier failure."
docker logs "${{ job.services.sqlserver.id }}" || true
- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props', '**/packages.lock.json', 'global.json', '**/nuget.config', '**/NuGet.Config') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Restore dependencies
run: dotnet restore "$SOLUTION_FILE"
- name: Build
run: dotnet build "$SOLUTION_FILE" --no-restore --configuration $BUILD_CONFIG
- name: Test
run: dotnet test "$SOLUTION_FILE" /p:Configuration=$BUILD_CONFIG --no-build --verbosity normal --logger trx --results-directory "TestResults-${{ matrix.dotnet-version }}" $TEST_FILTER
- name: Upload test results
uses: actions/upload-artifact@v7
with:
name: dotnet-results-${{ matrix.dotnet-version }}
path: TestResults-${{ matrix.dotnet-version }}
if: ${{ always() }}