欢迎访问我的博客,你的支持,是我最大的动力!

Jenkins2权威指南5-系统/分析工具/制品/容器集成与jenkins接口

Linux 小马奔腾 358℃ 评论
目录:
[显示]

操作系统环境集成

shell 工作空间 环境 文件

内置步骤为返回值提供多个集成点,可以在流水线中利用这些集成点来执行后续操作或决策

block步骤,允许块内步骤使用隔离环境,如隔离环境变量

shell步骤

sh步骤
sh 'xxxxx' //返回信息默认不会与流水线有过多集成
选项:
script (脚本) 可使用多行脚本,需要用三重引号括起来
encoding (编码) 默认为utf-8
returnStdout (返回标准输出) 布尔值,默认false,仅将stdout打印到控制台日志中;设置为true时stdout将作为字符串返回 (可使用trim()去除行尾换行符)
returnStatus (返回状态) 布尔值,默认false,非0返回值代表步骤失败并抛出异常
注意:returnStdout和returnStatus只能二选一

# 获取输出到listing中
def listing = sh script: 'ls -al /',returnStdout:true

set选项
默认,若shell脚本中存在错误,shell将不会停止,它偿试执行所有的行,因此,sh步骤自动包含一个set -e选项(出错时停止)
特殊情况下,可关闭该功能,添加 set +e 的独立行
sh步骤还包含一个 -x 选项(调试信息),也可单独关闭,如 set +xe

语言解释器(在第一行添加)
使用perl或python

从共享库执行shell脚本
需要将脚本放在 resources 目录中,然后使用 libraryResource 步骤加载,然后可以直接传给sh步骤执行

检查平台
isUnix 布尔检查,linux/mac返回true; windows返回false

bat步骤
windows下的sh步骤,选项和使用方法一样

powershell步骤
需要powershell插件,与bat步骤类似

环境变量

环境变量的使用方法 如 显示PATH变量值
echo "${env.PATH}"
echo "${PATH}"
echo env.PATH
echo PATH
其中,env命令空间表示脚本中可用的环境,不加env前缀的是局部变量,会覆盖全局变量的值(若局部变量已定义)
建议都添加env前缀

环境变量的赋值
env.PATH = env.PATH + ':/home/diyuser'
声明式流水线中有专门的 environment 步骤

withEnv步骤
设置的变量仅在该代码块内有效

取消设置环境变量,值留空即可,如 env.<NAME> =

自由风格类型项目中,EnvInject 插件可以注入环境变量(该插件与流水线不兼容)

工作空间

创建自定义工作空间
ws 目录,可以是相对路径或绝对路径,若目录不存在会自动创建

清理工作空间
cleanWs()

要删除的文件模式,只删除匹配的文件
cleanWs(patterns:[[pattern:'*.bak',type:'INCLUDE'],[pattern:'*.tmp',type:'EXCLUDE']])
# Ant语法,所有子目录中的这些文件,可写为 '**/*.tmp'

使用其他删除程序
cleanWs externalDelete:'shred -uf %s'

其他参数:布尔值
- cleanWhenAborted,默认true
- cleanWhenFailure,默认true
- cleanWhenNotBuilt,默认true
- cleanWhenSuccess,默认true
- cleanWhenUnstable,默认true
- deleteDirs,默认false
- notFailBuild,默认true,为false时,表示当清理步骤失败时,整个构建失败

文件和目录操作

读取文件
readFile 读入文件内容并作为字符串传回
file参数是基于当前目录的相对路径
readFile 'dir1/dir2/filename'
readFile encoding:'UTF-8',file:'dir1/dir2/filename'

写入文件
file参数也是基于当前目录的相对路径
writeFile encoding:'UTF-8',file:'dir1/dir2/file.out',text:'output context'

检查文件是否存在
基于当前目录的相对路径
fileExists 'build/reports/index.html'

dir步骤
切换当前工作目录,块步骤
指定的目录可为相对路径也可为绝对路径
若目录不存在,会尝试创建(需要有相应权限)
块内的步骤使用的相对路径,是基于设置中的步骤的

注意,ws提供锁定功能,多个任务不能同时使用相同的工作空间目录;dir没有锁定功能

pwd步骤
将当前目录作为字符串传回
def tmpDir = pwd tmp:true

deleteDir步骤
递归删除目录
dir('tmpDir'){deleteDir()}

文件操作插件 File Operations,提供fileOperations步骤
os无关性

分析工具集成

SonarQube 代码质量分析

构架和设计/注释/编码规则/潜在错误/重复代码/单元测试/复杂度
质量门 Quality Gate; 质量配置文件 Quality Profile

SonarQube扫描程序(SonarQube Scanner)

与jenkins集成
安装并运行应用程序,安装对应的jenkins插件,完成全局系统配置和工具配置,就可以在流水线中使用SonarQube
SonarQuber插件,提供withSonarQubeEnv代码块

使用SonarQube分析的结果
在SonarQube中设置webhook,让jenkins在继续之前等待来自该webhook的通知
处理webhook使用waitForQualityGate步骤

也可以直接在 Gradle 中使用 SonarQube 集成

JaCoCo 代码覆盖率

测试用例运行可以覆盖到的代码量,通过检查Java类文件来实现

JaCoCo与流水线集成
1、安装JaCoCo
2、在jenkins中安装JaCoCo插件
3、(没有全局配置项)构建后步骤

制品管理集成

JFrog Artifactory

指纹,追踪制品与构建任务之间的关联关系,实际上是md5值

Artifactory与Jenkins集成
1、安装Artifactory
2、在jenkins中安装Artifactory插件 >2.5.0
3、在全局配置中配置Artifactory

发布路径(部署服务器)
依赖解析地址(解析服务器)

def server = Artifactory.server "Local Artifactory"
def artifactoryGradle = Artifactory.newGradleBuild()
artifactoryGradle.tool = "gradle3"
artifactoryGradle.deployer repo:'libs-snapshot-local',server:server
artifactoryGradle.resolver repo:'libs-release',server:server
artifactoryGradle.run rootDir:"/",buildFile:'build.gradle'
tasks:...

下载指定文件到指定目录
上传指定文件到指定路径
设置构建保留策略
构建提升

在声明式流水线中集成
- 将代码置于script代码块中
- 将代码置于pipeline代码块之外
- 使用共享库

容器集成

将docker融合到流水线中的方法:
1 配置成一个云,作为单独的jenkins代理节点使用
2 作为动态创建的代理节点,提供给声明式流水线使用
3 通过特殊的DSL docker全局变量及相关方法
4 直接在脚本中通过shell调用

1、配置成一个云

定义用作jenkins代理节点的docker镜像,基于这些镜像动态创建和销毁代理节点
需要安装Docker插件,安装插件后,会新增一个Docker入口
进行全局配置,进入cloud部分进行配置
# 需要开启docker的远程api
# DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
准备可以当代理节点运行的镜像 Add Docker Template

基础镜像
- 通过SSH启动,需安装sshd和JDK,如 jenkins/ssh-slave 凭证可以自动插入,即可以不用设置登录凭证 (推荐)
- 通过JNLP启动,需安装JDK,如 jenkins/jnlp-slave 从容器中必须能够访问master的url 容器会自动配置密钥,不需要特殊配置
- 通过附件形式启动,需安装JDK,如 jenkins/slave (不推荐)

FROM jenkinsci/ssh-slave
RUN apt-get -y update && apt-get -y install gradle
RUN echo 2 | update-alternatives --config java

- 设置一个docker云模板 Add Docker Template
# 容器设置 环境变量选项传入公钥 JENKINS_SLAVE_SSH_PUBKEY
- 容器设置 Instance Capacity 应设置一个较小的值,防止运行大量实例

SSH从节点插件 SSH Slaves plugin

2、在声明式流水线中动态创建的代理节点

将agent指令指向一个Dockerfile,通过这个Dockerfile可以启动一个基于生成镜像的容器,并将其设置为代理节点
agent { docker '<image>' }
agent docker { <elements> }
- image '<image>'
- label '<lable>' 在匹配 label 的节点上实例化容器
- args '<string>'
agent { dockerfile true } 代码根目录下有Dockerfile
agent dockerfile { <elements> }
- filename '<path to dockerfile>'
- label '<label>' 在匹配 label 的节点上实例化容器
- args '<string>'
reuseNode 重用流水线原先的代理节点和工作空间,使用流水线代理节点托管最终的docker容器

3、docker流水线全局变量

安装Docker流水线插件 Docker Pipeline plugin
该插件提供了Docker全局变量

docker应用全局变量方法

为使用docker提供了环境
withServer
指定一个docker远程api,为流水线中与docker相关的方法提供docker访问权限

withRegisty
指定仓库地址,用于拉取和推送镜像

withTool
可以重新定位,让节点指向可以获取docker命令行的地方
指向全局工具配置中所配置的docker工具名称

自动安装会安装到工作空间tools目录下

docker镜像全局变量方法

方法:
image(id)
- 使用指定名称或id创建一个镜像对象
build(image[,args])
- 用当前目录下Dockerfile通过docker build创建镜像并打上标签
- args参数,如 '-f Dockerfile.other --pull --build-arg http_proxy=http://192.168.1.1:3128 .' 注意必须以构建上下文结尾,即点
Image.id
- 镜像名称 附带可选的标签或id
Image.run([args,command])
- 运行一个镜像,返回一个容器,可添加额外参数,如 '-p 8080:8080 --memory-swap=-1'
Image.withRun[(args[,command])]{...}
- 和run类似,但执行完代码块内命令会停止该容器
Image.inside[(args)]{...}
- 和withRun类似,但所有外部命令(sh)都会运行在容器中,这些命令运行于相同的工作目录(即Docker服务器必须在本地机上)
Image.tag([tagname])
- 为镜像打标签 或重写现有标签
Image.push([tagname])
- 推送镜像到仓库
Image.pull()
- 相当于docker pull ,不需要在run withRun inside之前运行
Image.imageName()
- 镜像id前缀,必要时包含仓库信息,如 docker.xx.com/mycorp/myapp
开头是大写的I表示是实例化镜像的引用

inside方法
Image.inside[(args)]{...}
若镜像不存在,拉取镜像,启动容器,并挂载jenkins工作空间(挂载会使用相同的文件路径)
然后执行构建步骤,其中任何sh命令都将使用docker exec 封装在容器中执行
执行完成,停止容器

docker容器全局变量方法

Container.id
- 一个运行容器的id值
Container.stop
- 运行docker stop和docker rm来关闭一个容器
Container.port(port)
- 运行docker port显示容器和主机端口映射情况

4、通过shell运行docker

可以使用shell步骤的高级特性捕获输出或返回码
可以把jenkins环境变量传入容器中使用

其他接口

命令行接口
使用方法:ssh(部分功能) 和 jar 包

ssh接口
默认禁用,需在全局安全配置中 SSH服务器部分配置和启用
在用户界面,进入配置,粘贴一个公钥
连接后,help可显示所有可用命令
ssh -l user -p 32881 localhost build job-1 -p id=myID -s -v
# 构建任务,-p 指令构建参数 -s 等待直到命令结束 -v 打印控制台输出
... console daily-job-1 查看daily-job-1的最新控制台输出

cli客户端
http://<jenkins-url>/jnlpJars/jenkins-cli.jar 下载地址
java -jar jenkins-cli.jar [-s URL] [<global options>] <command> [<command opts>] [<args>]
- HTTP模式 -http
默认模式,身份验证 -auth <user>:<secret> 密码或令牌(API Token)
- SSH模式 -ssh
使用密钥对验证
- 远程模式 -remoting 废弃

REST API

每个页面右下角都有一个链接 指向当前任务的 REST API 文档
在当前项的URL后追加/api进行访问
支持三种格式:XML JSON Python 如 /jenkins/api/json?pretty=true

过滤结果
深度 depth 如 /jenkins/api/json?depth=1
限定字段 tree
tree=<keyname>[<field1>,<field2>,<subkeyname[<subfield1>]]
/api/json?pretty=true&tree=jobs[name,lastBuild[number,duration,timestamp,result,changeSet[items[msg,author[fullName]]]]]

启动构建
若开启了CSRF,则需使用crumb

获取crumb

脚本控制台
允许运行任意 groovy 脚本

故障处理

使用流水线步骤界面 Pipline steps
可以看到每个步骤接到到的参数信息
在步骤视图可以进入工作空间 查看文件信息
# 方法: 点击某个步骤的控制台日志图标 -> 左侧菜单中有工作空间访问链接

处理序列化错误 NotSerializableException

添加时间戳
timestamp{...}
options {timestamps()} #声明式

流水线耐用性设置(仅对流水线项目有效 仅流水线项目使用序列化数据)
最大化耐用性-最慢,会频繁写盘
较少的耐用性
性能优化-减少磁盘写入

 

转载请注明:轻风博客 » Jenkins2权威指南5-系统/分析工具/制品/容器集成与jenkins接口

喜欢 (0)or分享 (0)