-
Notifications
You must be signed in to change notification settings - Fork 0
137 lines (118 loc) · 5.13 KB
/
nuget-ci-cd.yml
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
name: Build NuGet packages
on:
push:
branches: [ develop, main ]
tags:
- v*
pull_request:
branches: [ develop, main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# We use `git describe` to find tags in commit history, so we need complete repo history
fetch-depth: 0
- name: Find most recent tag
shell: bash
run: |
DESCRIBE=$(git describe --long --match "v*")
TAG=$(echo "$DESCRIBE" | grep -E -o '^v[0-9]+\.[0-9]+\.[0-9]+')
echo "DESCRIBE=$DESCRIBE" >> "$GITHUB_ENV"
echo "TAG=$TAG" >> "$GITHUB_ENV"
- name: Split version number from tag into major/minor/patch sections
shell: bash
run: |
MAJOR=$(echo "$TAG" | sed -E 's/^v([0-9]+)\.([0-9]+)\.([0-9]+)$/\1/')
MINOR=$(echo "$TAG" | sed -E 's/^v([0-9]+)\.([0-9]+)\.([0-9]+)$/\2/')
PATCH=$(echo "$TAG" | sed -E 's/^v([0-9]+)\.([0-9]+)\.([0-9]+)$/\3/')
echo "MAJOR=$MAJOR" >> "$GITHUB_ENV"
echo "MINOR=$MINOR" >> "$GITHUB_ENV"
echo "PATCH=$PATCH" >> "$GITHUB_ENV"
- name: Get GitHub build number
shell: bash
run: echo "BUILD_NUMBER=${{ github.run_number }}" >> "$GITHUB_ENV"
- name: Get PR number for prerelease suffix
if: github.event_name == 'pull_request'
shell: bash
run: echo "PR_NUMBER=${{ github.event.number }}" >> "$GITHUB_ENV"
- name: Calculate prerelease suffix
shell: bash
run: |
SUFFIX=""
if [ -n "$PR_NUMBER" ]; then
SUFFIX="-PR${PR_NUMBER}.${BUILD_NUMBER}"
elif [ "$GITHUB_REF" = "refs/heads/develop" ]; then
SUFFIX="-beta.${BUILD_NUMBER}"
elif [ "$GITHUB_REF" = "refs/heads/main" ]; then
SUFFIX="-rc.${BUILD_NUMBER}"
fi
echo "SUFFIX=$SUFFIX" >> "$GITHUB_ENV"
- name: Calculate version number bump
# Same logic as GitVersion:
# * "+semver: breaking" or "+semver: major" in commit log will produce major version bump (and reset minor and patch to 0)
# * "+semver: feature" or "+semver: minor" in commit log will produce minor version bump (and reset patch to 0)
# Default is to bump the patch version
# Git log format "%B" is the raw body with no author's email or anything else
shell: bash
run: |
COMMIT_COUNT=$(echo "$DESCRIBE" | sed -E 's/^[^-]+-([^-]+)-.*$/\1/')
if [ -n "$COMMIT_COUNT" -a "$COMMIT_COUNT" -gt 0 ]; then
# Calculate bump based on commit messages
RAW_LOG=$(git log --format="%B" "$TAG"..HEAD)
if grep -E '\+semver: (breaking|major)' <<< "$RAW_LOG"; then
MAJOR=$(($MAJOR + 1))
MINOR=0
PATCH=0
elif grep -E '\+semver: (feature|minor)' <<< "$RAW_LOG"; then
MINOR=$(($MINOR + 1))
PATCH=0
else
PATCH=$(($PATCH + 1))
fi
fi
echo "MAJOR=$MAJOR" >> "$GITHUB_ENV"
echo "MINOR=$MINOR" >> "$GITHUB_ENV"
echo "PATCH=$PATCH" >> "$GITHUB_ENV"
- name: Set version number variables for MSBuild
shell: bash
run: |
echo "PACKAGE_VERSION=${MAJOR}.${MINOR}.${PATCH}${SUFFIX}" >> "$GITHUB_ENV"
if [ $MAJOR -eq 0 ]; then
echo "ASSEMBLY_VERSION=0.${MINOR}.0.0" >> "$GITHUB_ENV"
else
echo "ASSEMBLY_VERSION=${MAJOR}.0.0.0" >> "$GITHUB_ENV"
fi
echo "FILE_VERSION=${MAJOR}.${MINOR}.${PATCH}.${BUILD_NUMBER}" >> "$GITHUB_ENV"
- name: Display version number for debugging
shell: bash
run: echo "Calculated version number is $PACKAGE_VERSION"
- name: Install .NET
uses: actions/setup-dotnet@v4
- name: Build & test
run: dotnet test --configuration Release --logger GitHubActions
- name: Pack
shell: bash
run: |
dotnet pack --include-symbols /p:PackageVersion="$PACKAGE_VERSION" /p:AssemblyVersion="$ASSEMBLY_VERSION" /p:FileVersion="$FILE_VERSION"
- name: Upload packages to build artifacts
uses: actions/upload-artifact@v4
with:
name: nuget-packages
path: src/artifacts/package/release/*nupkg
- name: Publish package to GitHub
if: github.event_name == 'pull_request' || (github.event_name == 'push' && startsWith(github.ref, 'refs/heads'))
shell: bash
run: |
dotnet nuget push "src/artifacts/package/release/*.nupkg" -s https://nuget.pkg.github.com/sillsdev/index.json -k "${{ secrets.GITHUB_TOKEN }}" --skip-duplicate
- name: Publish package to NuGet.org
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
shell: bash
run: |
echo Would run the following:
echo dotnet nuget push "src/artifacts/package/release/*nupkg" --skip-duplicate --api-key "$NUGET_API_KEY" --source https://api.nuget.org/v3/index.json
env:
NUGET_API_KEY: fake-key-for-testing-purposes
# NUGET_API_KEY: ${{ secrets.SILLSDEV_PUBLISH_NUGET_ORG }}