我是使用 Jenkins 的新手......
我正在尝试使用声明性 Jenkinsfile 自动生成图像(将存储在存储库中)。我发现文档很混乱(充其量)。简而言之,如何转换以下脚本示例(来自文档)
node {
checkout scm
def customImage = docker.build("my-image:${env.BUILD_ID}")
customImage.push()
}
到声明性 Jenkinsfile....
您可以在声明性管道中使用脚本化管道块作为解决方法
pipeline {
agent any
stages {
stage('Build image') {
steps {
echo 'Starting to build docker image'
script {
def customImage = docker.build("my-image:${env.BUILD_ID}")
customImage.push()
}
}
}
}
}
我正在使用以下方法:
steps {
withDockerRegistry([ credentialsId: "<CREDENTIALS_ID>", url: "<PRIVATE_REGISTRY_URL>" ]) {
// following commands will be executed within logged docker registry
sh 'docker push <image>'
}
}
地点:
我不推荐使用声明性语法来构建 Docker 映像,因为似乎每个重要步骤都需要回退到旧的脚本语法。但如果必须的话,混合方法似乎可行。
首先是有关 scm 步骤的详细信息:当我定义 Jenkins“来自 SCM 的管道脚本”项目时,该项目使用来自 git 的声明性管道获取 Jenkinsfile,Jenkins 将存储库克隆为管道中的第一步 即使我没有定义scm步骤.
对于构建和推送步骤,我只能找到新式声明性语法中旧式脚本化管道步骤的混合解决方案。例如,请参阅 gustavoapolinario 在 Medium 上的作品:
https://medium.com/@gustavo.guss/jenkins-building-docker-image-and-sending-to-registry-64b84ea45ee9
其中具有混合管道定义:
pipeline {
environment {
registry = "gustavoapolinario/docker-test"
registryCredential = 'dockerhub'
dockerImage = ''
}
agent any
stages {
stage('Cloning Git') {
steps {
git 'https://github.com/gustavoapolinario/microservices-node-example-todo-frontend.git'
}
}
stage('Building image') {
steps{
script {
dockerImage = docker.build registry + ":$BUILD_NUMBER"
}
}
}
stage('Deploy Image') {
steps{
script {
docker.withRegistry( '', registryCredential ) {
dockerImage.push()
}
}
}
}
stage('Remove Unused docker image') {
steps{
sh "docker rmi $registry:$BUILD_NUMBER"
}
}
}
}
因为这里的第一步是克隆,我认为他将此示例构建为 Jenkins 中的独立管道项目(不是来自 SCM 项目的管道脚本)。
如果在构建过程中需要在容器内执行一些脚本,可以使用以下方法:
pipeline {
environment {
registry = 'fill_me'
registryCredentials = 'AWS'
awsRegion = 'us-east-1'
dockerImage = ''
}
options {
disableConcurrentBuilds()
}
agent none
stages {
stage('Build, run, push & upload') {
agent any
steps {
script {
dockerImage = docker.build registry + ":${BUILD_TAG}"
dockerImage.inside {
sh """
echo ${TEST_VAR} >> file.txt
"""
}
docker.withRegistry("https://" + registry, "ecr:" + awsRegion + ":" + registryCredentials) {
dockerImage.push()
}
}
}
}