Как внедрить helmfile в мой конвейер Azure?

#azure-pipelines #helmfile

#azure-конвейеры #helmfile

Вопрос:

Я создал приложение узла, для которого я хочу автоматизировать развертывание. До сих пор я только автоматизировал процесс сборки, т.Е. Устанавливал зависимости, создавал образ docker и отправлял в реестр контейнеров Azure. Это работает отлично и соответствует приведенному ниже коду, который не прокомментирован. В текущем процессе мне все еще нужно

  1. вручную измените тег изображения в моей конфигурации helmfile и
  2. вручную выполните helmfile -environment=<my-environment> sync .

Моя проблема во второй части, поскольку я считаю, что первая часть легко реализуется, когда у меня есть настройки для второй.

В исходном каталоге репозитория у меня есть helmfile.yaml файл, который можно было бы вызвать сразу после сборки. Это то, чего я пытался достичь с помощью приведенной ниже настройки, которая прокомментирована. Я думал о том, чтобы иметь контейнер, на котором helfmile он уже установлен, например cablespaghetti/helmfile-docker , затем подключиться к кластеру K8s, используя kubectl для этого задачу Azure, с последующим выполнением helmfile sync команды. Этот подход потерпел неудачу, поскольку я получил Docker exec fail with exit code 1 , вероятно, потому, что указанный контейнер использует подход ENTRYPOINT, который не разрешен в конвейере Azure.

Однако этот подход кажется несколько громоздким, как будто мне не хватает гораздо более простого подхода к «простому» выполнению helmfile sync команды. Как я могу заставить это работать?

 trigger:
- dev

resources:
- repo: self

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <service-connection>
  imageRepository: <node-app-image>
  containerRegistry: <registry-name>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'
  
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  ## This was an approach I tried but failed, because the below image is not suitable
  # helmfileImageName: 'cablespaghetti/helmfile-docker:3.3.4.1'
  # azureSubscriptionEndpoint: <endpoint>
  # azureResourceGroup: <resource-group>
  # kubernetesCluster: <cluster-name>
  # stage: <stage>

stages:
- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '13.x'
      displayName: 'Install Node.js'
    - script: |
        yarn install
        yarn run build
      displayName: 'yarn install'
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
## Attempted deploy stage - still missing here is using the above $(tag) to select the correct image
# - stage: Deploy
#   displayName: Deploy with helmfile
#   jobs:  
#   - job: Deploy
#     displayName: Deploy
#     container: cablespaghetti/helmfile-docker:3.3.4.1
#     steps:
#     - task: Kubernetes@1
#       displayName: kubectl login
#       inputs:
#         connectionType: Azure Resource Manager
#         azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
#         azureResourceGroup: $(azureResourceGroup)
#         kubernetesCluster: $(kubernetesCluster)
#         useClusterAdmin: $(useClusterAdmin)
#         command: login
#     - script: |
#         helmfile -environment=$(stage) sync
 

Ответ №1:

Поскольку файл helmfile не предустановлен в агенте конвейера. Вы можете вручную установить helmfile с помощью задачи сценария. Проверьте приведенный ниже пример:

 - bash: |
   
   curl -L https://github.com/roboll/helmfile/releases/download/v0.135.0/helmfile_linux_amd64 > helmfile
    
   chmod  x helmfile
     
  displayName: 'Install helm'
 

Приведенная выше задача bash установит hemlfile в рабочий каталог по умолчанию (вы можете изменить путь к файлу, чтобы установить его в другую папку). Затем вы можете использовать команду helmfile, подобную этой ./helmfile -environment=<my-environment> sync , в следующей задаче скрипта. Смотрите ниже:

 - bash: |
   az login --service-principal -u "$(AZURE_SERVICE_PRINCIPAL_USER)" -p "$(AZURE_SERVICE_PRINCIPAL_PW_OR_CERT)" --tenant "$(AZURE_SERVICE_PRINCIPAL_TENANT)"
   az aks get-credentials --resource-group "$(AZURE_RESOURCE_GROUP)" --name "$(CLUSTER_NAME)"
       
   ./helmfile -environment=<my-environment> sync

  displayName: 'helmfile  sync'
 

Комментарии:

1. Отличное решение, очень простое! Вместо того, чтобы выполнять вход в систему через service-principal, я использовал встроенную задачу Kubernetes (как показано в моем коде). Спасибо!