为什么Kubernetes的Jenkins探员有多个集装箱?

0x6upsns  于 2022-11-21  发布在  Jenkins
关注(0)|答案(1)|浏览(131)

我正在使用本指南在Kubernetes中配置Jenkins + Jenkins代理:
https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes/
其给出了针对不同阶段使用多个/不同容器的Jenkins流水线的以下示例:

def label = "worker-${UUID.randomUUID().toString()}"

podTemplate(label: label, containers: [
  containerTemplate(name: 'gradle', image: 'gradle:4.5.1-jdk9', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'docker', image: 'docker', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl:v1.8.8', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'helm', image: 'lachlanevenson/k8s-helm:latest', command: 'cat', ttyEnabled: true)
],
volumes: [
  hostPathVolume(mountPath: '/home/gradle/.gradle', hostPath: '/tmp/jenkins/.gradle'),
  hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]) {
  node(label) {
    def myRepo = checkout scm
    def gitCommit = myRepo.GIT_COMMIT
    def gitBranch = myRepo.GIT_BRANCH
    def shortGitCommit = "${gitCommit[0..10]}"
    def previousGitCommit = sh(script: "git rev-parse ${gitCommit}~", returnStdout: true)
 
    stage('Test') {
      try {
        container('gradle') {
          sh """
            pwd
            echo "GIT_BRANCH=${gitBranch}" >> /etc/environment
            echo "GIT_COMMIT=${gitCommit}" >> /etc/environment
            gradle test
            """
        }
      }
      catch (exc) {
        println "Failed to test - ${currentBuild.fullDisplayName}"
        throw(exc)
      }
    }
    stage('Build') {
      container('gradle') {
        sh "gradle build"
      }
    }
    stage('Create Docker images') {
      container('docker') {
        withCredentials([[$class: 'UsernamePasswordMultiBinding',
          credentialsId: 'dockerhub',
          usernameVariable: 'DOCKER_HUB_USER',
          passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
          sh """
            docker login -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD}
            docker build -t namespace/my-image:${gitCommit} .
            docker push namespace/my-image:${gitCommit}
            """
        }
      }
    }
    stage('Run kubectl') {
      container('kubectl') {
        sh "kubectl get pods"
      }
    }
    stage('Run helm') {
      container('helm') {
        sh "helm list"
      }
    }
  }
}

但是你为什么要为这个粒度级别而烦恼呢?例如,为什么不只有一个容器,里面有你需要的所有东西,jnlp,helm,kubectl,java等等,然后在你的所有阶段使用它呢?
我知道从纯粹主义者的Angular 来看,保持容器/映像尽可能小是好的,但如果这是唯一的理由,我宁愿有一个容器+不必麻烦我的最终用户(编写jenkinsfiles的开发人员)选择正确的容器-他们不应该担心这个级别的东西,相反,他们需要能够得到一个代理,仅此而已。
或者我是否遗漏了这种多容器设置的某些功能原因?

dm7nw8vv

dm7nw8vv1#

使用一个映像来处理所有过程在功能上是可行的,但它会增加您的操作负担。
我们并不总是能找到一个能满足我们所有需求的映像,比如说,想要的工具和想要的版本。
为了实现这一点,你需要为不同的arch(amd/arm)构建docker映像,并维护/使用docker注册表来存储你构建的映像,这个过程可能会很耗时,因为你的映像变得越来越复杂。更重要的是,很可能你的一些工具“偏爱”一些特定的linus发行版,你会发现这很困难, 并不总是功能正常。**
假设您需要在管道的某个步骤中使用较新版本的Docker图像,您将需要重复构建和上传图像的整个过程。或者,您只需更改管道中的图像版本,这将使您的操作工作量最小化。

相关问题