【问题标题】:How to run Docker builds in Jenkins on Windows Server 2016/2019?如何在 Windows Server 2016/2019 上的 Jenkins 中运行 Docker 构建?
【发布时间】:2019-05-03 13:23:32
【问题描述】:

我想在 Docker 容器中的 Windows 节点上运行 Jenkins 构建。

【问题讨论】:

    标签: windows docker jenkins


    【解决方案1】:

    对于那些寻找即用型答案而不是参考无用文档页面的人,这里有一个关于如何在 Windows 2016/2019 上运行 Docker 构建的 Jenkinsfile sn-p:

    // invokeDocker.groovy
    def call(image, cmd) {
        powershell """
            docker run `
              --rm `
              -w "${env.WORKSPACE}" `
              -v "${env.WORKSPACE}:${env.WORKSPACE}:rw" `
              -e "WORKSPACE=${env.WORKSPACE}" `
              -e "BUILD_NUMBER=${env.BUILD_NUMBER}" `
              $image powershell -C "$cmd"
        """
    }
    

    您应该使用共享库,例如。使用多阶段管道:

    // runDockerStages.groovy
    def call(Map pipelineParams) {
    
        if(!pipelineParams){
            pipelineParams = [:]
        }
    
        pipeline {
            agent { label "DOCKER-BUILDER" && "SERVER2019" }
    
            environment {
                SCRIPTS="__scripts"
            }
    
            options {
                timeout(time: pipelineParams.timeoutMinutes ? pipelineParams.timeoutMinutes : 180, unit: 'MINUTES')
            }
    
            stages {
                stage('Deploy scripts'){
                    steps {
                        initializeWorkspace();
                    }
                }
    
                stage('Trigger custom build stages'){
                    steps {
                        executeDockerBuildStages(pipelineParams.Stages);
                    }
                }
    
                stage('Publish'){
                    steps{
                        script{
                            publishAllArtifacts();
                        }
                    }
                }
            }
            post{
                success{
                    // Set latest build URL on Jira case
                    updateJira();
                }
            }
        }
    }
    
    void executeDockerBuildStages(stageInfos) {
        stageInfos.each { dockerStage ->
            echo("---- About to run [${dockerStage.Title}] stage ----")
            script {
                stage(dockerStage['Title']) {
                    invokeDocker(dockerStage['DockerImage'], dockerStage['Script'])
                }
            }
        }
    }
    

    您的 Jenkinsfile 将如下所示:

    runDockerStages(
      [ 
        Stages: [
          [ Title: 'Prepare', DockerImage: "imagine/jenkins-pipeline/buildbase-windows:1.0.0-windowsservercore-1809", Script: ". .\\build\\build.Prepare.ps1" ],
          [ Title: 'Test', DockerImage: "imagine/jenkins-pipeline/dotnetcore:2.2.203-windowsservercore-1809", Script: ". .\\build\\build.Test.ps1" ],
          [ Title: 'UI', DockerImage: "imagine/jenkins-pipeline/nodejs:10.15.0-windowsservercore-1809", Script: ". .\\build\\build.ui.ps1" ],
          [ Title: 'Service', DockerImage: "imagine/jenkins-pipeline/dotnetcore:2.2.203-windowsservercore-1809", Script: ". .\\build\\build.service.ps1" ]
      ]
    )
    

    【讨论】:

    • 感谢您的研究/解决方案。真的很不错。
    • @DoomVroom:很高兴能帮上忙。 :)
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2021-07-04
    • 2017-04-22
    • 2018-03-21
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多