این مقاله در مورد قالب های YAML صحبت خواهد کرد. با استفاده از این الگوها، می توانید کد خود را قابل استفاده مجدد کنید و کد اشتراک گذاری را در خطوط لوله متعدد ساده کنید.
اگر به تازگی با CI/CD آشنا هستید، ممکن است با بلوکهای کدی که چندین بار در یک خط لوله تکرار میشوند یا برنامههای کاربردی در محیطهای مختلف تکرار میشوند آشنا باشید. مشکل تکراری کد این است که بازسازهای بلاک باید به هر تکراری منتشر شوند. به همین دلیل، هم احتمال خطای انسانی و هم زمان مورد نیاز برای توسعه خط لوله به صورت خطی با تعداد موارد تکراری افزایش می یابد.
با استفاده از قالب های YAML، می توانید محتوای قابل استفاده مجدد، منطق و پارامترها را در قالب های جداگانه تعریف کنید که در زمان اجرا در خط لوله شما بارگذاری می شوند. شما می توانید این قالب ها را به یکی از این چهار دسته تقسیم کنید،
- مرحله - مجموعه ای از مراحل را برای مشاغل مرتبط تعریف کنید
- شغل - مجموعه ای از مراحل را که توسط یک عامل اجرا می شود تعریف کنید
- مرحله - یک دنباله خطی از عملیات را برای یک کار تعریف کنید
- متغیر – جایگزین مقادیر کدگذاری شده یا گروه های متغیر
مثال
فرض کنید یک مخزن دارید که باید از طریق خطوط لوله CI/CD با ساختار زیر خودکار شود:
├── api
│ ├── dockerfile
│ ├── node_modules
│ ├── package-lock.json
│ ├── package.json
│ └── server.js
├── frontend
│ ├── dockerfile
│ ├── node_modules
│ ├── package.json
│ ├── public
│ ├── src
│ └── yarn.lock
└── pipelines
└── azure-pipelines.yml
بدون استفاده از الگو، باید وظایفی را برای ساخت، آزمایش و استقرار تصویر docker از Node.JS API اضافه کنید. سپس باید همان وظایف را برای React.JS front-end انجام دهید. نتیجه چیزی شبیه به این خواهد بود،
- mainpool:
vmImage: 'ubuntu-latest'stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build_api
displayName: Build API
steps:
- task: NodeTool@0
inputs:
versionSpec: '10.x'
displayName: 'Install Node.js'
- script: |
npm install
workingDirectory: '$(Build.Repository.LocalPath)/api'
displayName: 'npm install'- job: Build_frontend
displayName: Build Frontend
steps:
- task: NodeTool@0
inputs:
versionSpec: '10.x'
displayName: 'Install Node.js'
- script: |
npm install
npm run build
workingDirectory: '$(Build.Repository.LocalPath)/frontend'
displayName: 'npm install and build'- stage: Test
displayName: Test stage
jobs:
- job: Test_api
displayName: Test API
steps:
- task: SonarCloudPrepare@1
inputs:
SonarCloud: 'SonarCloud training connection'
organization: 'gtrekter'
scannerMode: 'CLI'
configMode: 'manual'
cliProjectKey: 'GTRekter_Training'
cliProjectName: 'Training'
cliSources: '$(Build.Repository.LocalPath)/api'
- task: SonarCloudAnalyze@1
- task: SonarCloudPublish@1
inputs:
pollingTimeoutSec: '300' - job: Test_frontend
displayName: Test Frontend
steps:
- task: SonarCloudPrepare@1
inputs:
SonarCloud: 'SonarCloud training connection'
organization: 'gtrekter'
scannerMode: 'CLI'
configMode: 'manual'
cliProjectKey: 'GTRekter_Training'
cliProjectName: 'Training'
cliSources: '$(Build.Repository.LocalPath)/frontend'
- task: SonarCloudAnalyze@1
- task: SonarCloudPublish@1
inputs: