Guia de CI / CD do GitLab para o iniciante (quase) absoluto

Ou como obter emblemas bonitos para o seu projeto em uma noite de codificação descontraída


Provavelmente todo desenvolvedor que tem pelo menos um projeto de estimação, em algum momento há uma coceira no tema de emblemas bonitos com status, cobertura de código, versões de pacotes em pepitas ... E essa coceira me levou a escrever este artigo. Na preparação para escrevê-lo, recebi tanta beleza em um dos meus projetos:


resultados


Este artigo abordará a configuração básica da integração e entrega contínuas de um projeto de biblioteca de classes .Net Core no GitLab, com a publicação da documentação nas páginas do GitLab e o envio dos pacotes coletados para um feed privado no Azure DevOps.


O VS Code foi usado como ambiente de desenvolvimento com a extensão GitLab Workflow (para validar o arquivo de configurações diretamente do ambiente de desenvolvimento).


Breve introdução


CD - isso é quando você acabou de empurrar, e o cliente caiu tudo?

O que é CI / CD e por que é necessário pesquisar facilmente no Google. Também é fácil encontrar documentação completa sobre como configurar pipelines no GitLab . Aqui, brevemente e na medida do possível, sem falhas, descreverei o processo do sistema de uma visão de pássaro:


  • , merge request , - ,
  • , ,
  • ,
  • — .. ,
  • (.. ) — ( ),
  • , .

, :


  • — , , , , , , .,
  • (stage) — , 1+ ,
  • (job) — . (), , / .

, CI/CD , , , .


: ?
  • Por que GitLab?

, -, GitHub'e , — . , GitHub.


  • Azure DevOps Pipelines?

— . git — , SSH- — , .


:


:


  • GitLab.

:


  • merge request,
  • merge request ,
  • Azure DevOps,
  • GitLab Pages,
  • !11

:


  • 1 —
    • ,
  • 2 —
    • , ,
  • 3 —
    • 1 — nuget- Azure DevOps
    • 2 — xmldoc GitLab Pages

!




  1. Microsoft Azure


  2. Azure DevOps




    1. Azure DevOps - um novo projeto

  3. Create , . , ( -> Overview -> Azure DevOps Services)
    Configuração de serviço


  4. Atrifacts, Create feed


    1. Include packages from common public sources, nuget
      Configurar origem do pacote

  5. Connect to feed, Visual Studio, Machine Setup Source
    URL da fonte


  6. , Personal Access Token
    Token de acesso pessoal



    1. — 1
    2. (scope) — Packaging/Read & Write
      criar PAT


  7. GitLab, CI/CD
    Configurações de CI / CD do GitLab


  8. Variables,


    1. — ( )
    2. — . 9
    3. Mask variable
      GitLab - Nova variável


.



, 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

, , - .


  1. , , -c Release
  2. , :
    1. coverlet.msbuild: dotnet add package coverlet.msbuild
    2. /p:CollectCoverage=true
    3. (. )
  3. 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+%)/

.



— , .


:


  1. nuget (nuget.config), : dotnet new nugetconfig


    : ( ) . , .


  2. : nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name — ,
    2. url — URL " ", . 6
    3. organization — Azure DevOps
    4. gitlab variable — , GitLab (" ", . 11). , $variableName
    5. -StorePasswordInClearText — ( )
    6. -verbosity detailed
  3. : nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. , *.nupkg.
    2. name — .
    3. key — . Azure DevOps Connect to feed az.
    4. -skipduplicate409 Conflict; .

:


  1. , , master, docfx. docfx init . .
    1. ..\public — GitLab public Pages. .. — .
  2. GitLab.
  3. pages ( GitLab Pages):
    1. :
      1. nuget install docfx.console -version 2.51.0 — docfx; .
      2. .\docfx.console.2.51.0\tools\docfx.exe .\docfx_project\docfx.json
    2. artifacts:

pages:
  # snip
  artifacts:
    paths:
      - public

docfx


. — . , , metadata.src:


{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../"docfx.json, .. .
  2. metadata.src.files: ["**/*.csproj"] — , C# .
  3. metadata.src.exclude: ["*.tests*/**"] — , .tests


, , , , README .


.gitlab-ci.yml
image: 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:


Distintivos no GitLab


Shields.io — , .


![  Shields.io](https://img.shields.io/badge/custom-badge-blue)

Exemplo com Shields.io


Azure DevOps Artifacts . Azure DevOps Create badge markdown-:


Criar selo no DevOps do Azure


Informações sobre emblemas do Azure DevOps




, 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-_]+))?"
#     ,      GitLab' 
$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 , , , .


Obviamente, o GitLab CI / CD é muito mais extenso e multifacetado do que parece depois de ler este guia - isso não é absolutamente verdade . Há até DevOps automáticos lá , permitindo


detectar, criar, testar, implantar e monitorar automaticamente seus aplicativos

Agora, há planos para configurar um pipeline para implantar aplicativos no Azure, usando Pulumi e detectar automaticamente o ambiente de destino, que será abordado no próximo artigo.


All Articles