GuĂ­a de GitLab CI / CD para el principiante (casi) absoluto

O cĂłmo obtener hermosas insignias para su proyecto en una noche de codificaciĂłn relajada


Probablemente todos los desarrolladores que tienen al menos un proyecto favorito, en algĂşn momento hay una picazĂłn en el tema de insignias hermosas con estados, cobertura de cĂłdigo, versiones de paquetes en nuget ... Y esta picazĂłn me llevĂł a escribir este artĂ­culo. En preparaciĂłn para escribirlo, obtuve tanta belleza en uno de mis proyectos:


resultados


Este artículo cubrirá la configuración básica de la integración continua y la entrega de un proyecto de biblioteca de clase .Net Core en GitLab, con la publicación de documentación en las páginas de GitLab y el envío de los paquetes recopilados a un feed privado en Azure DevOps.


VS Code se utilizĂł como entorno de desarrollo con la extensiĂłn GitLab Workflow (para validar el archivo de configuraciĂłn directamente desde el entorno de desarrollo).


Breve introducciĂłn


CD: Âżesto es cuando acabas de presionar y el cliente se ha caĂ­do todo?

¿Qué es CI / CD y por qué es necesario googlear fácilmente? También es fácil encontrar documentación completa sobre cómo configurar tuberías en GitLab . Aquí describiré brevemente y en la medida de lo posible sin fallas el proceso del sistema desde una vista de pájaro:


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

, :


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

, CI/CD , , , .


: ?
  • 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. —
    2. —
      Azure DevOps: un nuevo proyecto

  3. Create , . , ( -> Overview -> Azure DevOps Services)
    ConfiguraciĂłn de servicio


  4. Atrifacts, Create feed


    1. Include packages from common public sources, nuget
      Configurar fuente de paquete

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


  6. , Personal Access Token
    Token de acceso personal



    1. —
    2. —
    3. — 1
    4. (scope) — Packaging/Read & Write
      crear PAT

  7. —


  8. GitLab, CI/CD
    ConfiguraciĂłn de GitLab CI / CD


  9. Variables,


    1. — ( )
    2. — . 9
    3. Mask variable
      GitLab - Nueva 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. -skipduplicate — 409 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:


Insignias en GitLab


Shields.io — , .


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

Ejemplo con Shields.io


Azure DevOps Artifacts . Azure DevOps Create badge markdown-:


Crear insignia en Azure DevOps


InformaciĂłn de la insignia de 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 , , , .


Por supuesto, GitLab CI / CD es mucho más extenso y multifacético de lo que parece después de leer esta guía; esto no es absolutamente así . Incluso hay Auto DevOps allí , lo que permite


Detecta, crea, prueba, implementa y monitorea automáticamente tus aplicaciones

Ahora estoy planeando configurar una canalización para implementar aplicaciones en Azure usando Pulumi y detectar automáticamente el entorno de destino, que se tratará en el próximo artículo.


All Articles