开始使用 Jenkins
使用手册:https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/
本导读将向您介绍使用 Jenkins、Jenkins 的主要特性和 Jenkins Pipeline 的基本知识。 本导读使用“独立”的 Jenkins 发行版,它可以在您自己本地的机器上运行。
准备工作
第一次使用 Jenkins,您需要:
-
机器要求:
256 MB 内存,建议大于 512 MB
10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
-
需要安装以下软件:
Java 8 ( JRE 或者 JDK 都可以)
Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载)
安装Java
官网下载:https://www.oracle.com/java/technologies/downloads/#jdk17-mac
双击安装包,安装jdk
安装成功,关闭弹窗,在终端输入:java -version ,查看版本
Air ~ % java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
常见问题:https://docs.oracle.com/en/java/javase/17/install/installation-jdk-macos.html#GUID-F9183C70-2E96-40F4-9104-F3814A5A331F
安装tomcat
安装文档:https://www.jianshu.com/writer#/notebooks/51693022/notes/95914859/preview
下载并运行 Jenkins
【注释:.zprofile 的作用与 .bash_profile 相同,所以macOS10.15配置文件是.zprofile ,10.15以下版本配置文件是.bash_profile】
第一种方式:推荐
官网下载:https://www.jenkins.io/download/
# 安装,启动 Jenkins
将jenkins.war文件复制到/usr/local/apache-tomcat8/webapps
# 配置环境变量
Air ~ % vim ~/.zprofile # 进入编辑模式,按 i 输入以下内容:
export PATH=$PATH:/usr/local/apache-tomcat8/bin
# 按 esc 再输入:wq 保存退出编辑模式
Air ~ % source ~/.zprofile # 更新 setenv.sh 内容
# 启动tomcat
Air ~ % cd /usr/local/apache-tomcat8/bin
Air bin % ./startup.sh
# 访问Tomcat
打开浏览器,然后网址输入 http://localhost:8090/,如果出现一只猫,则证明配置成功~
# 访问Jenkins,localhost代表本地ip,可以替换成自己的IP地址,第一次安装界面如下,根据提示填入秘钥串即可
打开浏览器,然后网址输入 http://localhost:8090/jenkins/
第二种方式:
Air ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
注意这里问题后缀是Connection refused
解决方式
(1)打开网站: https://www.ipaddress.com/
查询一下 raw.githubusercontent.com 对应的IP地址
Hostname Summary
Domain githubusercontent.com
IP Address
199.232.68.133
Web Server Location United States
(2)替换系统的hosts文件(注意:最好复制一份出来在更改)
步骤:打开访达 -> 前往 -> 前往文件夹 -> 输入:/etc/hosts -> 复制hosts -> 在最后面添加“199.232.68.133 raw.githubusercontent.com” -> 保存 -> 将复制修改后的hosts文件放到etc目录下替换原来的hosts
这里其实相当于网络不通的解决方式,一个网址在你电脑上是否能打开,打不开 我们都会在终端(dos系统)ping 一下 举个例子:
Air ~ % ping baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: icmp_seq=0 ttl=55 time=7.535 ms
64 bytes from 39.156.69.79: icmp_seq=1 ttl=55 time=12.026 ms
这是通的状态,一般不通会显示 timeout 等,你可以试试你的github是否通着。(一般电信公司排查网络问题,也是这样,看看是否丢包)
(3)然后执行安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Jenkins 也可以使用brew
以下方式安装:
- 安装jenkins
brew install jenkins # 安装最新版本
brew install jenkins@YOUR_VERSION # 安装jenkins指定版本:brew install [email protected]
brew services start jenkins # 启动jenkins
brew services restart jenkins # 重新启动jenkins
brew upgrade jenkins # 更新jenkins
brew services stop jenkins # 停止jenkins服务
brew uninstall jenkins # 卸载jenkins
查找jenkins war地址
在安装后有可能找不到war包地址,可以用mdfind命令本地查询下
mdfind -name jenkins.war
/usr/local/Cellar/jenkins/2.116/libexec/jenkins.war
启动
java -jar /usr/local/Cellar/jenkins/2.116/libexec/jenkins.war --httpPort=8080
后台启动
后台启动的意思是放到后台运行,即使窗口被干掉,jenkins的进程也会存在.
简单用shell脚本nohup命令放到后台
启动脚本命令:sh startjenkins.sh
#!/bin/bash
echo start jenkins
nohup java -jar /usr/local/Cellar/jenkins/2.116/libexec/jenkins.war --httpPort=8080 &
echo start end
启动Jenkins后,打开浏览器输入: localhost:8080
- 安装 LTS 版本
brew install jenkins-lts # 安装最新版本
brew install jenkins-lts@YOUR_VERSION # 安装指定版本:brew install [email protected]
brew services start jenkins-lts # 启动
brew services restart jenkins-lts # 重新启动
brew upgrade jenkins-lts # 更新
brew services stop jenkins-lts # 停止jenkins服务
brew uninstall jenkins-lts # 卸载jenkins
等待几分钟就可看到 解锁 Jenkins 页面出现。
打开终端输入:cat /Users/用户名/.jenkins/secrets/initialAdminPassword 查看密钥,
Air ~ % cat /Users/liying/.jenkins/secrets/initialAdminPassword
15e998ca016040a0826d1a6dcfe449bc # 密码
在 解锁Jenkins 页面上,将此 密码 粘贴到管理员密码字段中,然后单击 继续 ,跳转到 自定义Jenkins
自定义jenkins插件
解锁 Jenkins之后,在 Customize Jenkins 页面内, 您可以安装任何数量的有用插件作为您初始步骤的一部分。
两个选项可以设置:
安装建议的插件 - 安装推荐的一组插件,这些插件基于最常见的用例.
-
选择要安装的插件 - 选择安装的插件集。当你第一次访问插件选择页面时,默认选择建议的插件。
如果您不确定需要哪些插件,请选择 安装建议的插件 。 您可以通过Jenkins中的Manage Jenkins > Manage Plugins 页面在稍后的时间点安装(或删除)其他Jenkins插件 。
设置向导显示正在配置的Jenkins的进程以及您正在安装的所选Jenkins插件集。这个过程可能需要几分钟的时间
创建第一个管理员用户
最后,在customizing Jenkins with plugins之后,Jenkins要求您创建第一个管理员用户。 . 出现“ 创建第一个管理员用户 ”页面时, 请在各个字段中指定管理员用户的详细信息,然后单击 保存完成 。 . 当 Jenkins准备好了 出现时,单击开始使用 Jenkins。
Notes: * 这个页面可能显示 Jenkins几乎准备好了! 相反,如果是这样,请单击 重启 。 * 如果该页面在一分钟后不会自动刷新,请使用Web浏览器手动刷新页面。如果需要,请使用您刚刚创建的用户的凭据登录到Jenkins,并准备好开始使用Jenkins!
从这时起,Jenkins用户界面只能通过提供有效的用户名和密码凭证来访问。
'''
用户名:test
密码:123456
确认密码:123456
全名:test
电子邮件地址:[email protected]
'''
进入实例配置⻚面,显示Jenkins URL:http://localhost:8090/jenkins,点击 保存并完成
创建成功,点击 开始使用Jenkins
进入首页,显示警告红色1,点击“警告红色1”,显示部分插件问题,点击“纠正”
jenkins常用操作
访问:http://localhost:8080/jenkins/
退出:http://localhost:8080/exit
重启:http://localhost:8080/restart
重新加载:http://localhost:8080/reload
配置打包证书
配置iOS打包证书(开发同学完成)
配置Android打包环境(开发同学完成)
创建您的第一个Pipeline
Table of Contents
什么是 Jenkins Pipeline?
-
快速开始示例
Java
Node.js / JavaScript
Ruby
Python
PHP
什么是 Jenkins Pipeline?
Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。
持续交付 Pipeline 自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。
Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 `Jenkinsfile` )中,该文件可以被放入项目的源代码控制库中。 [[1](https://www.jenkins.io/zh/doc/pipeline/tour/hello-world/#_footnotedef_1)]]
Pipeline 和 `Jenkinsfile` 的更多相关信息,请参考用户手册中的相关链接 [Pipeline](https://www.jenkins.io/zh/doc/book/pipeline) 和 [使用 Jenkinsfile](https://www.jenkins.io/zh/doc/book/pipeline/jenkinsfile)
快速开始使用 Pipeline:
- 将以下示例 复制到您的仓库中并命名为
Jenkinsfile
- 单击Jenkins中的 New Item 菜单
- 为您的新工程起一个名字 (例如 My Pipeline) ,选择 Multibranch Pipeline
- 单击 Add Source 按钮,选择您想要使用的仓库类型并填写详细信息.
- 单击 Save 按钮,观察您的第一个Pipeline运行!
您可能需要修改Jenkinsfile
以便应用在您自己的项目中。尝试修改sh
命令,使其与您本地运行的命令相同。
在配置好 Pipeline 之后,Jenkins 会自动检测您仓库中创建的任何新的分支或合并请求, 并开始为它们运行 Pipelines。
继续学习 "执行多个步骤"
快速开始示例
下面是一个简单的 Pipeline 各种语言的复制和粘贴示例。
Java
Jenkinsfile (Declarative Pipeline)
pipeline {
agent { docker 'maven:3.3.3' }
stages {
stage('build') {
steps {
sh 'mvn --version'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
Node.js / JavaScript
Jenkinsfile (Declarative Pipeline)
pipeline {
agent { docker 'node:6.3' }
stages {
stage('build') {
steps {
sh 'npm --version'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
Ruby
pipeline {
agent { docker 'ruby' }
stages {
stage('build') {
steps {
sh 'ruby --version'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
Python
pipeline {
agent { docker 'python:3.5.1' }
stages {
stage('build') {
steps {
sh 'python --version'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
PHP
pipeline {
agent { docker 'php' }
stages {
stage('build') {
steps {
sh 'php --version'
}
}
}
}
执行多个步骤(step)
Table of Contents
- Linux、BSD 和 Mac OS
- Windows
- 超时、重试和更多
- 完成时动作
Pipelines 由多个步骤(step)组成,允许你构建、测试和部署应用。 Jenkins Pipeline 允许您使用一种简单的方式组合多个步骤, 以帮助您实现多种类型的自动化构建过程。
可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。
当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。
Linux、BSD 和 Mac OS
在 Linux、BSD 和 Mac OS(类 Unix ) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh
步骤(step)。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
}
Toggle Scripted Pipeline (Advanced)
Windows
pipeline {
agent any
stages {
stage('Build') {
steps {
bat 'set'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
超时、重试和更多
pipeline {
agent any
stages {
stage('Deploy') {
steps {
retry(3) {
sh './flakey-deploy.sh'
}
timeout(time: 3, unit: 'MINUTES') {
sh './health-check.sh'
}
}
}
}
}
Toggle Scripted Pipeline (Advanced)
pipeline {
agent any
stages {
stage('Deploy') {
steps {
timeout(time: 3, unit: 'MINUTES') {
retry(5) {
sh './flakey-deploy.sh'
}
}
}
}
}
}
Toggle Scripted Pipeline (Advanced)
完成时动作
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'echo "Fail!"; exit 1'
}
}
}
post {
always {
echo 'This will always run'
}
success {
echo 'This will run only if successful'
}
failure {
echo 'This will run only if failed'
}
unstable {
echo 'This will run only if the run was marked as unstable'
}
changed {
echo 'This will run only if the state of the Pipeline has changed'
echo 'For example, if the Pipeline was previously failing but is now successful'
}
}
}
定义执行环境
在 上一小节 您可能已经注意到每个示例中的 agent
指令。 agent
指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 正如您所预料的,所有的Pipeline都需要 agent
指令。
在执行引擎中,agent
指令会引起以下操作的执行:
- 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
- 一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件
- 在Pipeline中可以使用这几种 定义代理的方式 在本导读中,我们仅使用Docker容器的代理方式。
- 在Pipeline中可以很容易的运行 Docker 镜像和容器。 Pipeline可以定义命令或者应用运行需要的环境和工具, 不需要在执行代理中手动去配置各种各样的系统工具和依赖。 这种方式可以让你使用 Docker容器工具包 中的任何工具。
-
agent
指令更多选项和相关信息,可以查看 语法参考 。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent {
docker { image 'node:7-alpine' }
}
stages {
stage('Test') {
steps {
sh 'node --version'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
当执行Pipeline时,Jenkins将会自动运行指定的容器,并执行Pipeline中已经定义好的步骤steps:
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
[guided-tour] Running shell script
+ node --version
v7.4.0
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
在Pipeline中,混合和搭配不同的容器或者其他代理可以获得更大的灵活性。 更多配置选项和信息,可以参考 继续“使用环境变量” 。
使用环境变量
Table of Contents
- 环境变量中的凭证信息
环境变量可以像下面的示例设置为全局的,也可以是阶段(stage)级别的。 如你所想,阶段(stage)级别的环境变量只能在定义变量的阶段(stage)使用。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
这种在 Jenkinsfile
中定义环境变量的方法对于指令性的脚本定义非常有用方便, 比如 Makefile
文件,可以在 Pipeline 中配置构建或者测试的环境,然后在 Jenkins 中运行。
环境变量的另一个常见用途是设置或者覆盖构建或测试脚本中的凭证。 因为把凭证信息直接写入 Jenkinsfile
很显然是一个坏主意, Jenkins Pipeline 允许用户快速安全地访问在 Jenkinsfile
中预定义的凭证信息,并且无需知道它们的值。
环境变量中的凭证信息
更多信息参考 用户手册 中的 凭证信息处理 。
记录测试和构建结果
虽然测试是良好的持续交付过程中的关键部分,但大多数人并不希望筛选数千行控制台输出来查找有关失败测试的信息。 为了简化操作,只要您的测试运行时可以输出测试结果文件,Jenkins 就可以记录和汇总这些测试结果。 Jenkins 通常与 junit
步骤捆绑在一起,但如果您的测试运行结果无法输出 JUnit 样式的 XML 报告, 那么还有其他插件可以处理任何广泛使用的测试报告格式。
为了收集我们的测试结果,我们将使用 post
部分。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Test') {
steps {
sh './gradlew check'
}
}
}
post {
always {
junit 'build/reports/**/*.xml'
}
}
}
Toggle Scripted Pipeline (Advanced)
这将会获得测试结果,Jenkins 会持续跟踪并计算测试的趋势和结果。 如果存在失败的测试用例,Pipeline 会被标记为 “UNSTABLE”,在网页上用黄色表示, 这不同于使用红色表示的 “FAILED” 失败状态。
当出现测试失败时,通常可以从 Jenkins 中获取构建结果报告进行本地分析和测试。 Jenkins 内置支持存储构建结果报告,在 Pipeline 执行期间生成记录文件。
通过 archiveArtifacts
步骤和文件匹配表达式可以很容易的完成构建结果记录和存储, 如下例所示:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('Test') {
steps {
sh './gradlew check'
}
}
}
post {
always {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/reports/**/*.xml'
}
}
}
Toggle Scripted Pipeline (Advanced)
如果在 archiveArtifacts
步骤中指定了多个参数, 那么每个参数的名称必须在步骤代码中明确指定, 即文件的路径、文件名和 fingerprint
三个参数。 如果您只需指定文件的路径和文件名, 那么你可以省略参数名称 artifacts
,例如:archiveArtifacts 'build/libs/**/*.jar'
在 Jenkins 中记录测试和构建结果非常有助于向团队成员快速提供相关信息。 在下一节,我们将会展示如何通知团队成员在我们的 Pipeline 中所发生的事情。
继续学习“清理和通知”
清理和通知
因为 post
部分保证在 Pipeline 结束的时候运行, 所以我们可以添加通知或者其他的步骤去完成清理、通知或者其他的 Pipeline 结束任务。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('No-op') {
steps {
sh 'ls'
}
}
}
post {
always {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}
Toggle Scripted Pipeline (Advanced)
有很多方法可以发送通知, 下面是一些示例展示了如何通过电子邮件、Hipchat room 或者 Slack channel 发送 Pipeline 的相关信息。
电子邮件
post {
failure {
mail to: '[email protected]',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
Hipchat
post {
failure {
hipchatSend message: "Attention @here ${env.JOB_NAME} #${env.BUILD_NUMBER} has failed.",
color: 'RED'
}
}
Slack
post {
success {
slackSend channel: '#ops-room',
color: 'good',
message: "The pipeline ${currentBuild.fullDisplayName} completed successfully."
}
}
当 Pipeline 失败、不稳定甚至是成功时,团队都会收到通知, 现在我们可以继续完成我们的持续交付 Pipeline 激动人心的部分:部署!
继续“部署”
部署
Table of Contents
阶段即为部署环境
人工确认
-
结论
大多数最基本的持续交付 Pipeline 至少会有三个阶段:构建、测试和部署,这些阶段被定义在
Jenkinsfile
中。 这一小节我们将主要关注部署阶段,但应该指出稳定的构建和测试阶段是任何部署活动的重要前提。Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building'
}
}
stage('Test') {
steps {
echo 'Testing'
}
}
stage('Deploy') {
steps {
echo 'Deploying'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
阶段即为部署环境
一个常见的模式是扩展阶段的数量以获取额外的部署环境信息, 如 “staging” 或者 “production”,如下例所示
stage('Deploy - Staging') {
steps {
sh './deploy staging'
sh './run-smoke-tests'
}
}
stage('Deploy - Production') {
steps {
sh './deploy production'
}
}
在这个示例中,我们假定 ./run-smoke-tests
脚本所运行的冒烟测试足以保证或者验证可以发布到生产环境。 这种可以自动部署代码一直到生产环境的 Pipeline 可以认为是“持续部署”的一种实现。 虽然这是一个伟大的想法,但是有很多理由表明“持续部署”不是一种很好的实践, 即便如此,这种方式仍然可以享有“持续交付”带来的好处。 [1] Jenkins Pipeline可以很容易支持两者。
人工确认
pipeline {
agent any
stages {
/* "Build" and "Test" stages omitted */
stage('Deploy - Staging') {
steps {
sh './deploy staging'
sh './run-smoke-tests'
}
}
stage('Sanity check') {
steps {
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
sh './deploy production'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
结论
本导读向您介绍了 Jenkins 和 Jenkins Pipeline 的基本使用。 由于 Jenkins 是非常容易扩展的,它可以被修改和配置去处理任何类型的自动化。 关于 Jenkins 可以做什么的更多相关信息,可以参考 用户手册, Jenkins 最新事件、教程和更新可以访问 Jenkins 博客