[From] https://testerhome.com/topics/10328

前言

最近由于项目需要,接触到了Jenkins 2.0版本,其中最重要的特性就是提供了对pipeline的支持。
简单的来说,就是把Jenkins1.0版本中,Project中的相关配置信息,如SVN/Git的配置,Parameter的配置等都变成Code,即Pipeline as Code。
这样的优势为可以通过写代码的形式配置Project,且Jenkins中内置了常用的steps。实现了构建步骤代码化、构建过程视图化。
其他的Jenkins基础这里不多说了,这里主要介绍最近遇到的问题及其处理方法。一方面是自己总结和整理一下,另一方面也可以供他人参考,少踩坑。

选择Declarative Pipeline还是Scripted Pipeline

最开始的Pipeline plugin,支持的只有一种脚本类型,就是Scripted Pipeline;
Declarative Pipeline为Pipeline plugin在2.5版本之后新增的一种脚本类型,与原先的Scripted Pipeline一样,都可以用来编写脚本。

使用哪一种脚本格式呢,我又纠结了,也查询了些资料。
https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline
http://jenkins-ci.361315.n4.nabble.com/Declarative-pipelines-vs-scripted-td4891792.html

最后,我还是选择了Declarative Pipeline,这也是后续Open Blue Ocean所支持的类型。
相对而言,Declarative Pipeline比较简单,如果Groovy很熟的,用Scripted Pipeline可能更顺手。
另外,Declarative Pipeline中,是可以内嵌Scripted Pipeline代码的。

设置和获取执行参数

原先在Jenkins 1.0的时候,常用的一个设置就是“ "This build is parameterized",通过获取参数值,执行后续相关的判断及操作。
在pipeline中,可以这样设置:

#!/usr/bin/env groovy
pipeline{
agent none
options{
disableConcurrentBuilds()
skipDefaultCheckout()
timeout(time: , unit: 'HOURS')
timestamps()
}
parameters{
string(name: 'PERSON', defaultValue: 'among中文', description: '请输入中文')
booleanParam(name: 'YESORNO', defaultValue: true, description: '是否发布')
}
stages{
stage('test stage')
{
agent
{
label 'master'
}
steps
{
echo 'Hello, stage1'
echo "Hello ${params.PERSON}"
echo "Hello ${env.PERSON}"
scrip
{
def input = params.YESORNO
if (input)
{
echo "you input is ${input},to do sth"
}
else
{
echo "you input is ${input},nothing to do"
}
}
}
}
}

环境变量的问题

通过Jenkins 执行相关sh的时候,环境变量中,不会默认继承/etc/profile 和 ~/.profile 等环境变量。
这个时候就很麻烦了,尤其在一些依赖环境变量操作的sh脚本时。

可以这样来做,一是在增加node节点时,自己设置环境变量,如:

 

也可以在代码中这么写。写 withEnv ,或是直接在shell中先source profile文件。然后在执行相关命令。

steps
{
withEnv(['TPS=amtps']) {
// do sth
}
//
sh 'source /etc/profile && source ~/.bash_profile && env'
dir('/root')
{
sh '(source /etc/profile;source ~/.bash_profile;sh ./ee.sh)'
}
}

Jenkins中nohup后进程还是起不来的问题

在普通的shell环境中,nohup,并且& 某个程序后,会抛到后台执行,在退出当前shell环境后,程序依然可以执行。
但是在Jenkins中,通过nohup,且使用&之后,step结束后,执行的程序还是会退出,导致程序起不来。

尝试和验证了很多方法,后面都是这样解决的。
修改JENKINS_NODE_COOKIE的值,这样后续结束的时候,后面的sh程序就不会被kill掉了。
适用版本:Jenkins 2.46版本,版本如差异较大,可能不一致。当时为了解决这个问题,折腾了很久,找的资料也比较老了,很多都没用,特定记录一下。

steps
{
sh 'JENKINS_NODE_COOKIE=dontKillMe nohup python3 /home/among/pj/my_py/monitor/amon/amon.py >/tmp/run.log 2>&1 &'
}

shell出错后继续,取shell输出值。

这2个比较简单,看例子就知道了。

steps
{
sh returnStatus: true, script: "ps -ef|grep amon|grep -v grep|awk '{print \$2}'|xargs kill -9"
script
{
def pid = sh returnStdout: true ,script: "ps -ef|grep amon|grep -v grep|awk '{print \$2}'"
pid = pid.trim()
echo "you input pid is ${pid},to do sth"
sh "kill -9 ${pid}"
} }

以上就是最近遇到的一些问题,后续遇到了,我再补充吧。
一些地方有可能存在问题或有更好的解决方法,欢迎大家提出和完善。

[转] Jenkins pipeline 踩坑集合的更多相关文章

  1. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  2. hadoop之mapReduce踩坑集合

    居然没有把这个目录,之前还想爆粗口的,还是算了. 上苷酸菜: 1.对于mapreduce中FileInputFormat只输入input文件根目录的方法尝试. 很简单好吧: step1: FileIn ...

  3. python2 => python3 踩坑集合

    报错内容: ModuleNotFoundError: No module named 'md5' 解析: 这是 python2 的库,python3 已经把它包含进 hashlib 库里了 解决方法 ...

  4. fibos开发踩坑集合

    fibos.js API资料: 与eosjs相比,fibos.js没有添加新功能,可以在eosjs项目页面https://developers.eos.io/eosio-nodeos/referenc ...

  5. Vue3.x+element-plus+ts踩坑笔记

    闲聊 前段时间小颖在B站找了个学习vue3+TS的视频,自己尝试着搭建了一些基础代码,在实现功能的过程中遇到了一些问题,为了防止自己遗忘,写个随笔记录一下嘻嘻 项目代码 git地址:vue3.x-ts ...

  6. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  7. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

  8. spring-boot-starter-amqp踩坑记

    踩坑记录 近日在用spring boot架构一个微服务框架,服务发现与治理.发布REST接口各种轻松惬意.但是服务当设计MQ入口时,就发现遇到无数地雷,现在整理成下文,供各路大侠围观与嘲笑. 版本 当 ...

  9. Spark踩坑记——共享变量

    [TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...

随机推荐

  1. LWIP网络接口管理

    LAN8720+RJ45+MAC(STM32F4自带的)构成了网络接口层.

  2. Qt的翻译文件QTranslator不能使用问题总结(原)

    笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句. 如果将宏定义的命名空 ...

  3. jquery 常用工具方法

    inArray(value, array [, fromIndex ])方法类似于原生javascript的indexOf()方法,没有找到匹配元素时它返回-1.如果数组第一个元素匹配参数,那么$.i ...

  4. iOS AppStore个人开发者账号申请

    一.申请Apple Developer账号 1.注册App ID 1.打开苹果开发者网页,选择Account,注册Apple ID.   2.填写注册信息 3.地区选择China,填写好验证码,点击C ...

  5. 用Java实现多线程服务器程序

    一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...

  6. windows部署PHP开发的cms系统

    近日,由于公司服务器中了病毒,导致公司官网上的源代码文件被篡改,而且也被谷歌标记为危险网站,而且病毒很顽固,难已删除,迫不得已只好将服务器系统重做,数据全部格式掉. 数据全部都没有,网站当然要重新发布 ...

  7. on where having总结

    1. ON 和WHERE 所有的查询都回产生一个中间临时报表,查询结果就是从返回临时报表中得到.ON和WHERE后面所跟限制条件的区别,主要与限制条件起作用的时机有关, ON根据限制条件对数据库记录进 ...

  8. python - seletors实现IO多路复用

    服务端 from socket import * import selectors sel = selectors.DefaultSelector() def accept(server_fileob ...

  9. elk日志分析平台安装

    ELK安装 前言 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又 ...

  10. BZOJ1901 Dynamic Rankings|带修主席树

    题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...