Рубрики
Uncategorized

Автоматизируйте Micronaut 2.1 Docker Build с Azure DevOps / Tipelines

Недавно Micronaut 2.1 был опубликован с еще одной функцией, которая делает нас «конечными разработками». Tagged с микронаут, лазурной, DevOps, Docker.

Недавно Micronaut 2.1 был опубликован с еще одной функцией, которая делает нас «конечными разработками» работать еще меньше. Это называется «плагин Gradle Docker», и вы можете проверить это Здесь Анкет Micronaut принял эту функцию и Graeme (создатель Micronaut) Опубликовано это видео на YouTube Объяснение некоторых функций, включая, как использовать этот плагин Gradle с помощью Micronaut.

Я предполагаю, что вы настроили реестр контейнеров в Azure и установили все подключения, настроенные для общения между Azure DevOps и реестром. Также я надеюсь, что у вас есть проект с версией Micronaut 2.1 или более, потому что эта функция доступна только начиная с 2.1.0

Моя первая реакция на это была «приятной», а потом я подумал: «Ну, как использовать это, чтобы пометить изображения, отличные от последняя метка по умолчанию при использовании Azure Tipвей». Вещь в том, что для того, чтобы сделать пользовательский тег, я сделал что -то подобное

dockerBuild {
    images = ["myproject:$project.version","myproject:latest"]
}

но Azure-Pipelines.yaml будет содержать по умолчанию что -то подобное как задача для развертывания

- task: Docker@2
    displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

Но это $ (TAG) Переменная жестко кодируется от чего-то вроде «$ (build.buildid)», что не очень полезно для того, чтобы пометить свои собственные изображения, потому что вы, вероятно, хотите отслеживать свои собственные версии. Верхняя часть вашего трубопровода Yaml должен иметь что -то вроде конфигурации ниже

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: 'some-uuid-some-uuid'
  imageRepository: 'yourAzureImageRepository'
  containerRegistry: 'yourAzureIMageRepoistory.azurecr.io'
  dockerfilePath: '$(Build.SourcesDirectory)'
  tag: '$(Build.BuildId)'
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

Вы можете удалить это тег: … Частично, как мы пытаемся поместить нашу собственную информацию, и Dockerfilepath Как мы будем создавать изображение с Градл Так что нам не нужен Dockerfile.

Вместо этого давайте сделаем сценарий, который извлечет версию из нашего Build.Gradle файл. Добавить Bash Задача до Задача BUILDDOCKER задача. Что -то подобное должно дать вам версию:

#!/usr/bin/env bash
version=$(grep '^version[[:space:]]*"\(.\)\+"$' build.gradle | awk '{print $2}')
echo "##vso[task.setvariable variable=version]$version"

тогда ваша задача может выглядеть так:

- task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        #!/usr/bin/env bash
        version=$(grep '^version[[:space:]]*"\(.\)\+"$' build.gradle | awk '{print $2} | sed 's/"//g'')
        echo "##vso[task.setvariable variable=version]$version"

Windows Pipelines?

Я сделал сценарий, который должен дать вам тот же результат, когда вы запускаете ваши трубопроводы на платформе Windows

$versionVal = Get-Content .\build.gradle | Select-String -Pattern '^version\s*\"(?.+)\"$'  | % { $_.Matches[0].Groups["version"].Value }
Write-Host "##vso[task.setvariable variable=version]$version"

Я не на 100% уверен, что это работает, я только что проверил его в PowerShell, и я выпустил номер версии Так что я думаю, это работает: D.

Мавен?

Ну, просто проверьте Эта ссылка и отрегулировать это соответственно. Это также способ получить некоторые кредиты для человека, который разместил этот ответ, когда я увидел этот ответ, глядя, как настроить переменную в Azure Pipeline от Bash.

Отметьте изображение

Поскольку изображение было построено внутри Azure Tipelines, нам нужно пометить его, чтобы команда Push знала, где нажимать изображение. Легкий способ сделать это на Linux Pipeline — это использование Bash.

    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: 'docker tag $(imageRepository):$(tag) $(containerRegistry)/$(imageRepository):$(tag)'

Иногда вы хотите, чтобы ваше изображение было помечено Последний Потому что многие люди будут настроить (или по умолчанию), которые активируются только на этом теге. Итак, скажем, вы хотите, чтобы ваш Развитие быть последней версией, но главный или Мастер быть конкретной версией. Ниже задача активируется только в том случае, если название филиала было «разработкой».

    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: 'docker tag $(imageRepository):$(tag) $(containerRegistry)/$(imageRepository):latest'
      condition: eq(variables['Build.SourceBranch'], 'development')

Вы можете прочитать больше об этом здесь Если вам нужно настроить его по -другому

Нажмите на изображение

- task: Docker@2
    displayName: Build and push an image to container registry
      inputs:
        command: push
        repository: $(imageRepository)
        containerRegistry: $(dockerRegistryServiceConnection)
        buildContext: $(containerRegistry)
        tags: |
          $(tag)
          latest

Если вы не пометили изображение с Последний Обмен весь трубопровод потерпит неудачу, так как нет условного оператора. Если вам это не нужно, удалите его полностью.

Последний тег (необязательно)

Если вам нужен последний тег, эта строка должна помочь.

${{ if eq(variables['Build.SourceBranchName'], 'development') }}:
  tags: |
    $(tag)
    latest
${{ if ne(variables['Build.SourceBranchName'], 'development') }}:
  tags: |
    $(tag)

Так что задача может выглядеть как замена BranchNamegoesheere с каким -либо названием вашего ветви:

- task: Docker@2
    displayName: Build and push an image to container registry
      inputs:
        command: push
        repository: $(imageRepository)
        containerRegistry: $(dockerRegistryServiceConnection)
        buildContext: $(containerRegistry)
        ${{ if eq(variables['Build.SourceBranchName'], 'development') }}:
          tags: |
            $(tag)
            latest
        ${{ if ne(variables['Build.SourceBranchName'], 'development') }}:
          tags: |
            $(tag)

Это должно быть, надеюсь, это сработает: D

Обновления: Я переключил логику для тегации изображений с последними, так как в большинстве случаев «последняя» версия не является той, кто развернут и не сохраняет мастер/основные филиалы. Очевидная причина должна заключаться в том, что развертывание нового кода на push должен происходить только в средах разработки/тестирования, в то время как должен быть «ручный» триггер, чтобы получить последний Протестировано версия, которая работает правильно и развернуть его. Также предварительный пример на самом деле не работал при наличии нескольких тегов и отсутствовал теги часть Так что теперь добавлено.

Оригинал: «https://dev.to/greenroommate/automate-micronaut-2-1-docker-build-with-azure-devops-pipelines-5b6m»