GitLab CI / CD рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП

рдпрд╛ рдЖрд░рд╛рдо рдХреЛрдбрд┐рдВрдЧ рдХреА рдПрдХ рд╢рд╛рдо рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдВрджрд░ рдмреИрдЬ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рд╢рд╛рдпрдж рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрд╛рд▓рддреВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдХрд┐рд╕реА рд╕рдордп рд╕реНрдЯреЗрдЯрд╕, рдХреЛрдб рдХрд╡рд░реЗрдЬ, рдирдЧреЗрдЯ рдореЗрдВ рдкреИрдХреЗрдЬ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрдВрджрд░ рдмреИрдЬ рдХреА рдереАрдо рдкрд░ рдПрдХ рдЦреБрдЬрд▓реА рд╣реИ ... рдФрд░ рдЗрд╕ рдЦреБрдЬрд▓реА рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ, рдореБрдЭреЗ рдЕрдкрдиреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдРрд╕реА рд╕реБрдВрджрд░рддрд╛ рдорд┐рд▓реА:


рдкрд░рд┐рдгрд╛рдо


рдпрд╣ рдЖрд▓реЗрдЦ GitLab рдореЗрдВ рдПрдХ .Net рдХреЛрд░ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдФрд░ рд╡рд┐рддрд░рдг рдХреЗ рдореВрд▓ рд╕реЗрдЯрдЕрдк рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ GitLab рдкреЗрдЬ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдкреНрд░рдХрд╛рд╢рди рд╣реЛрдЧрд╛ рдФрд░ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЛ Azure DevOps рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдлреАрдб рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╡реАрдПрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреАрддрд╛рд▓рд╛рдм рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рд╕реАрдзреЗ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп


рд╕реАрдбреА - рдпрд╣ рддрдм рд╣реИ рдЬрдм рдЖрдк рдмрд╕ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЧреНрд░рд╛рд╣рдХ рд╕рдм рдХреБрдЫ рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ?

CI / CD рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреВрдЧрд▓ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред GitLab рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди рднреА рдЖрд╕рд╛рди рд╣реИ ред рдпрд╣рд╛рдБ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рдЬрд╣рд╛рдБ рддрдХ рд╕рдВрднрд╡ рд╣реЛ рджреЛрд╖реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрдХреНрд╖реА рдХреА рдирдЬрд╝рд░ рд╕реЗ рдкреНрд░рдгрд╛рд▓реА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ:


  • , 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 - рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛

  3. Create , . , ( -> Overview -> Azure DevOps Services)
    рд╕реЗрд╡рд╛ рд╕реЗрдЯрдЕрдк


  4. Atrifacts, Create feed


    1. Include packages from common public sources, nuget
      рдкреИрдХреЗрдЬ рд╕реНрд░реЛрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

  5. Connect to feed, Visual Studio, Machine Setup Source
    рд╕реНрд░реЛрдд URL


  6. , Personal Access Token
    рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╣реБрдВрдЪ рдЯреЛрдХрди



    1. тАФ
    2. тАФ
    3. тАФ 1
    4. (scope) тАФ Packaging/Read & Write
      рдкреИрдЯ рдмрдирд╛рдПрдБ

  7. тАФ


  8. GitLab, CI/CD
    GitLab CI / CD рд╕реЗрдЯрд┐рдВрдЧреНрд╕


  9. Variables,


    1. тАФ ( )
    2. тАФ . 9
    3. 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

, , - .


  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:


рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рдмреИрдЬ


Shields.io тАФ , .


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

Shields.io рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг


Azure DevOps Artifacts . Azure DevOps Create badge markdown-:


Azure DevOps рдкрд░ рдмреИрдЬ рдмрдирд╛рдПрдВ


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 , , , .


рдмреЗрд╢рдХ, GitLab CI / CD рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдФрд░ рдмрд╣реБрдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реИ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдРрд╕рд╛ рд╣реИ ред рд╡рд╣рд╛рдБ рднреА рдСрдЯреЛ DevOps рд╣реИ , рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ


рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ, рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рддреИрдирд╛рддреА рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ

рдЕрдм рдореИрдВ рдкреБрд▓рдореА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЬрд╝реНрдпреЛрд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдХреНрд╖реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


All Articles