#azure-pipelines #helmfile
#azure-конвейеры #helmfile
Вопрос:
Я создал приложение узла, для которого я хочу автоматизировать развертывание. До сих пор я только автоматизировал процесс сборки, т.Е. Устанавливал зависимости, создавал образ docker и отправлял в реестр контейнеров Azure. Это работает отлично и соответствует приведенному ниже коду, который не прокомментирован. В текущем процессе мне все еще нужно
- вручную измените тег изображения в моей конфигурации helmfile и
- вручную выполните
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 (как показано в моем коде). Спасибо!