我正在使用本指南在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的开发人员)选择正确的容器-他们不应该担心这个级别的东西,相反,他们需要能够得到一个代理,仅此而已。
或者我是否遗漏了这种多容器设置的某些功能原因?
1条答案
按热度按时间dm7nw8vv1#
使用一个映像来处理所有过程在功能上是可行的,但它会增加您的操作负担。
我们并不总是能找到一个能满足我们所有需求的映像,比如说,想要的工具和想要的版本。
为了实现这一点,你需要为不同的arch(amd/arm)构建docker映像,并维护/使用docker注册表来存储你构建的映像,这个过程可能会很耗时,因为你的映像变得越来越复杂。更重要的是,很可能你的一些工具“偏爱”一些特定的linus发行版,你会发现这很困难, 并不总是功能正常。**
假设您需要在管道的某个步骤中使用较新版本的Docker图像,您将需要重复构建和上传图像的整个过程。或者,您只需更改管道中的图像版本,这将使您的操作工作量最小化。