或者如何在一个轻松的编码中获得一个美丽的徽章,为您的项目做一个晚上
可能每个开发人员至少拥有一个宠物项目,在某个时候,都会出现关于带有状态,代码覆盖范围以及nuget中的程序包版本的漂亮徽章的主题的痒。在准备编写它的过程中,我在一个项目中获得了如此美丽:

本文将介绍在GitLab中为.Net Core类库项目进行持续集成和交付的基本设置,并在GitLab页面中发布文档,并将收集到的包发送到Azure DevOps中的私人提要。
VS Code用作带有GitLab Workflow扩展的开发环境(用于直接从开发环境验证设置文件)。
简单的介绍
CD-这是您刚刚推送的内容,客户端已经全部掉了吗?
什么是CI / CD,为什么需要轻松使用Google。关于如何在GitLab中配置管道的完整文档也很容易找到。在这里,我将简要并尽可能没有缺陷地从鸟瞰的角度描述系统的过程:
- , merge request , - ,
- , ,
- ,
- — .. ,
- (.. ) — ( ),
- , .
, :
- — , , , , , , .,
- (stage) — , 1+ ,
- (job) — . (), , / .
, CI/CD , , , .
: ?, -, GitHub'e , — . , GitHub.
— . git — , SSH- — , .
:
:
:
- merge request,
- merge request ,
- Azure DevOps,
- GitLab Pages,
- !11
:
- 1 —
- 2 —
- 3 —
- 1 — nuget- Azure DevOps
- 2 — xmldoc GitLab Pages
!
Microsoft Azure
Azure DevOps
- —
- —

Create , . , ( -> Overview -> Azure DevOps Services)

Atrifacts, Create feed
- Include packages from common public sources,
nuget

Connect to feed, Visual Studio, Machine Setup Source

, Personal Access Token

- —
- —
- — 1
- (scope) — Packaging/Read & Write

—
GitLab, CI/CD

Variables,
- — ( )
- — . 9
- Mask variable

.
, CI/CD GitLab .gitlab-ci.yml
. , .
, YAML
. , , .
docker-, . .Net Core Docker Hub. GitHub , . .Net Core 3.1,
image: mcr.microsoft.com/dotnet/core/sdk:3.1
Microsoft , .
— stage'. GitLab 5 :
.pre
— ,.post
— ,build
— .pre
,test
— ,deploy
— .
, . , , , . , :
stages:
- build
- test
- deploy
, . , , before_script
:
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
, . :
dummy job:
script:
- echo ok
, , , , , … — bash: .PSVersion: command not found
. WTF?
— runner' ( , GitLab') bash
. , , :
dummy job on windows:
script:
- echo ok
tags:
- windows
! .
, , , test
, . , test
.
, , :
build job:
script:
- echo "building..."
tags:
- windows
stage: build
test and cover job:
script:
- echo "running tests and coverage analysis..."
tags:
- windows
stage: test
pack and deploy job:
script:
- echo "packing and pushing to nuget..."
tags:
- windows
stage: deploy
pages:
script:
- echo "creating docs..."
tags:
- windows
stage: deploy
, .
- , , . , .
: only/except rules. , only/except
(merge_request
, — , ) ( .. ); rules
, , (when
GitLab CI/CD).
— merge request, Azure DevOps — merge request , — .
, merge request:
build job:
# snip
only:
- merge_request
merge request :
pack and deploy job:
# snip
only:
- merge_request
- master
, .
merge request :
rules:
- if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
; rules
only/except
.
build job
, . , , artifacts
:
build job:
# snip
artifacts:
paths:
- path/to/build/artifacts
- another/path
- MyCoolLib.*/bin/Release/*
wildcards, .
, — , . .
, ( ) , .
, - , - , ( .net) . , 3 :
dotnet build
dotnet test
dotnet pack
, , - .
- , ,
-c Release
- , :
coverlet.msbuild
: dotnet add package coverlet.msbuild
/p:CollectCoverage=true
- (. )
- nuget- :
-o .
Coverlet :
Calculating coverage result...
Generating report 'C:\Users\xxx\source\repos\my-project\myProject.tests\coverage.json'
+-------------+--------+--------+--------+
| Module | Line | Branch | Method |
+-------------+--------+--------+--------+
| project 1 | 83,24% | 66,66% | 92,1% |
+-------------+--------+--------+--------+
| project 2 | 87,5% | 50% | 100% |
+-------------+--------+--------+--------+
| project 3 | 100% | 83,33% | 100% |
+-------------+--------+--------+--------+
+---------+--------+--------+--------+
| | Line | Branch | Method |
+---------+--------+--------+--------+
| Total | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+
GitLab , . coverage
; capture-, :
test and cover job:
# snip
coverage: /\|\s*Total\s*\|\s*(\d+[,.]\d+%)/
.
— , .
:
nuget (nuget.config
), : dotnet new nugetconfig
: ( ) . , .
- :
nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
name
— ,url
— URL " ", . 6organization
— Azure DevOpsgitlab variable
— , GitLab (" ", . 11). , $variableName
-StorePasswordInClearText
— ( )-verbosity detailed
- :
nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
- ,
*.nupkg
. name
— .key
— . Azure DevOps Connect to feed az
.-skipduplicate
— 409 Conflict
; .
:
- , , master, docfx.
docfx init
. .
..\public
— GitLab public Pages. .. — .
- GitLab.
pages
( GitLab Pages):
- :
nuget install docfx.console -version 2.51.0
— docfx; ..\docfx.console.2.51.0\tools\docfx.exe .\docfx_project\docfx.json
—
- artifacts:
pages:
# snip
artifacts:
paths:
- public
docfx
. — . , , metadata.src
:
{
"metadata": [
{
"src": [
{
"src": "../",
"files": [
"**/*.csproj"
],
"exclude":[
"*.tests*/**"
]
}
],
},
],
}
metadata.src.src: "../"
— docfx.json
, .. .metadata.src.files: ["**/*.csproj"]
— , C# .metadata.src.exclude: ["*.tests*/**"]
— , .tests
, , , , README .
.gitlab-ci.ymlimage: mcr.microsoft.com/dotnet/core/sdk:3.1
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
stages:
- build
- test
- deploy
build job:
stage: build
script:
- dotnet build -c Release
tags:
- windows
only:
- merge_requests
- master
artifacts:
paths:
- your/path/to/binaries
test and cover job:
stage: test
tags:
- windows
script:
- dotnet test -c Release /p:CollectCoverage=true
coverage: /\|\s*Total\s*\|\s*(\d+[,.]\d+%)/
only:
- merge_requests
- master
pack and deploy job:
stage: deploy
tags:
- windows
script:
- dotnet pack -c Release -o .
- dotnet new nugetconfig
- nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
- nuget push -source feedName -skipduplicate -apikey az *.nupkg
only:
- master
pages:
tags:
- windows
stage: deploy
script:
- nuget install docfx.console -version 2.51.0
- $env:path = "$env:path;$($(get-location).Path)"
- .\docfx.console.2.51.0\tools\docfx.exe .\docfx\docfx.json
artifacts:
paths:
- public
only:
- master
!
GitLab CI/CD Gtntral pipelines:

Shields.io — , .


Azure DevOps Artifacts . Azure DevOps Create badge markdown-:


, YAML — .
, windows
, / ( ). , :
.common_tags: &common_tags
tags:
- windows
.common_only: &common_only
only:
- merge_requests
- master
:
build job:
<<: *common_tags
<<: *common_only
, .
, — ; Version, . , , , .
— , . , — , .
, release (v./ver./version) <version number> (rev./revision <revision>)?
, , dotnet pack
. — .
:
$rx = "release\s+(v\.?|ver\.?|version)\s*(?<maj>\d+)(?<min>\.\d+)?(?<rel>\.\d+)?\s*((rev\.?|revision)?\s+(?<rev>[a-zA-Z0-9-_]+))?"
$found = $env:CI_COMMIT_MESSAGE -match $rx
if (!$found) { Write-Output "no release info found, aborting"; exit }
$maj = $matches['maj']
$min = $matches['min']
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
$bld = $(get-date -format "MMdd")
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
$version = "$maj$min$rel.$bld$rev"
dotnet pack -c Release -o . /p:Version=$version
pack and deploy job
.
- , powershell , , , .
当然,与阅读本指南后相比,GitLab CI / CD的功能更加广泛且涉及面更广- 绝对不是。甚至还有Auto DevOps,允许
自动检测,构建,测试,部署和监视您的应用程序
现在,我打算配置管道,以使用Pulumi在Azure中部署应用程序并自动检测目标环境,这将在下一篇文章中介绍。