使用jenkins pipeline实现golang项目的持续集成

Jenkins Pipeline是什么

Jenkins Pipeline(以下称“管道”)是一套插件,使jenkins支持建立持续交付工作流,将自由式的构建工作连接起来执行连续性任务。

为什么要管道?

Jenkins从根本上说是一个支持多种自动化模式的自动化引擎。Pipeline在Jenkins上增加了一套强大的自动化工具,支持从简单的CI持续集成到全面的CD工作流的用例,使jenkins完成从CI到CD角色的转变。通过对一系列相关任务建模,可以利用Pipeline的许多功能:

  • 代码:管道是在代码中实现的,可以被检入到源代码管理中,使整个团队能够编辑、审查和迭代他们的交付流程。
  • 耐久性:通过版本管理,保护工作流代码不易丢失,。
  • 交互性:管道可以前台进行交互,让执行者决定是否继续。
  • 多用途:管道支持复杂的实际CD需求,包括分支/连接,循环和并行执行工作的能力。
  • 可扩展性:Pipeline插件支持对其DSL的定制扩展 和jenkins其他插件集成的选项。

基本概念

Node

节点是Jenkins运行工作空间,即jenkins分配的执行工作的机器。

stage

管道工作流运行的阶段,如拉取代码,单元测试,性能测试,编译,部署等。

step

一项任务,一个步骤。在stage阶段中,要执行的步骤。

语法简介

jenkins pipeline支持两种语法:

  • Declarative Pipeline 声明式管道
    Scripted Pipeline 脚本式管道

Declarative Pipeline

pipeline块定义了整个流水线所做的所有工作。

pipeline {
    agent any  //在任何jenkins节点上都可运行
    stages {
        stage('Build') {    // buid 阶段
            steps {        //build 步骤          

            }
        }
        stage('Test') {     // test 阶段
            steps {
                // 
            }
        }
        stage('Deploy') {   // 部署 阶段
            steps {
                // 
            }
        }
    }
}

Scripted Pipeline

在脚本管道语法中,一个或多个node块在整个管道中执行核心工作。基于groovy语法,使用scripted更灵活。

node {  
    stage('Build') { 
        input
        sh
        git
        checkout
    }
    stage('Test') { 
        // 
    }
    stage('Deploy') { 
        // 
    }
}

input

交互命令,可暂停工作流运行,等待执行者的输入信息,由人为去决定何时继续下一步工作

sh

执行shell命令

git

从gitSCM仓库检出

chekout

支持多种SCM检出,git,svn等

更多详细语法查询: http://本地jenkins:端口/pipeline-syntax/

开始第一个Pipeline应用

创建pipeline有两种方式:

  • Blue Ocean 界面非常常亮
  • 经典界面 可直接在界面编写jenkinsfile

以下使用经典界面创建pipeline。

新建任务

  1. 点击— “新建任务”

  1. 选择— “流水线”类型,并输出任务名称,保存

  1. 进入了job配置界面,现在可以在下图位置进行pipeline编写了。

pipeline编写:Golang Docker

env.PROJ_DIR='src/learningGo'

node {
    withEnv(["GOPATH=$WORKSPACE"]) {     // 设置stage运行时的环境变量
        stage('Init gopath') {
            sh 'mkdir -p $GOPATH/{bin,pkg,src}'  // go运行环境目录
        }
        stage('Get code') {
            checkout([                      // git repo
                $class: 'GitSCM', 
                branches: [[name: '*/master']], 
                doGenerateSubmoduleConfigurations: false, 
                extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'src/learningGo']], 
                submoduleCfg: [], 
                userRemoteConfigs: [[
                    credentialsId: '3d33494a-ee1a-4540-a5e9-27f068a2b859', 
                    url: '[email protected]:peng0208/learningGo.git'
                ]]
            ])
        }
        stage('Build go proejct') {      
            sh 'cd ${PROJ_DIR}/daemon/example; go test && go build && go install'
        }
        stage('Deploy to test') {           // 部署测试环境
            input message: 'deploy to test ?', ok: 'De'
            echo 'docker run'
        }
        stage('Deploy to qa') {             // 部署预发布环境
            input message: 'deploy to qa ?', ok: 'OK!'
            echo 'docker run'
        }
        stage('Deploy to production') {     // 部署生产环境
            input message: 'deploy to production ?', ok: 'OK!'
            echo 'docker run'
        }
    }
}

构建流程简述:

  1. 初始化GOPATH。

    Go项目的编译及安装都在GOPATH下进行,而实际开发中不同go项目的依赖版本及依赖包可能会不同,系统中有多版本共存的情况。为了防止版本冲突,最好针对每个项目都提供单独的GOPATH。因为我采用的方法是,把当前jenkins job的工作目录设置为GOPATH,隔离每个项目的go运行空间。

  2. 从SCM拉取项目代码,检出到GOPATH/src/project_name 目录。

  3. 进入GOPATH/src/project_name 项目目录,进行单元测试、编译、安装等操作。

  4. 编译完成后,将二进制程序打包入docker镜像,推送至docker registry。

  5. 使用新的镜像部署测试=>预发布=>生产环境。

构建运行

图中展示了整个构建流程由多个连续的阶段组成,能够明确的看到每一步的工作完成情况。

当构建到deploy test时,可以看到界面会弹出确认信息“deploy to test ?”,需要点击OK才可继续。

总结

Pipeline将代码获取、单元测试、性能测试、静态检查、打包部署等研发测试部署环节,通过流水线工作集成,全面做到持续交付,简单强大。

你可能感兴趣的:(运维,golang,jenkins,pipeline,运维,CD/CI)