Jenkins 概述
官网地址:https://www.jenkins.io/zh/
什么是 Jenkins
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。它提供了一个易于使用的图形化界面,可以通过配置简单的任务来实现自动化构建和部署流程。Jenkins 可以与各种版本控制系统(如 Git、SVN)和构建工具(如 Maven、Gradle)集成,支持多种编程语言和平台。它还提供了丰富的插件生态系统,可以扩展其功能,以满足各种不同的自动化需求。通过使用 Jenkins,开发团队可以更高效地进行软件开发和交付,提高质量和稳定性。
Jenkins 的优点
Jenkins 作为一个持续集成工具,具有以下几个优点:
- 自动化构建和部署:Jenkins 可以自动化执行构建、测试和部署任务,减少了人工操作的错误和工作量,提高了软件交付的速度和质量。
- 可扩展性:Jenkins 拥有丰富的插件生态系统,可以根据需要选择和安装各种插件,扩展其功能,满足不同项目的需求。
- 强大的集成能力:Jenkins 可以与各种版本控制系统、构建工具、测试框架和部署工具等集成,提供了灵活的配置选项,并支持多种编程语言和平台。
- 可视化界面:Jenkins 提供了直观易用的图形化界面,使用户可以轻松配置和管理构建任务,查看构建结果和日志,以及监控构建状态。
- 异常处理和报告:Jenkins 可以及时检测构建中的异常情况,如编译错误、测试失败等,提供详细的报告和日志,帮助开发团队快速定位和解决问题。
- 分布式构建和部署:Jenkins 支持分布式构建和部署,可以将任务分发到多台计算机上并行执行,提高了效率和扩展性。
- 社区支持和活跃度:Jenkins 是一个开源项目,拥有庞大的用户社区,有活跃的开发者和贡献者,能够及时解决问题、提供支持和更新。
总的来说,Jenkins 提供了一种可靠的、灵活的和可定制的持续集成解决方案,帮助开发团队实现自动化构建、测试和部署,提高开发效率、软件质量和交付速度。
Jenkins 的应用场景
Jenkins 的使用场景非常广泛,主要用于以下几个方面:
- 持续集成和持续交付:Jenkins 可以自动化执行构建、测试和部署任务,实现持续集成和持续交付,帮助开发团队快速交付高质量的软件。
- 自动化测试:Jenkins 可以与各种测试框架和工具集成,自动执行测试用例,生成测试报告,并及时反馈测试结果,帮助开发团队发现和解决问题。
- 自动化部署:Jenkins 可以与各种部署工具和云平台集成,实现自动化部署和发布,帮助开发团队快速部署软件到不同环境,提高交付效率。
- 任务调度和定时执行:Jenkins 提供了灵活的任务调度功能,可以定时执行各种任务,如定时构建、备份数据、定时清理等。
- 构建和发布管理:Jenkins 可以管理和跟踪不同版本的构建和发布,提供了版本控制、构建历史、构建参数等功能,方便团队进行版本管理和回滚操作。
- 监控和报警:Jenkins 可以监控构建和部署过程中的异常情况,如编译错误、测试失败等,及时发送报警通知,帮助开发团队快速响应和解决问题。
- 多环境支持:Jenkins 支持在不同环境中执行构建和部署任务,如开发环境、测试环境、生产环境等,提供了灵活的配置选项,适应不同的部署需求。
总的来说,Jenkins 可以在软件开发和交付过程中的各个环节发挥作用,帮助团队实现持续集成、自动化测试、自动化部署等目标,提高开发效率、软件质量和交付速度。
安装 Jenkins
环境准备
第一次安装使用 Jenkins,您需要以下准备:
- 机器要求:
- 2 G 内存,建议大于 4G
- 20 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
- 需要安装以下软件:
- Java 8
- docker
原生安装方式
- 下载 Jenkins
- 打开终端进入到下载目录
- 运行命令
java -jar jenkins.war --httpPort=8080
. 其实就是一个项目,直接运行即可 - 打开浏览器进入链接
http://localhost:8080
- 按照说明完成安装
docker 安装
- 确保有 docker 环境
- 安装 jenkins
# 创建挂载目录
mkdir -p /var/jenkins_home
chmod 777 /var/jenkins_home
# 我们把jenkins目录挂载出来,方便我们的修改和查看使用
# 安装jenkinsci/blueocean
docker run \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
- 等待安装成功,打开浏览器访问
ip地址:8000
- 查看登录密码,登录即可
# 方式一:docker 日志
docker logs -f 容器id
# 方式二:查看文件
cat /var/jenkins_home/secrets/initialAdminPassword
- 进入插件安装页面,安装推荐的所有插件即可!如果没有这个页面,说明安装有问题!
# 插件下载慢,加速问题解决
cd /var/jenkins_home/updates
#把 “ www.google.com ” 改成 “ http://www.baidu.com/ ”
#全局搜索 “ updates.jenkins-ci.org/download ” 替换成 mirrors.tuna.tsinghua.edu.cn/jenkins
sed -i 's/https:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
- 插件安装完毕,注册登录账户
- 配置实例的地址
- 进入主页面
- 检查插件配置,比如我们要使用的 gitlab、docker、webhook 之类的!没有的话,需要勾选下载!所有插件都更新到最新版本
网络问题解决
Manage Plugins点击Advanced,把Update Site改为国内插件下载地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
重启 http://192.168.0.120:8080/restart
流水线工程示例:
pipeline {
agent { docker 'maven:3.3.3' }
stages {
stage('build') {
steps {
sh 'mvn --version'
}
}
}
}
Jenkins 基本指令
Jenkins Pipeline(或简称为 “Pipeline”)是一套插件,将持续交付的实现和实施集成到 Jenkins 中。
持续交付 Pipeline 自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。
Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile
)中,该文件可以被放入项目的源代码控制库中。
Hello,Jenkins
pipeline {
agent { docker 'maven:3.3.3'}
stages {
stage('Build') {
steps {
// 具体的执行逻辑 shell mingling
sh 'mvn -version'
}
}
}
}
报错:说明 docker 插件没有下载好。
如果出现了错误,就会报错
修改为 any 的环境
// 最外层 pipeline
pipeline {
// agent 环境
agent any
// 步骤集合
stages {
// 分步骤
stage('Build') {
// 具体的步骤
steps {
// 具体的执行逻辑 shell mingling
sh 'echo "hello,world"'
sh '''
echo "hahahahahahha"
ls -ls
'''
}
}
// 分步骤
stage('Test') {
// 具体的步骤
steps {
// 具体的执行逻辑 shell mingling
sh 'echo "Test"'
}
}
// 分步骤
stage('deploy') {
// 具体的步骤
steps {
// 具体的执行逻辑 shell mingling
sh 'echo "部署"'
}
}
}
}
超时,重试
pipeline {
agent any
stages {
stage('Deploy') {
steps {
// 重试,连续执行多次,如果不成功就停止了。
retry(3){
// 测试脚本
sh './start.sh'
}
// 支付、回调...
// timeout ,如果该命令超过我们预期的时间,就会自动终止。
timeout(time: 3,unit: 'MINUTES'){
// 测试脚本
sh './health-check.sh'
}
}
}
}
}
钩子函数,生命周期的函数
pipeline 执行到某个步骤的时候,来做一些事情, post
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'echo "fail!"'
}
}
}
// 钩子函数,比如执行结果不同,我们可以处理一些善后工作
post {
// 行为
always {
echo 'always'
}
success {
echo 'success'
}
failure {
echo 'failure'
}
unstable {
echo 'failure'
}
changed {
echo 'failure'
}
}
}
定义执行环境
您可能已经注意到每个示例中的 agent 指令。 agent 指令告诉 Jenkins 在哪里以及如何执行 Pipeline 或者 Pipeline 子集。 正如您所预料的,所有的Pipeline 都需要 agent 指令。
在执行引擎中,agent 指令会引起以下操作的执行:
-
所有在块 block 中的步骤 steps 会被 Jenkins 保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
-
一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于 Pipeline 的工作文件
-
工作目录
在 Pipeline 中可以很容易的运行 docker 镜像和容器。 Pipeline 可以定义命令或者应用运行需要的环境和工具, 不需要在执行代理中手动去配置各种各样的系统工具和依赖。 这种方式可以让你使用 docker 容器工具包中的任何工具。
pipeline{
agent {docker xxxxx:@version}
stages{
// 执行步骤
dockerfile
dockercompose
shell
其他程序相关的命令
.....
}
}
pipeline {
agent {
docker { image 'node:7-alpine' }
}
stages {
stage('Test') {
steps {
sh 'node --version'
}
}
}
}
如果是其他环境,就配置其他的运行镜像即可,默认any。
环境变量
公共的环境,在所有的 step 都可以使用
pipeline {
agent any
// 环境变量的定义,在agent环境中配置的东西
environment{
DB_ENGINE = 'sqlite'
DB_PASSWORD='123456'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
很多命令都会有指令,使用环境变量,可以直接使用这里定义的。
多步骤
pipeline {
agent any
stages {
// 构建项目
stage('Build') {
steps {
// mvn 、Dockerfile、 构建相关工作
sh 'Build'
}
}
// 测试项目
stage('Test') {
steps {
// shell测试、web测试、压测。。。
sh 'Test'
}
}
// 部署
stage('Deploy') {
// 访问、集群、liunx
steps {
sh 'Deploy'
}
}
}
}
人工确认
通常在阶段之间,特别是不同环境阶段之间,您可能需要人工确认是否可以继续运行。 例如,判断应用程序是否在一个足够好的状态可以进入到生产环境阶段。 这可以使用 input 步骤完成。 在下面的例子中,“Sanity check” 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。
pipeline {
agent any
stages {
stage('Deploy - Staging') {
steps {
echo 'curl '
}
}
stage('Sanity check') {
steps {
// 人工确认
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
echo 'Deploy - Production'
}
}
}
}
其余指令参考官方文档即可:https://www.jenkins.io/zh/doc/pipeline/tour/post/
所有不会写的语法,全部参照流水线工程里面的语法生成器。
WebHook
关闭防火墙,容器之间互通!systemctl stop firewalld
- 构建触发器,自动触发构建!有一个 webhook 触发器!
逻辑:提交代码后,jenkins 能够感知到代码提交了,流水线工程(项目打包,构建镜像,运行容器,测试接口,人工确认,部署上线)就自动执行
jenkins 就发出了一个触发器命令?gitlab 那边配置触发
gitlab 账户配置
项目中配置 webhook
在 CICD 链上,部署、测试脚本都要提前写好,一次写好,终身运行。
示例:流水线作业
官方文档:https://www.jenkins.io/zh/doc/tutorials/build-a-java-app-with-maven/
- clone github 示例仓库到本地,然后 push 到我们的 gitlab 仓库中
git clone https://github.com/jenkins-docs/simple-java-maven-app.git
mv simple-java-maven-app simple-java-maven-app2
git clone http://192.168.0.120:8888/root/simple-java-maven-app.git
cp -r simple-java-maven-app2/* simple-java-maven-app/
git add .
git commit -m "add"
git push -u origin master
- 在 jenkins 创建流水线项目 simple-java-maven-app
- 配置绑定 git
- 添加 git 登录凭证
- 然后测试构建!
- docker maven 十分慢,我们需要配置镜像加速,我们可以自己定义 settings 文件,然后识别!
- 编写一个 settings.xml 放到项目下
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>
- 修改 Jenkinsfile,指定我们自己写的 settings.xml
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
# 在原来的基础上增加 -gs settings.xml 指定我们的配置
steps {
sh 'mvn -B -gs settings.xml -DskipTests clean package'
}
}
}
}
- 提交到远程,再次测试构建!
- 成功构建,如果出现未知主机,测试网络是否可以 ping 通,重启下 docker 一般可以解决!
真实企业中,道理类似的,一样提交代码后,自动构建并运行测试。