移动测试开发 Jenkins 实践——创建 Pipeline 的两种方式

opentest-oper@360.cn · 2020年05月21日 · 2151 次阅读

近期使用 Jenkins 帮业务团队搭建过一次 Pipline,并将测试流程加入到了 Pipline 中,将搭建过程的做了简单记录。考虑到项目的保密性,该文章仅演示搭建步骤和工具使用,文中的代码均为伪代码。

一 、JenkinsPipeline 简介与安装

了解 Jenkins 的人相信对 pipeline 都有所耳闻,pipeline 是 Jenkins2.0 推出的一套 Groovy DSL 语法,将原本独立运行于多个 Job 或者多个节点的任务统一使用代码的形式进行管理和维护。
推荐使用 docker 镜像的方式安装 Jenkinspipeline,因为 Jenkins 是用 java 编写的,需要安装 java 环境,配置环境变量等这些操作,有时候可能还会遇到 jdk 版本不兼容的问题。为了不让繁琐的安装过程浇灭我们的学习热忱,还是推荐用 docker 镜像的方式部署,安装步骤非常简单:
1.拉取 JenkinsBlueOcean 镜像
docker pull jenkinsci/blueocean

2.创建挂载目录
mkdir /var/jenkins_home

3.启动 Jenkins
docker run -d -p 8888:8080 -p 50000:50000 -v jenkins:/var/jenkins_home –v /etc/localtime:/etc/localtime --name jenkinsci-blueocean -d jenkinsci/blueocean

如果你是使用以上步骤安装 Jenkins,登录之后在页面的左侧导航栏就能看到如下所示的图标:

如果你已经安装了 Jenkins 普通版本,可以在【Manage Jenkins】——【ManagePlugins】中搜索 BlueOcean 安装,安装完之后同样在主界面做侧导航栏可以看到上图中的图标。
安装完成,我们就开始进入主题,使用两种不同的方式创建 Pipeline。

二、经典模式下创建 Pipeline

创建 pipeline 一共两种方式,第一种方式我们称之为传统方式,是使用 Jenkins 经典界面,通过自己编写 PipelineScript 来组织流水步骤的。下面用图示的方式简单介绍一下这种方式。
1.登录 Jenkins,点击左侧的新建,创建新的构建任务。

2.跳转到如下界面,输入自己的任务名称和描述信息之后,选择 “流水线” 选项并点击下方的确定按钮即创建了一个 Pipeline 任务。

3.跳转到 Pipeline 的设置页面,我们可以看到有四个 tab,我们会针对每一个 tab 做详细介绍。

General

General 是 Pipeline 的一些基本配置。名称,描述和一些基本设置。
以下简单介绍几个常用设置。其余没有介绍的设置项,大家可以参考 Jenkins 的官方文档或者帮助文档。

①.GitHub 项目
该 pipeline 的源代码托管在 Github 中,选中此选项,可以添加 github 中的项目地址

②.Preserve stashes from completed builds
想保留最近几次历史构建就可以勾选此项并填入想要保留的构建次数。每次构建都需要占不少的空间,因此不建议大量保存构建历史。

③.丢弃旧的构建
服务器的资源是有限的,如果保存了太多的历史构建, Jenkins 可能会变慢,所以请合理设置 “保持构建天数” 和 “保持构建的最大个数” 的值,避免资源占用过多。

我这里设置了丢弃构建,仅保留最近一周的构建历史,不限定构建次数。

构建触发器

构建触发器很好理解,就是 pipeline 构建的触发条件。以下简单介绍一下各个触发条件。这些触发条件可以根据项目需要选择多个,组合使用。

我的代码托管在 gitlab 中,我希望在代码有更新时自动触发构建,所以选择了 “轮询 SCM”。

高级项目选项
这个是给项目设置一个展示名称,没有特殊作用,不需要过多关注。

流水线

这一部分是 Pipeline 的主要部分,在这一步我们将开始定义流水线
定义流水线使用的是 Groovy 脚本,保存脚本有两种方式,第一种是直接写在 Jenkins 工程中,另一种是存放在代码仓库项目目录下的 Jenkinsfile 中,实际项目中大多选择将脚本存放在项目目录中,但这仅限于项目数量不多的情况下使用。如果项目过多,Jenkinsfile 散落在各个项目中,也会不便维护,这时候可以创建目录集中保存 Jenkinsfile,便于查找和维护。
选择定义流水线的方式

我使用的是【PipelinescriptfromSCM】,只添加了代码仓库地址和令牌信息,其余保持默认。

当然,在你考虑用这种方式创建流水线之前,你必须已经设计好的流水线的步骤,并且写好了可靠的 Jenkinsfile。

Pipeline 支持两种语法,一种是 Declarative Pipeline(在 Pipeline 2.5 中引入)和 Scripted Pipeline。Declarative Pipeline 对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。Scripted pipeline 更加灵活,因为 Groovy 本身只能对结构和语法进行限制,对于更复杂的 pipeline 来说,用户可以根据自己的业务进行灵活的实现和扩展。由于篇幅有限所以在此只介绍使用最为广泛的 Declarative Pipeline。

在写 Jenkinsfile 之前我们先来熟悉一些名词。
●Agent:在 Jenkins 集群中,一个 agent 相当于一个 slave 机器,接收并执行 master 机器分派的任务。
●Stage:Pipeline 中的不同阶段,例如:“构建”,“测试” 和 “部署”。
●Step:步骤,Step 是最基本的操作单元,小到创建一个目录,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供。

下面是我编写的一个由【编译】——【编译 Docker 镜像】——【部署】——【测试】这几个阶段组成的一条流水线。不熟悉 PipelineScript 的同学,可以先熟悉一下语法,语法不是文章关注的重点。

pipeline {
  agent any  //agent 必须放在pipeline的顶层定义或stage中可选定义,放在stage中就是不同阶段使用
  stages {  //Pipeline 的主体部分,声明不同阶段,比如 构建,部署,测试
    stage('Build') {  //编译阶段
      steps {
        sh 'pwd'
        git(url: 'https://xxx.xxx.xxx.xxx/xxxxxxxx/xxxxxxx', poll: true, credentialsId: '0000000-0000-0000-0000-000000000000') //拉取代码
        echo '使用你的编译工具进行编译'  //编译
        archiveArtifacts(artifacts: 'testProject', onlyIfSuccessful: true)  //编译制品归档
      }
    }

    stage('Docker Build')  //编译docker 镜像文件
            agent any
            steps {
                unstash 'test'
                sh "docker login"
                sh "docker build"
                sh "docker push "
                sh "docker rmi"
            }

        }
    stage('Deploy') { //部署阶段
        agent {  //在stage中特别声明agent,该stage就在声明的agent中去执行
            docker {
                image 'image_name'
            }
        }
        steps { //执行步骤
            sh "mkdir -p ~/.kube"
            echo '添加部署步骤完成部署 '
            echo '启动服务'
        }

    stage('Test') { //测试阶段
      steps {
        echo '测试阶段'
        git(url: 'https://xxx.xxx.xxx.xxx/xxxxxxxx/xxxxxxx', poll: true, credentialsId: '0000000-0000-0000-0000-000000000000')
        echo '执行测试用例'
      }
    }

  }
  environment {  //环境变量,在satge中使用${variable name}来调用
    image_name = 'testProject'
    project_path = '../testProject'
    K8S_CONFIG = credentials('jenkins-k8s-config')
    GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
  }
}

值得注意的是,执行 Pipeline 的过程中会有一些中间产物,如 apk 包、docker 镜像文件,这些统一叫做制品。制品会被保存在 JenkinsWorkplace 中,如果要使用制品,需要添加【制品归档】的步骤,这样就可以通过页面下载制品。

如此便可定义一条 Pipeline,经典模式下创建 Pipeline 是使用最为广泛的一种方式。但是这种方式使用起来有一定门槛,那就是你必须熟悉 PipelineScript 的语法规则。那如果你说我是一个新手,并没有语言基础,是不是就不能自己创建 Pipeline 了?当然不是,下面要介绍的第二种方式,就不需要你手写代码了,Jenkins 会自动帮你生成。

三、使用 BlueOcean 插件创建 Pipeline

还记得文章开头安装的 BlueOcean 插件吗?这个插件提供了一个可视化的界面,可以通过交互式的方式创建 Pipeline,大大降低了使用门槛。下面我们就来体验一下吧!
在 Jenkins 主页,点击 “打开 BlueOcean” 就可以进入如下界面

点击 ‘创建新的流水线’ 就跳转到了创建页面

选择代码仓库,填入地址和令牌,创建一条流水线。

创建完之后,添加阶段,并根据你的需要添加不同的步骤。

可视化创建 Pipeline 比较 “傻瓜式”,操作起来非常简单,这里就不再详细介绍,有兴趣的小伙伴可以自己实操一下练一练。

需要注意的是,使用 BlueOcean 创建 Pipeline 会自动生成一个 Jenkinsfile 文件,最后会保存在代码仓库的项目目录下面。里面生成的步骤跟我们上面手写的 Jenkinsfile 一样。每次修改流水线工作流程并提交修改会修改一次 Jenkinsfile,并在代码仓库中生成一条修改记录。

以上就是创建 Pipeline 的两种方式,各位小伙伴可根据自己项目的需要选择不同发方式。在项目数量比较少的情况下,可以使用 BlueOcean 来创建。如果项目很多或者 Pipeline 结构比较复杂,使用这种方法就会非常慢,而且 Jenkinsfile 散落在各个项目目录中,维护起来不方便,这时候更推荐使用经典模式自己写 Jenkinsfile 的方式创建和维护。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册