Azure Devops - выпуск конвейера с docker и Azure Registry Container (ACR) - проблема с тегом - PullRequest
0 голосов
/ 22 апреля 2020

У меня очень странная (и я полагаю, легко исправить) проблема :) Я пытаюсь использовать работающий конвейер CI / CD в Azure. Для этого у меня есть репозиторий в Azure devops и создан конвейер сборки и выпуска. Я публикую docker изображений в Azure Реестре контейнеров, и во время выпуска я вытягиваю это изображение (или, по крайней мере - пытаюсь, потому что оно не работает), и пытаюсь опубликовать sh его в Webapp для контейнеры. В моем случае это «приложение» - это SingalR hub. NET Core 3.1 (но я не думаю, что это решает мою проблему)

Если кто-то хочет узнать подробно, как я настроил это - вот учебник, который я использовал:

https://wikiazure.com/devops/azure-devops-automate-your-release-pipeline-to-provision-a-docker-container-to-azure-web-app-for-containers/

Были некоторые сомнения / различия в учебнике (например - почему изначально в веб-приложение учебника настраивается на Docker хабе, хотя на самом деле оно использует ACR, и почему для подключения к ACR учебное пособие использует Azure соединение Resource Manager (а не выделенный Docker контейнер -> соединение ACR) И почему позже в конвейере сборки есть какой-то странный идентификатор, установленный для dockerRegistryServiceConnection (я даю в этом месте имя моего ACR docker соединения службы)

Но весь конвейер сборки работает. Это публикация образа до ACR. Все хорошо до этого шага.

Проблема начинается, когда я хочу опубликовать sh Azure WebApp с этим изображением. Проблема с ... TAGS :) Они ми smatching. У меня есть автомат c CI / CD - поэтому, когда я делаю sh некоторые изменения в репо, я вижу, что конвейер релиза работает. Это создание изображения в ACR. Тогда я вижу, что конвейер релиза работает. Все "правильно" - это означает, что ошибки не видны, а релиз - зеленый.

Но когда я go в службу приложений и настройки контейнера, я вижу из журналов:

2020-04-21 18:02:28.321 INFO  - Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.761 ERROR - DockerApiException: Docker API responded with status code=NotFound, response={"message":"manifest for myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a not found: manifest unknown: manifest unknown"}

2020-04-21 18:02:28.761 ERROR - Pulling docker image myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a failed:
2020-04-21 18:02:28.762 INFO  - Pulling image from Docker hub: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a
2020-04-21 18:02:28.867 ERROR - DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Get https://myAcrName.azurecr.io/v2/mobile/signalr/manifests/c7aead0c46b66afc4131935efc7e6a51280dfb1a: unauthorized: authentication required"}

2020-04-21 18:02:28.870 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)

Очень изощренная ошибка, но причина root в том, что он пытается получить изображение с несуществующим тегом, который является тегом GIT COMMIT. Предполагается получить изображение по $ (Build.BuildId) (это была моя первая попытка) или по $ (Build.BuilNumber) (это была моя вторая попытка)

Вот как этот шаг конвейера (Deploy *) 1082 * Служба приложений) выглядит следующим образом:

- task: AzureRmWebAppDeployment@4
  displayName: 'Deploy Azure App Service'
  inputs:
    azureSubscription: mySubcsriptionARM
    appType: webAppContainer
    WebAppName: myProductsignalr
    DockerNamespace: myAcrName.azurecr.io
    DockerRepository: mobile/signalr
    DockerImageTag: '$(Build.BuildNumber)'

Когда я go для освобождения конвейера регистрирует как журнал "Развертывание Azure Служба приложений", я вижу, что

2020-04-21T18:41:01.6012767Z ##[section]Starting: Deploy Azure App Service
2020-04-21T18:41:01.6367124Z ==============================================================================
2020-04-21T18:41:01.6367787Z Task         : Azure App Service deploy
2020-04-21T18:41:01.6368381Z Description  : Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby
2020-04-21T18:41:01.6368765Z Version      : 4.163.5
2020-04-21T18:41:01.6369158Z Author       : Microsoft Corporation
2020-04-21T18:41:01.6369603Z Help         : https://aka.ms/azureappservicetroubleshooting
2020-04-21T18:41:01.6369976Z ==============================================================================
2020-04-21T18:41:03.8970184Z Got service connection details for Azure App Service:'myProductsignalr'
2020-04-21T18:41:04.5534864Z Trying to update App Service Configuration settings. Data: {"appCommandLine":null,"linuxFxVersion":"DOCKER|myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:05.5465725Z Updated App Service Configuration settings.
2020-04-21T18:41:05.5495890Z Trying to update App Service Application settings. Data: {"DOCKER_CUSTOM_IMAGE_NAME":"myAcrName.azurecr.io/mobile/signalr:1f283100"}
2020-04-21T18:41:06.2703349Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:32.4715682Z Updated App Service Application settings and Kudu Application settings.
2020-04-21T18:41:33.4179962Z Successfully updated deployment History at https://myProductsignalr.scm.azurewebsites.net/api/deployments/111587494492765
2020-04-21T18:41:33.5945654Z App Service Application URL: http://myProductsignalr.azurewebsites.net
2020-04-21T18:41:33.6180118Z ##[section]Finishing: Deploy Azure App Service

enter image description here

Что меня удивляет, что это показывает, что все было хорошо - когда это было далеко от "хорошо":)

Когда я go до настройки контейнера после: а) публикуется новый код б) запускает конвейер c) освобождает конвейер

я вижу это так:

enter image description here

Тег пуст. Если бы я выбрал какой-нибудь тег вручную:

enter image description here

И выбрал бы: "SAVE" все работает правильно (SingalR запущен и работает правильно)

Очевидно, я что-то упускаю: / Помогите мне увидеть, что;)

Причина root для меня заключается в том, что этот фрагмент: DockerImageTag: '$(Build.BuildNumber)' должен вставить номер сборки (как указано) и информацию из настроек контейнера должно быть: Pulling image: myAcrName.azurecr.io/mobile/signalr:20200421.09 (для BuildNumber 20200421.09), и он вставляет туда GIT COMMIT в качестве тега и заканчивается: Pulling image: myAcrName.azurecr.io/mobile/signalr:c7aead0c46b66afc4131935efc7e6a51280dfb1a Почему??)

[ ОБНОВЛЕНИЕ 22.04 10:56]

Я публикую постройку конвейера, которую я сейчас использую. Я не думаю, что это важно, поскольку он работает правильно, и проблема больше в развертывании правильно созданного docker образа (в ACR), чем в создании этого образа конвейером сборки. Тем не менее, вот этот конвейер:

# Docker
# Build a Docker image 
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

resources:
- repo: self

variables:
  dockerRegistryServiceConnection: 'MyProductDockerACR'
  imageRepository: 'mobile/signalr'
  containerRegistry: 'myAcrName.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildNumber)'
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push image to container registry
      inputs:
        containerRegistry: $(dockerRegistryServiceConnection)
        repository:  $(imageRepository)
        command: 'buildAndPush'
        Dockerfile: $(dockerfilePath)
        tags: |
          $(tag)

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я видел, что используемая вами версия настроена на UI. Это логика работы c сильно отличается от той, которая настроена YAML.

Фактически, здесь то, что вы получили, просто отличается производительностью, в то время как причина выпуска релиза различна.

Я предполагаю, что в этом выпуске есть источник артефакта, нацеленный на Repos , верно? Вы можете подтвердить, проверив его значок.

enter image description here

Пока источником релиза является Repos, тогда Build.BuildNumber будет короткой частью commit id (8 символов). И Build.BuildId - это полный идентификатор фиксации.

Если вы хотите, чтобы релиз продолжал использовать значение Build.Buildnumber, которое использовала соответствующая сборка ( созданный / отправленный образ ), вы должны убедитесь, что источник выпуска ориентирован на эту сборку. Кроме того, эта сборка требует создания артефактов. В соответствии с YAML, которым вы поделились, очевидно, что вы этого не сделали.

Only релиз запускается сборкой вместе с артефактом, тогда Build.BuildNumber может быть как 20200422.1, что сборка использовалась.

Итак, go определите ваш выпуск и заново настройте его источник, чтобы убедиться, что он исходит из артефакт сборки вместо репозитория.

0 голосов
/ 22 апреля 2020

Да. Вы правы. У вас есть несоответствие в тегах.

В Docker@2 задании вы можете определить теги:

steps:
- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: devopsmanual-acr

- task: Docker@2
  displayName: Build and Push
  inputs:
    repository: $(imageName)
    command: buildAndPush
    Dockerfile: build-docker-image/SampleAppForDocker/DOCKERFILE
    tags: |
      $(Build.BuildNumber)

- task: Docker@2
  displayName: Logout of ACR
  inputs:
    command: logout
    containerRegistry: devopsmanual-acr

Ваше определение должно быть примерно таким же. Где devopsmanual-acr является подключением к вашему ACR.

ACR connection definition.

Я недавно сошел с ума пост в блоге о создании docker изображений для Azure DevOps, так что, возможно, это будет также полезно для вас.

Если это не так достаточно, чтобы решить вашу проблему, пожалуйста, отредактируйте ваш вопрос и покажите, как вы создаете sh ваши изображения.

...