时不时会和持续集成工具Jenkins打交道.
安装
直接安装系统安装包
推荐安装方式,以Ubuntu为例:
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo vi /etc/apt/sources.list.d/jenkins.list
# 添加
deb https://pkg.jenkins.io/debian-stable binary/
sudo apt-get update
sudo apt-get install jenkins
用Docker容器的方式安装
注: 用容器的方式看似更方便,但实际使用中由于Jenkins经常会调用外部工具, 比如在Jenkins(容器里)调用docker, 会增加使用的复杂度,不太推荐这种方式.
docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
# 为了在jenkins调用docker,需要在上面命令行增加两个文件映射
# -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker
初始密码文件通常位于/var/lib/docker/volumes/jenkins_home/_data/secrets/initialAdminPassword
更多配置参考官方文档.
常用配置
git添加ssh key
- 首先生成Jenkins用户的ssh-key
- 在git仓库设置项添加公钥以只读权限. 通常位于[Repository settings]-[Access keys].
# 登录Jenkins机器
su - jenkins
ssh-keygen -t rsa -P ''
修复错误 stderr: Host key verification failed
复制ssh公钥到 .ssh文件夹, 对于Ubuntu在/var/lib/jenkins/.ssh, 可能需要相应的修改文件夹权限.
传递参数
#!/usr/bin/env bash
pipenv run python3 -m pytest tests/test_smoke.py -x --html=report.html --junitxml=junit-report.xml
调用docker解决权限问题
如果遇到"permission denied"错误,需要把jenkins加到docker用户组里:
sudo usermod -a -G docker jenkins
Android 构建
android update project -p <project_path>
# 更新SDK
./tools/android update sdk --no-ui
修改时区
-Duser.timezone=“Asia/Chongqing”
流水线/Pipeline
CD(Continous Delivery) 引入了流水线/工作流的概念,即可以把构建,测试,部署分阶段执行, 最终实现产品的持续部署.
Jenkins通过官方插件支持两种任务: 流水线和多分支流水线.
具体的流水线任务通过脚本的形式定义, 使用的语法为Groovy, 看起来还是很简洁的.
一个例子如下,大致层次为 pipeline-stage-step:
pipeline {
agent any
stages {
stage('Deploy') {
steps {
retry(3) {
sh './flakey-deploy.sh'
}
timeout(time: 3, unit: 'MINUTES') {
sh './health-check.sh'
}
}
}
}
}
添加Slave
sudo useradd -d /var/lib/jenkins jenkins
sudo passwd jenkins
详细可参考这里
Python API调用
无认证
import requests
api_url = "http://jenkins.xulizhao.com/job/test_job/api/json?tree=lastSuccessfulBuild[number]"
r = requests.get(api_url)
build_number = r.json()['lastSuccessfulBuild']['number']
需要认证
# 先安装依赖库
pip install python-jenkins
# 代码示例
import jenkins
server = jenkins.Jenkins('http://jenkins.xulizhao.com', username='user', password='password')
last_build_number = server.get_job_info('test_job')['lastSuccessfulBuild']['number']
curl方式
# 检索最近变更记录
curl -u xulz:0f945a8f -s "http://jenkins.xulizhao.com/job/test-job/123/api/xml?wrapper=changes&xpath=//changeSet//comment"
比较遗憾的是Jenkins 的API Token只适用于构建job,其他接口需要用户名/密码登录.
* build_job_url(name, parameters=None, token=None)
* build_job(name, parameters=None, token=None)
调试
脚本调试
访问<JENKINS_URL>/script, 输入要调试的内容
# 查看遗忘的credentials密码
println( hudson.util.Secret.decrypt("${ENCRYPTED_PASSPHRASE_OR_PASSWORD}") )
Build step ‘Execute shell’ marked build as failure
在"Execute Shell"中添加#!/bin/bash
注:默认情况下,Jenkins采取/bin/sh -xe这种方式-x将打印每一个命令。另一个选项-e,当任何命令以非零值(当任何命令失败时)退出代码时,这会导致shell立即停止运行脚本。
常用插件
- Email Extension Plugin: 邮件增强扩展
- Extended Choice Parameter Plug-In: 参数选择扩展
- EnvInject plugin : 传递构建参数和环境变量
- Build Monitor View: 监控
报告
- Junit Publisher
HTML Publisher
加载页面脚本报错
the document’s frame is sandboxed and the ‘allow-scripts’ permission is not set
解决方法:
进入管理项-Script Console,执行
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; default-src 'self'; style-src 'self' 'unsafe-inline';")
# 恢复默认值
System.clearProperty("hudson.model.DirectoryBrowserSupport.CSP")
参考:
- HTML Publisher: HTML Publisher插件不显示CSS的解决
- Jenkins Content Security Policy/官方文档
扩展阅读
- Jenkins官方网站
- GoCD :另一个持续交付工具
- pipeline构建参数的使用