持续集成的执行方式

持续集成的两种执行方式

  1. 常规执行方式
  2. 云主机执行方式

两种执行方式的差异

常规模式:只能选择给出的 agent 模版,例如 default, java-8, python-3.5, ruby-2.3, go-1.11 等

云主机模式:下可以构建任何语言,任何版本。例如 java 6 ~ 11, php 5.2, php 7.0 ~ 7.3

常规执行方式

常规执行方式运行在容器下,通过 agent 指定使用那种镜像来运行构建程序。例如:

pipeline {
    agent {
        // 此处设定构建环境,目前可选有
        // default, java-8, python-3.5, ruby-2.3, go-1.11 等
        // 详情请阅 https://e.coding.net/help/knowledge-base/how-to-use-ci/#agents
        label "default"
    }
    stages  {
        stage("检出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }
        stage("构建") {
            steps {
                echo "构建中..."
                sh 'go version'
                sh 'node -v'
                sh 'java -version'
                sh 'php -v'
                sh 'python -V'
                sh 'gcc -v'
                sh 'make -v'
                // 请在这里放置您项目代码的单元测试调用过程,例如:
                // sh 'mvn package' // mvn 示例
                // sh 'make' // make 示例
                echo "构建完成."
                // archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
            }
        }
        stage("测试") {
            steps {
                echo "单元测试中..."
                // 请在这里放置您项目代码的单元测试调用过程,例如:
                // sh 'mvn test' // mvn 示例
                // sh 'make test' // make 示例
                echo "单元测试完成."
                // junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }
        stage("部署") {
            steps {
                echo "部署中..."
                // 请在这里放置收集单元测试报告的调用过程,例如:
                // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例:
                // sh './deploy.sh' // 自研部署脚本
                echo "部署完成"
            }
        }
    }
}

云主机执行方式

云主机执行方式下,您可以自由的使用这台云主机来构建,可以安装 JDK,GCC 等构建工具,也可以使用预装的 Docker 来构建,以下提供了示例配置供参考。

本地模式

这种方式必须设置 agent 为 agent any,持续集成将在操作系统下运行构建程序。

pipeline {
    agent any
    stages  {
        stage("检出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }
        stage("环境") {
            steps {
                sh 'apt update'
                  sh 'apt install -y maven'
                  sh 'java -version'
                  sh 'mvn --version'
            }
        }
        stage("构建") {
            steps {
                echo "构建中..."
                sh 'mvn package' // mvn 示例
                echo "构建完成."
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
            }
        }
        stage("测试") {
            steps {
                echo "单元测试中..."
                sh 'make test' // make 示例
                echo "单元测试完成."
                junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }
        stage("部署") {
            steps {
                echo "部署中..."
                // 请在这里放置收集单元测试报告的调用过程,例如:
                // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例:
                // sh './deploy.sh' // 自研部署脚本
                echo "部署完成"
            }
        }
    }
}

使用预装 Docker 构建

这种方式可以使用 hub.docker.com 上的镜像资源,或使用 Dockerfile 创建自定义镜像。可以构建任何语言,任何版本,例如:

docker.image('maven:latest')
docker.image('php:latest')
docker.image('php:5.2.17')
docker.image('go:1.11.00')

完整的例子:

node {
    stage("检出") {
        sh 'ci-init'
        checkout(
          [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
        )
        sh 'pwd'
    }
    docker.image('maven:latest').inside("-v /root/.m2:/root/.m2") {
        stage("构建") {
                echo "构建中..."
                sh 'java -version'
                sh 'mvn package -Dmaven.test.failure.ignore -Dmaven.test.skip=true' // mvn 示例
                echo "构建完成."
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
        }
        stage("测试") {       
                echo "单元测试中..."
                sh 'java -jar target/webflux-0.0.1-SNAPSHOT.jar &'
                sleep 20
                sh 'mvn test -Dmaven.test.failure.ignore' // mvn 示例
                echo "单元测试完成."
                junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
        }
        stage("部署") {
                echo "部署中..."
                // 请在这里放置收集单元测试报告的调用过程,例如:
                // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例:
                // sh './deploy.sh' // 自研部署脚本
                echo "部署完成"
        }
    }
}

相关文章