Планирование конвейера CI для создания и отправки контейнеров docker

#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'))