Как внедрить helmfile в мой лазурный конвейер?

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

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

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

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

Однако этот подход кажется несколько громоздким, как будто мне не хватает гораздо более простого подхода к «простому» выполнению команды 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 048
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'

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

N Meibergen 22.12.2020 10:47

Другие вопросы по теме