Guide GitLab CI / CD pour le (presque) absolu débutant

Ou comment obtenir de beaux badges pour votre projet en une soirée de codage détendu


Probablement tous les développeurs qui ont au moins un projet pour animaux de compagnie, à un moment donné, il y a une démangeaison sur le thème des beaux badges avec les statuts, la couverture du code, les versions de package dans nuget ... Et cette démangeaison m'a amené à écrire cet article. En préparation pour l'écrire, j'ai eu une telle beauté dans l'un de mes projets:


résultats


Cet article couvrira la configuration de base de l'intégration et de la livraison continues pour un projet de bibliothèque de classes .Net Core dans GitLab, avec la publication de la documentation dans les pages GitLab et l'envoi des packages collectés vers un flux privé dans Azure DevOps.


VS Code a été utilisé comme environnement de développement avec l'extension GitLab Workflow (pour valider le fichier de paramètres directement à partir de l'environnement de développement).


Courte introduction


CD - c'est quand vous venez de pousser, et le client est tout tombé?

Qu'est-ce que CI / CD et pourquoi est-il nécessaire de google facilement. Une documentation complète sur la configuration des pipelines dans GitLab est également facile à trouver . Ici, je vais décrire brièvement et autant que possible sans défauts le processus du système à vol d'oiseau:


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

, :


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

, CI/CD , , , .


: ?
  • Pourquoi 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 - un nouveau projet

  3. Create , . , ( -> Overview -> Azure DevOps Services)
    Configuration du service


  4. Atrifacts, Create feed


    1. Include packages from common public sources, nuget
      Configurer la source du package

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


  6. , Personal Access Token
    Jeton d'accès personnel



    1. — 1
    2. (scope) — Packaging/Read & Write
      créer PAT


  7. GitLab, CI/CD
    Paramètres GitLab CI / CD


  8. Variables,


    1. — ( )
    2. — . 9
    3. Mask variable
      GitLab - Nouvelle 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

, , - .


  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:


Badges dans GitLab


Shields.io — , .


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

Exemple avec Shields.io


Azure DevOps Artifacts . Azure DevOps Create badge markdown-:


Créer un badge sur Azure DevOps


Informations sur le badge 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 , , , .


Bien sûr, GitLab CI / CD est beaucoup plus étendu et multiforme qu'il n'y paraît après avoir lu ce guide - ce n'est absolument pas le cas . Il y a même des DevOps automatiques là-bas , permettant


détecter, créer, tester, déployer et surveiller automatiquement vos applications

Il est maintenant prévu de configurer un pipeline pour déployer des applications dans Azure, à l'aide de Pulumi et détecter automatiquement l'environnement cible, qui sera traité dans le prochain article.


All Articles