jenkins实践pipeline教程

Posted JackLee18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jenkins实践pipeline教程相关的知识,希望对你有一定的参考价值。

pipeline的定义

  简而言之,就是一套工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
  目前比较流行的pipeline实践方式如下。

  • gitlabrunner: 是gitlab内置的一套pipeline框架,脚本是yml语言。
  • jenkins: 通过安装插件的形式实现,脚本语言是jenkinsfile。

由于团队中的代码仓库没有使用gitlab,因此我这边选择了jenkins来实践pipeline。

什么是jenkinsfile

  jenkinsfile 就是一个脚本文件,放在项目的根目录下,能够被jenkins识别并自动触发pipeline流程,jenkinsfile的编写可以参考jenkins官网:jenkinsfile语法

pipeline一期目标

  团队第一期目标是:实现开发pod库时提交代码自动触发单元测试,不同分支能执行不同的策略,执行不同的pipeline任务,能够自动发布pod。pipeline失败时能够发送邮件进行通知,pipeline流成如下:

jenkinsfile 脚本如下:

pipeline 
  agent any

  parameters 
     string(name: 'PROJECT_NAME', defaultValue: 'test_rootlib_ios', description:'')
  

  stages 
    stage('prepare') 
      steps 
          sh './ci_prepare.sh' 
      
      post 
          failure 
            post_email('prepare','fail')
          
          aborted 
            post_email('prepare','aborted')
          
      
    

    stage('unit_test') 
      steps 
        sh './ci_unit_test.sh'
      
      post 
          failure 
            post_email('unit_test','fail')
          
          aborted 
            post_email('unit_test','aborted')
          
      
    

    stage('lib_lint') 
       when 
          branch 'dev'
       
       steps 
          sh './lib_lint.sh'
       
       post 
          failure 
            post_email('lib_lint','fail')
          
          aborted 
            post_email('lib_lint','aborted')
          
       
    

    stage('publish_pod') 
      when 
          branch 'dev'
       
       steps 
          sh './repo_tag.sh'
       
      post 
          failure 
            post_email('publish_pod','fail')
          
          aborted 
            post_email('publish_pod','aborted')
          
      
    
    stage('pipeline_end') 
      when 
          branch 'dev'
      
      steps 
          echo 'pipeline_end'
      
      post 
          success 
            post_email('pipeline_end','success')
          
          failure 
            post_email('pipeline_end','fail')
          
          aborted 
            post_email('pipeline_end','aborted')
          
      
    

  



def post_email(String stage, String status) 
  mail to: '12345678@qq.com',
  subject: "【$PROJECT_NAME】$stage $status",
  body: "build_id: $env.BUILD_NUMBER\\nbranch: $env.GIT_BRANCH\\nstage: $stage\\nbuild_url: $env.BUILD_URL"

脚本思路:
1,每次提交时都会触发pipeline,首先执行准备阶段的任务主要是清理环境,pod install之类的操作。然后触发单元测试。测试成功后没有任何提示,测试失败时会通过邮件进行通知
2,dev分支是发版分支,当pod准备要发布时,将版本号改好,然后先执行prepare阶段的任务,然后执行单元测试,接着执行pod lint的任务,然后执行发版的操作,发版成功后会发送邮件进行通知。ps:后期会执行项目自动集成相关的工作。

blueOcean

blueOcean 是jenkins提供的可视化的形式编辑jenkinsfile的一个插件,大家可以体验下,这里就不多说了,感觉刚开始入门的时候可以试试,可视化没有直接在脚本上编辑流程灵活。
参考网址:blueOcean

遇到的坑点

邮箱

  在最开始的实践是,本来打算用公司的邮箱进行通知,后来发现公司的邮箱不支持类似配置。我这边选择了163邮箱配置在jenkins上进行通知。

bundle exec命令

由于团队中对组件化进行预编译,实现了二进制形式的集成,在准备阶段执行如下命令的时候一直报错

bundle config set deployment 'true'
bundle install
bundle exec pod install --repo-update

后来参考网上,在jenkins进行了全局环境变量配置。

内存不足

  最开始时候设置了pipeline的配置,当分支删除时,对应的pipeline构建会被删除,但是由于电脑配置太差,加上分支较多,出现了内存不足的现象。直接造成jenkins坏掉了,为了解决这个问题,我在jenkinsfile上写了一个脚本定期去删除项目中各个分支中的构建。

脚本具体如下:

#!/bin/bash
cd ..
cd ..
cd jobs
projects=("项目名字" "项目名字" "项目名字" "项目名字")
for project in $projects[*]
do
#进入对应项目目录
  cd $project
  project_dir=$(pwd)
  echo "project dir is:$project_dir"
  cd branches
  pwd=`pwd`
  filelist=`ls $dir`
  for biranch in $filelist:
  do
  #进入对应项目分支目录
    cd biranch
    rm -rf builds
    mkdir builds
    cd ..
  done
  
  cd ..

done

更多干货文章,扫描下方二维码关注公众号

以上是关于jenkins实践pipeline教程的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins Pipeline 插件十大最佳实践!

最佳实践Jenkins 2.0多分支Pipeline改造

[持续交付实践] pipeline:pipeline 使用之快速入门

基于Jenkins pipeline的持续交付流水线介绍及实践

Jenkins的Pipeline脚本在美团餐饮SaaS中的实践

Jenkins pipeline脚本编写