如何在Jenkins中使用内部版本号对Docker映像进行版本控制以作为Kubernetes部署进行部署?

当前,我正在尝试添加版本号或内部版本号,以将Docker映像部署在Kubernetes集群上。以前,我只使用:latest标签。但是,当我使用latest标签时,我发现从Dockerhub映像注册表中提取问题。因此,当我在<image-name>:{build-number}之类的docker映像中使用内部版本号时。

应用程序结构

在Kubernetes部署中,我正在使用部署和服务。我正在像下面这样在部署文件中定义映像存储库,

   containers:
   - name: test-kube-deployment-container
     image: samplekubernetes020/testimage:latest
     ports:
        - name: http
          containerPort: 8085
          protocol: TCP

在这里,而不是最新的标签,我想将内部版本号与映像放在部署YAML中。

  1. 我可以使用环境变量来保存用于访问的随机内部版本号,例如<image-name>:${buildnumber}吗?
  2. 如果我想使用提供随机数的环境变量,如何为环境变量生成随机数?

映像版本实施更新

我修改过的Jenkinsfile包含如下步骤,将图像版本号分配给图像。但是在更改存储库后,我仍然没有得到更新的结果,

我在Jenkinsfile中创建了以下步骤

stage ('imagebuild')
  {
     steps
         {
 sh 'docker build -f /var/lib/jenkins/workspace/jpipeline/pipeline/Dockerfile -t spacestudymilletech010/spacestudykubernetes /var/lib/jenkins/workspace/jpipeline/pipeline'
 sh 'docker login --username=my-username --password=my-password' 
 sh "docker tag spacestudymilletech010/spacestudykubernetes:latest spacestudymilletech010/spacestudykubernetes:${VERSION}"
 sh 'docker push spacestudymilletech010/spacestudykubernetes:latest'

         }
  }

我的部署YAML文件包含如下内容,

 containers:
   - name: test-kube-deployment-container
     image: spacestudymilletech010/spacestudykubernetes:latest
     ports:
        - name: http
          containerPort: 8085
          protocol: TCP

困惑

注意::当我检查dockerhub存储库时,每次显示最新推送状态

所以我的困惑是:

  1. 在我的deploy.yaml文件中提取最新映像是否有问题?
  2. 在我从机器上构建图像并推送图像的机器上标记图像时出现问题吗?
gyz111427 回答:如何在Jenkins中使用内部版本号对Docker映像进行版本控制以作为Kubernetes部署进行部署?

标准方法或至少对我们大多数人有效的方法是创建版本化或标记的图像。例如

samplekubernetes020/testimage:1
samplekubernetes020/testimage:2
samplekubernetes020/testimage:3
...
...

现在,我将尝试回答您的实际问题,即当图像标签升级时,如何更新部署中的图像?

输入解决方案

  • 使用最新版本的代码编译和构建新映像时,请使用递增的唯一版本标记。此标签可以是任何唯一的或内部版本号等。
  • 然后将已标记的图像推送到Docker注册表
  • 一旦上传了映像,就可以使用kubectl或kubernetes API使用最新的容器映像更新部署。

    kubectl set image deployment/my-deployment test-kube-deployment-container=samplekubernetes020/testimage:1 --record

  • 上述步骤通常在CI管道中进行,您可以在其中存储映像版本或image:版本在环境变量本身中。


更新帖子评论

由于您正在使用Jenkins,因此当Jenkins在构建运行时注入这些值时,您可以在Jenkinsfile本身中获得当前的内部版本号 commit-id 以及许多其他变量。对我来说,这有效。只是参考。

environment { 
   NAME = "myapp"
   VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}"
   IMAGE = ${NAME}:${VERSION}"
}
stages {
    stage('Build') {
        steps {
            echo "Running ${VERSION} on ${env.JENKINS_URL}"
            git branch: "${BRANCH}",.....
            echo "for brnach ${env.BRANCH_NAME}"
            sh "docker build -t ${NAME} ."
            sh "docker tag ${NAME}:latest ${IMAGE_REPO}/${NAME}:${VERSION}"
        }
    }
}
,

这种詹金斯管道方法对我有用。 我正在使用Jenkins内部版本号作为docker映像的标签,并推送到docker hub。现在将yaml文件应用于k8s集群,然后使用相同的标签更新部署中的映像。

示例管道脚本代码段位于此处

stage('Build Docker Image'){
        sh 'docker build -t {dockerId}/{projectName}:${BUILD_NUMBER} .'
  }
  stage('Push Docker Image'){
        withCredentials([string(credentialsId: 'DOKCER_HUB_PASSWORD',variable: 'DOKCER_HUB_PASSWORD')]) {
          sh "docker login -u {dockerId} -p ${DOKCER_HUB_PASSWORD}"
        }
        sh 'docker push {dockerId}/{projectName}:${BUILD_NUMBER}'
  }
  stage("Deploy To Kuberates Cluster"){
        sh 'kubectl apply -f {yaml file name}.yaml'
        sh 'kubectl set image deployments/{deploymentName} {container name given in deployment yaml file}={dockerId}/{projectName}:${BUILD_NUMBER}'
  }
本文链接:https://www.f2er.com/3161002.html

大家都在问