دليل GitLab CI / CD للمبتدئين المطلقين (تقريبًا)

أو كيفية الحصول على شارات جميلة لمشروعك في أمسية واحدة من الترميز المريح


ربما كل مطور لديه مشروع واحد على الأقل للحيوانات الأليفة ، في مرحلة ما ، هناك حكة حول موضوع الشارات الجميلة ذات الحالات ، وتغطية الكود ، وإصدارات الحزمة في nuget ... وقد دفعتني هذه الحكة إلى كتابة هذه المقالة. استعدادًا لكتابتها ، حصلت على هذا الجمال في أحد مشاريعي:


النتائج


ستغطي هذه المقالة الإعداد الأساسي للتكامل والتسليم المستمر لمشروع مكتبة فئة .Net Core في GitLab ، مع نشر الوثائق في صفحات GitLab وإرسال الحزم المجمعة إلى موجز خاص في Azure DevOps.


تم استخدام VS Code كبيئة تطوير مع ملحق GitLab Workflow (للتحقق من صحة ملف الإعدادات مباشرة من بيئة التطوير).


مقدمة مختصرة


قرص مضغوط - هذا هو عندما دفعت للتو ، والعميل سقط كل شيء؟

ما هو CI / CD ولماذا من الضروري البحث بسهولة في google. من السهل أيضًا العثور على وثائق كاملة حول كيفية تكوين خطوط الأنابيب في 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. 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. — 1
    2. (scope) — Packaging/Read & Write
      إنشاء PAT


  7. GitLab, CI/CD
    إعدادات GitLab CI / CD


  8. Variables,


    1. — ( )
    2. — . 9
    3. Mask variable
      GitLab - متغير جديد


.



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


شارات في GitLab


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 أكثر شمولاً ومتعدد الأوجه مما قد يبدو بعد قراءة هذا الدليل - وهذا ليس كذلك على الإطلاق . هناك حتى Auto DevOps هناك ، مما يسمح بذلك


اكتشاف التطبيقات وإنشائها واختبارها ونشرها ومراقبتها تلقائيًا

أخطط الآن لتهيئة خط أنابيب لنشر التطبيقات في Azure باستخدام Pulumi واكتشاف البيئة المستهدفة تلقائيًا ، والتي سيتم تناولها في المقالة التالية.


All Articles