在Jenkins Pipeline中集成Docker

84次阅读
没有评论

问题描述

在使用Jenkins进行CI/CD时遇到了一个问题。他的CI服务器上安装了Jenkins,并且他希望在Docker容器中运行构建和测试,并且使用docker-compose在主机上部署容器。他的问题在于,当他在Jenkinsfile中运行命令时,这些命令会在用于构建和测试的Docker容器内部运行,而不是在主机上运行。

以下是他的Jenkinsfile的一部分:

pipeline {
    agent {
        dockerfile {
            filename "Dockerfile"
        }
    }
    stages {
        stage("Run unit tests") {
            steps {
                sh "cp environments/.env.build .env"
                sh "vendor/bin/phpunit"
            }
        }
        stage('Deploy to test') {
            when {
                branch "develop"
            }
            steps {
                sh 'docker-compose up -d'
            }
        }
        stage("Archive") {
            steps {
                sh "zip -r dist.zip ."
            }
        }
    }
    post {
        always {
            archiveArtifacts artifacts: "dist.zip"
            junit "reports/phpunit.report.xml"
        }
    }
}

用户明确表示不希望在Docker容器内部运行docker-compose命令,而希望在Jenkins所在的主机上运行该命令。

解决方案

方案1:使用多个Pipeline

一个解决方案是使用多个Pipeline来实现。第一个Pipeline在Docker中运行测试,当测试完成后,可以调用另一个作业来在Jenkins主机上运行docker-compose命令。

以下是一个示例配置:

步骤1:第一个Pipeline运行测试

pipeline {
    agent {
        dockerfile {
            filename "Dockerfile"
        }
    }
    stages {
        stage("Run unit tests") {
            steps {
                sh "cp environments/.env.build .env"
                sh "vendor/bin/phpunit"
            }
        }
    }
}

步骤2:第二个Pipeline运行部署

创建一个新的Pipeline,用于在Jenkins主机上运行docker-compose命令。你可以使用Jenkins的build步骤来触发这个Pipeline,并将参数传递给它。

pipeline {
    agent any
    parameters {
        string(name: 'paramAValue', defaultValue: '', description: 'Value for ParamA')
        string(name: 'paramBValue', defaultValue: '', description: 'Value for ParamB')
    }
    stages {
        stage('Deploy using docker-compose') {
            steps {
                sh 'docker-compose up -d'
            }
        }
    }
}

通过这种方式,你可以分离测试和部署阶段,确保docker-compose在Jenkins主机上运行,而不是在Docker容器内部运行。

方案2:使用shell脚本

另一种方法是在Jenkinsfile中使用shell脚本来运行docker-compose命令。确保在测试阶段之后,即在退出Docker容器之后运行部署命令。

以下是一个示例:

pipeline {
    agent {
        dockerfile {
            filename "Dockerfile"
        }
    }
    stages {
        stage("Run unit tests") {
            steps {
                sh "cp environments/.env.build .env"
                sh "vendor/bin/phpunit"
            }
        }
        stage('Deploy to test') {
            when {
                branch "develop"
            }
            steps {
                script {
                    sh "exit" // 退出Docker容器
                    sh 'docker-compose up -d'
                }
            }
        }
        stage("Archive") {
            steps {
                sh "zip -r dist.zip ."
            }
        }
    }
    post {
        always {
            archiveArtifacts artifacts: "dist.zip"
            junit "reports/phpunit.report.xml"
        }
    }
}

通过在Deploy to test阶段中添加exit命令,你可以在运行docker-compose之前退出Docker容器,从而确保docker-compose在Jenkins主机上运行。

请根据你的需求选择适合的解决方案。

正文完