#docker #kubernetes #azure-devops #azure-pipelines
Вопрос:
Я создаю конвейер, который можно повторно использовать для создания образа docker и отправки этого образа в реестр контейнеров azure. Ниже приведена древовидная структура моего репозитория:
───repo
├── app1
│ ├── dir1
│ ├── dockerfile
│ ├── file1
│ └── file2
├── app2
│ ├── dir1
│ ├── dockerfile
│ ├── file1
│ └── file2
├── app3
│ ├── dir1
│ ├── dockerfile
│ ├── file1
│ └── file2
Как я могу спланировать свой ci таким образом, чтобы при запуске конвейера и если разработчик изменит файл1 в каталоге app1, конвейер знал, что ему нужно создать образ, используя файл dockerfile в каталоге app1?
Примечание: Я создаю конвейер в Azure DevOps.
Комментарии:
1. Смотрите возможную реализацию действий на GitHub здесь: github.com/relizaio/dockerfile-collection (должно быть легко сделать подобное в Azure DevOps) и напишите здесь: medium.com/@taleodor/…
Ответ №1:
Вы можете использовать простой скрипт PS, который использует git, чтобы определить, какая папка была изменена, и задать переменную сборки с именем проекта и true
:
$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
Write-Host "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i )
{
$name=$temp[$i]
Write-Host "this is $name file"
$project = $name.Split('/')[0]
Write-Host "##vso[task.setvariable variable=$project]true"
}
Теперь для каждого измененного проекта у вас есть переменная с именем проекта и значением true
.
Таким образом, в задачах сборки docker вы можете использовать пользовательские условия. например — для app1
шага:
and(succeeded(), eq(variables['app1'], 'true'))