Skip to content

Commit 9310f7a

Browse files
committed
refactor: use Nuke.build pipeline
1 parent 43ce42d commit 9310f7a

24 files changed

+1042
-130
lines changed

.github/workflows/build.yml

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
tags: [ 'v[0-9]+.[0-9]+.[0-9]+*' ]
7+
8+
jobs:
9+
unit-tests:
10+
name: "Unit tests"
11+
strategy:
12+
matrix:
13+
os: [ ubuntu-latest, windows-latest, macos-latest ]
14+
runs-on: ${{ matrix.os }}
15+
steps:
16+
- uses: actions/checkout@v4
17+
with:
18+
fetch-depth: 0
19+
- name: Setup .NET SDKs
20+
uses: actions/setup-dotnet@v4
21+
with:
22+
dotnet-version: |
23+
8.0.x
24+
- name: Run unit tests (windows)
25+
if: matrix.os == 'windows-latest'
26+
run: ./build.ps1 CodeCoverage
27+
- name: Run unit tests (ubuntu|macos)
28+
if: matrix.os != 'windows-latest'
29+
run: ./build.sh CodeCoverage
30+
- name: Upload artifacts
31+
if: always()
32+
uses: actions/upload-artifact@v4
33+
with:
34+
name: ${{ runner.os }}-artifacts
35+
path: |
36+
./Artifacts/*
37+
./TestResults/*.trx
38+
39+
static-code-analysis:
40+
name: "Static code analysis"
41+
runs-on: ubuntu-latest
42+
env:
43+
REPORTGENERATOR_LICENSE: ${{ secrets.REPORTGENERATOR_LICENSE }}
44+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
45+
DOTNET_NOLOGO: true
46+
steps:
47+
- uses: actions/checkout@v4
48+
with:
49+
fetch-depth: 0
50+
- name: Setup .NET SDKs
51+
uses: actions/setup-dotnet@v4
52+
with:
53+
dotnet-version: |
54+
8.0.x
55+
- name: Run sonarcloud analysis
56+
run: ./build.sh CodeAnalysis
57+
58+
publish-test-results:
59+
name: "Publish Tests Results"
60+
needs: [ unit-tests ]
61+
runs-on: ubuntu-latest
62+
permissions:
63+
checks: write
64+
pull-requests: write
65+
if: always()
66+
steps:
67+
- name: Download Artifacts
68+
uses: actions/download-artifact@v4
69+
with:
70+
path: artifacts
71+
- name: Publish Test Results
72+
uses: EnricoMi/publish-unit-test-result-action@v2
73+
with:
74+
comment_mode: always
75+
files: "artifacts/**/**/*.trx"
76+
77+
pack:
78+
name: "Pack"
79+
runs-on: ubuntu-latest
80+
needs: [ publish-test-results, static-code-analysis ]
81+
env:
82+
DOTNET_NOLOGO: true
83+
steps:
84+
- uses: actions/checkout@v4
85+
with:
86+
fetch-depth: 0
87+
- name: Setup .NET SDKs
88+
uses: actions/setup-dotnet@v4
89+
with:
90+
dotnet-version: |
91+
8.0.x
92+
- name: Pack nuget packages
93+
run: ./build.sh Pack
94+
- name: Upload packages
95+
if: always()
96+
uses: actions/upload-artifact@v4
97+
with:
98+
path: Artifacts/Packages
99+
name: Packages
100+
101+
push:
102+
name: "Push"
103+
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
104+
runs-on: macos-latest
105+
environment: production
106+
needs: [ pack ]
107+
permissions:
108+
contents: write
109+
steps:
110+
- name: Download packages
111+
uses: actions/download-artifact@v4
112+
with:
113+
name: Packages
114+
path: Artifacts/Packages
115+
- name: Publish
116+
run: |
117+
echo "Found the following packages to push:"
118+
search_dir=Artifacts/Packages
119+
for entry in Artifacts/Packages/*.nupkg
120+
do
121+
echo "- $entry"
122+
done
123+
for entry in Artifacts/Packages/*.nupkg
124+
do
125+
nuget push $entry -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGET_API_KEY}} -SkipDuplicate
126+
done
127+
- name: Check pre-release
128+
id: check-pre-release
129+
run: |
130+
if [[ ${{ github.event.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
131+
echo "release=true" >> $GITHUB_OUTPUT
132+
fi
133+
- name: Create GitHub release
134+
if: steps.check-pre-release.outputs.release == 'true'
135+
continue-on-error: true
136+
uses: softprops/action-gh-release@v2
137+
with:
138+
name: ${{ steps.tag.outputs.release_version }}
139+
tag_name: ${{ steps.tag.outputs.release_version }}
140+
token: ${{ secrets.GITHUB_TOKEN }}
141+
generate_release_notes: true
142+
143+
finalize-release:
144+
name: "Finalize release"
145+
if: startsWith(github.ref, 'refs/tags/v')
146+
runs-on: ubuntu-latest
147+
needs: [ push ]
148+
permissions:
149+
contents: read
150+
issues: write
151+
pull-requests: write
152+
steps:
153+
- name: Check pre-release
154+
id: check-pre-release
155+
run: |
156+
if [[ ${{ github.event.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
157+
echo "release=true" >> $GITHUB_OUTPUT
158+
fi
159+
- name: Comment relevant issues and pull requests
160+
if: steps.check-pre-release.outputs.release == 'true'
161+
continue-on-error: true
162+
uses: apexskier/[email protected]
163+
with:
164+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
165+
comment-template: |
166+
This is addressed in release {release_link}.
167+
label-template: |
168+
state: released
169+
skip-label: |
170+
state: released

.github/workflows/ci.yml

Lines changed: 49 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,76 @@
1-
name: Continuous Integration
1+
name: CI
2+
23
on:
3-
push:
4-
branches: [main]
4+
workflow_dispatch:
55
pull_request:
6-
branches: [main]
6+
branches: [ main ]
7+
78
jobs:
8-
test:
9-
name: Test
9+
unit-tests:
10+
name: "Unit tests"
1011
strategy:
11-
fail-fast: false
1212
matrix:
13-
os: [ubuntu-latest, windows-latest, macos-latest]
13+
os: [ ubuntu-latest, windows-latest, macos-latest ]
1414
runs-on: ${{ matrix.os }}
1515
steps:
16-
- name: Checkout sources
17-
uses: actions/checkout@v4
16+
- uses: actions/checkout@v4
1817
with:
1918
fetch-depth: 0
20-
- name: Setup .NET
19+
- name: Setup .NET SDKs
2120
uses: actions/setup-dotnet@v4
2221
with:
2322
dotnet-version: |
24-
6.0.x
25-
7.0.x
2623
8.0.x
27-
9.0.x
28-
- name: Run tests
29-
run: dotnet test --filter FullyQualifiedName\!~TestableIO.System.IO.Abstractions.Api.Tests --collect:"XPlat Code Coverage" --logger "GitHubActions"
30-
- name: Upload coverage
24+
- name: Run unit tests (windows)
25+
if: matrix.os == 'windows-latest'
26+
run: ./build.ps1 CodeCoverage
27+
- name: Run unit tests (ubuntu|macos)
28+
if: matrix.os != 'windows-latest'
29+
run: ./build.sh CodeCoverage
30+
- name: Upload artifacts
31+
if: always()
3132
uses: actions/upload-artifact@v4
3233
with:
33-
name: Code coverage ${{ matrix.os }}
34-
path: "**/coverage.cobertura.xml"
35-
api-test:
36-
name: API Test
34+
name: ${{ runner.os }}-artifacts
35+
path: |
36+
./Artifacts/*
37+
./TestResults/*.trx
38+
39+
static-code-analysis:
40+
name: "Static code analysis"
41+
if: ${{ github.actor != 'dependabot[bot]' }}
3742
runs-on: ubuntu-latest
43+
env:
44+
REPORTGENERATOR_LICENSE: ${{ secrets.REPORTGENERATOR_LICENSE }}
45+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
46+
DOTNET_NOLOGO: true
3847
steps:
39-
- name: Checkout sources
40-
uses: actions/checkout@v4
48+
- uses: actions/checkout@v4
4149
with:
4250
fetch-depth: 0
43-
- name: Setup .NET
51+
- name: Setup .NET SDKs
4452
uses: actions/setup-dotnet@v4
4553
with:
4654
dotnet-version: |
47-
6.0.x
48-
7.0.x
4955
8.0.x
50-
9.0.x
51-
- name: Build solution
52-
run: dotnet build
53-
- name: Run tests
54-
run: dotnet test --filter FullyQualifiedName~TestableIO.System.IO.Abstractions.Api.Tests --logger "GitHubActions"
55-
coverage:
56-
name: Coverage
57-
needs: [test, api-test]
58-
runs-on: ubuntu-latest
59-
steps:
60-
- name: Checkout sources
61-
uses: actions/checkout@v4
62-
- name: Setup .NET
63-
uses: actions/setup-dotnet@v4
64-
- uses: actions/download-artifact@v4
65-
with:
66-
name: Code coverage ubuntu-latest
67-
path: coverage-ubuntu
68-
- uses: actions/download-artifact@v4
69-
with:
70-
name: Code coverage windows-latest
71-
path: coverage-windows
72-
- uses: actions/download-artifact@v4
73-
with:
74-
name: Code coverage macos-latest
75-
path: coverage-macos
76-
- name: Generate coverage report
77-
uses: danielpalme/[email protected]
78-
with:
79-
reports: "**/coverage.cobertura.xml"
80-
targetdir: "coverage-report"
81-
reporttypes: "Cobertura"
82-
- name: Publish coverage report to Codacy
83-
uses: codacy/codacy-coverage-reporter-action@master
84-
if: github.repository == 'TestableIO/System.IO.Abstractions' && github.event_name == 'push'
85-
with:
86-
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
87-
coverage-reports: coverage-report/Cobertura.xml
88-
pack:
89-
name: Pack
90-
needs: [test, api-test]
91-
runs-on: ubuntu-latest
92-
steps:
93-
- name: Checkout sources
94-
uses: actions/checkout@v4
95-
with:
96-
fetch-depth: 0
97-
- name: Setup .NET
98-
uses: actions/setup-dotnet@v4
99-
- name: Create packages
100-
run: dotnet pack --configuration Release --output ./packages
101-
- name: Upload a Build Artifact
102-
uses: actions/upload-artifact@v4
103-
with:
104-
name: NuGet packages
105-
path: packages/*.*
106-
deploy:
107-
name: Deploy
108-
if: |
109-
github.ref == 'refs/heads/main' &&
110-
github.event_name == 'push' &&
111-
(
112-
startsWith(github.event.head_commit.message, 'feat:') ||
113-
startsWith(github.event.head_commit.message, 'feat!:') ||
114-
startsWith(github.event.head_commit.message, 'fix:') ||
115-
startsWith(github.event.head_commit.message, 'fix!:') ||
116-
contains(github.event.head_commit.message, 'breaking change')
117-
)
118-
needs: [pack]
56+
- name: Run sonarcloud analysis
57+
run: ./build.sh CodeAnalysis
58+
59+
publish-test-results:
60+
name: "Publish Tests Results"
61+
needs: [ unit-tests ]
11962
runs-on: ubuntu-latest
63+
permissions:
64+
checks: write
65+
pull-requests: write
66+
if: always()
12067
steps:
121-
- name: Checkout sources
122-
uses: actions/checkout@v4
68+
- name: Download Artifacts
69+
uses: actions/download-artifact@v4
12370
with:
124-
fetch-depth: 0
125-
- name: Setup .NET
126-
uses: actions/setup-dotnet@v4
127-
- uses: actions/download-artifact@v4
128-
with:
129-
name: NuGet packages
130-
path: packages
131-
- name: Push packages
132-
run: dotnet nuget push "packages/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
133-
- uses: dotnet/[email protected]
134-
id: nbgv
135-
- name: Create GitHub release
136-
uses: softprops/action-gh-release@v2
71+
path: artifacts
72+
- name: Publish Test Results
73+
uses: EnricoMi/publish-unit-test-result-action@v2
13774
with:
138-
name: v${{ steps.nbgv.outputs.SemVer2 }}
139-
tag_name: v${{ steps.nbgv.outputs.SemVer2 }}
140-
token: ${{ secrets.GITHUB_TOKEN }}
141-
generate_release_notes: true
142-
- name: Wait for GitHub release to be available
143-
run: sleep 30s
144-
shell: bash
145-
- name: Comment on relevant PRs and issues
146-
uses: apexskier/[email protected]
147-
with:
148-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
149-
comment-template: |
150-
This is addressed in release {release_link}.
151-
label-template: |
152-
state: released
153-
75+
comment_mode: always
76+
files: "artifacts/**/**/*.trx"

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Artifact and test results directories
2+
/Artifacts
3+
/TestResults
4+
15
## Ignore Visual Studio temporary files, build results, and
26
## files generated by popular Visual Studio add-ons.
37

0 commit comments

Comments
 (0)