使用kubernetes更改Azure管道中的Docker图像标记的最佳方法

axkjgtzd  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(133)

我让我的azure pipeline使用我的kubernetes配置执行一个kubernetes@1任务:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tennant-service-deployment
  labels:
    app: tennant-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tennant-service
  template:
    metadata:
      labels:
        app: tennant-service
    spec:
      containers:
        - name: tennant-service
          image: cronesharedwesteurope.azurecr.io/tennant-service:dev
          ports:
            - containerPort: 80   
      imagePullSecrets:
        - name: registrysecret

你可以看到,目前我的图像是硬编码在我的yaml文件(tennant-service:dev)。
我想让用户用一个azure devops pipeline参数告诉我他想要哪个版本(例如dev / 1.0 / latest)。但是因为kubernetes是一个yaml配置文件,我不能用一个参数来改变它,对吗?有没有什么工具可以做到这一点?

von4xj4u

von4xj4u1#

我的案例目标是GKE的@PassionateDeveloper,我们使用Azure DevOps for CI/CD。要求是使用Build.BuildID作为映像标签,以唯一区分所有映像标签。以下是我用于满足要求的内容。

trigger:
- none

pool:
  name: {name of my self hosted agent pool}
  
variables:
  imageTag: '$(Build.BuildId)'

我的Kubernetes清单看起来像这样。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: authenticator
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: myapp
          image: gcr.io/myproject2/myapp:${imageTag} ---> imageTag to be replaced with replaceToken task
          ports:
            - containerPort: 80

我已经使用https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens为我做了魔术。

- task: replacetokens@5
            inputs:
              rootDirectory: '$(Pipeline.Workspace)/s/MyProjectDirectoy/Manifests/'
              targetFiles: '**/*.*'
              encoding: 'auto'
              tokenPattern: 'custom'
              tokenPrefix: '${'
              tokenSuffix: '}'
              writeBOM: true
              verbosity: 'detailed'
              actionOnMissing: 'fail'
              keepToken: false
              actionOnNoFiles: 'continue'
              enableTransforms: false
              enableRecursion: false
              useLegacyPattern: false
              enableTelemetry: true

因此,我的整体部署阶段yaml文件将看起来像这样,它的工作就像一个魅力。

- stage: Production
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Production
    displayName: Production
    environment: $(envName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: replacetokens@5
            inputs:
              rootDirectory: '$(Pipeline.Workspace)/s/MyProjectDirectory/Manifests/'
              targetFiles: '**/*.*'
              encoding: 'auto'
              tokenPattern: 'custom'
              tokenPrefix: '${'
              tokenSuffix: '}'
              writeBOM: true
              verbosity: 'detailed'
              actionOnMissing: 'fail'
              keepToken: false
              actionOnNoFiles: 'continue'
              enableTransforms: false
              enableRecursion: false
              useLegacyPattern: false
              enableTelemetry: true

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: 'deploy'
              kubernetesServiceConnection: 'GKE'
              namespace: 'default'
              manifests: |
               $(Pipeline.Workspace)/s/MyProjectDirectory/Manifests/01-Deployment.yml
              imagePullSecrets: 'azure-pipelines-deploy-token-djmc7'

          - task: PostBuildCleanup@3
oaxa6hgo

oaxa6hgo2#

这就是我们工作的内容
1.创建一个构建管道,该管道构建带有标记的Docker映像,标记是管道构建号,例如#1.6.1-TenentServiceImage。(假设您已经在构建过程中将映像推送到ACR)。
1.在您的部署YAML管道中,添加一个资源,

resources:
    pipelines:
     - pipeline: TenentServiceImage
       source: Tenent Service Image
       branch: master

1.在同一个YAML中,现在可以引用图像路径中的资源,

image: cronesharedwesteurope.azurecr.io/tennant-service:$(resources.pipeline.TenentServiceImage.runName)

1.当您的开发人员尝试部署容器时,他们单击“运行,”应该会看到一个新的选择下拉列表资源,并选择他们要部署的构建。x1c 0d1x

k3fezbri

k3fezbri3#

我希望用户使用Azure devops管道参数告诉我他想要哪个版本(例如,dev / 1.0 / latest)。
要满足您的要求,您可以使用RegEx Match & Replace extension中的RegEx匹配和替换任务
此任务将使用正则表达式来匹配文件中的字段。
在这种情况下,您可以定义使用者要输入的参数,并将值传递给工作以取代标记。
以下是一个示例:

parameters:
  - name: dockertag
    type: string
    default: dev
    

pool:
  vmImage: ubuntu-latest

steps:

- task: RegExMatchReplace@2
  displayName: 'RegEx Match & Replace'
  inputs:
    PathToFile: test.yml
    RegEx: 'image: ([a-zA-Z]+(\.[a-zA-Z]+)+)/[a-zA-Z]+-[a-zA-Z]+:[a-zA-Z]+'
    ValueToReplace: 'image: cronesharedwesteurope.azurecr.io/tennant-service:${{ parameters.dockertag }}'

...

然后该值将更新。

结果:
运行管道

Yaml文件:

您可以使用此站点转换正则表达式:Regex Generator
或者,您也可以使用“替换令牌”任务。请参阅以下票证:如何在构建期间将Azure管道中的变量应用于节点应用程序

2uluyalo

2uluyalo4#

微软在为Kubernetes容器设置Azure DevOps管道方面有一些不错的documentation。该示例的特点是在管道中使用KubernetesManifest@0任务,允许使用管道变量或参数指定容器标记。

相关问题