大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!死鬼~ 看完记得给我来个三连哦!
本文次要介绍
Jenkins
如有须要,能够参考
如有帮忙,不忘 点赞 ❥
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!
“唉,每天提交完代码都得本人打包再部署到测试环境和开发环境,好麻烦啊!都快变成运维了”
“啊?哦!的确,每天打包部署的确都成为了工具人了”
一段简白的对话疾速的隐灭在办公室中,却引发了我的思考,“这么麻烦的过程必定曾经有了很好的解决方案,毕竟程序员是 面向懈怠编程
,本人对 Jenkins 这个工具有所耳闻曾经很久了,看来明天得对它 下手
了”
说干就干,明天咱们就来求索一下 JenKins,看完你无妨也给你们我的项目整一个,给本人多减少点 划水
的工夫!
读前须知: 本文较长,从装置到应用,一步步带你超神!
微信公众号关注:
[小菜良记]
,带你领略技术风骚!
一、Jenkins 是什么
Jenkins 是一个
开源软件
我的项目,是基于java
开发的一种继续集成
工具,用于监控继续反复的工作,旨在提供一个凋谢易用的软件平台,使软件的继续集成变成可能。
简略来说,它就是一个 继续集成 的工具!
1. 继续集成
继续集成(Continuous Integration),简称 CI。频繁地将代码集成到骨干之前,必须通过自动化测试,只有有一个测试用例失败,就不能集成。通过继续集成,团队能够疾速从一个性能到另外一个性能。
益处:
- 升高危险,因为继续集成一直去构建,编译和测试,能够很早发现问题
- 缩小重复性的工作
- 继续部署,提供可部署单元包
- 继续交付可供使用的版本
2. Jenkins 继续集成
咱们先通过这张图来看到 Jenkins 在其中起到的作用:
- 首先,开发人员将代码提交到 Git 仓库
- 而后 Jenkins 应用 Git 插件来拉取 Git 仓库的代码,而后配合 JDK、Maven 等软件实现代码编译,测试、审查、、测试和打包等工作
- 最初 Jenkins 将生成的 jar/war 推送到 测试 / 生产 服务器,供用户拜访
整套步骤下来,作为开发人员咱们只须要提交下代码,剩下的工作都交给了 Jenkins,真是美滋滋,怎么没有早点上这个工具的车!
二、Jenkins 装置
磨刀不误砍柴工,没刀的状况下说再多都是虚的。咱们就先来看下 Jenkins 是如何装置的吧!
1. 装置 JDK
因为 Jenkins 是 java 写的,所以要运行起来必须要配置 java 运行环境。这里就不赘诉 JDK 的装置过程了
2. 下载安装 Jenkins
- 下载
咱们能够进入下载页面抉择咱们要装置的版本:下载地址,咱们这里应用的版本是:jenkins-2.190.3-1.1.noarch.rpm
- 装置
而后把下载好的 rpm 包上传到咱们的服务器,通过 rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
进行装置,而后编辑 etc
目录下的 jenkins 配置文件:vim /etc/sysconfig/jenkins
,须要改的中央如下(也能够抉择不改):
JENKINS_USER=”root”
JENKINS_PORT=”8888″
- 启动
systemctl start jenkins
- 拜访
通过浏览器拜访 http:// 服务器 IP:8888/
,看到以下页面阐明启动胜利了
而后咱们在服务器上从指定文件中获取明码,进行下一步。
这一步咱们能够先跳过插件装置,因为 Jenkins 插件须要连贯默认官网下载,速度十分慢:
而后咱们增加一个管理员账号来治理:
看到以下页面就阐明设置胜利了:
微信公众号关注:小菜良记,带你领略技术风骚!
三、Jenkins 应用
1. 插件减速
工欲善其事,必先利其器
贴心的小菜是不会让你蒙受期待的苦楚的,首先咱们进入 Jenkins -> Manage Jenkins -> Manage Plugins
,点击 install
而后咱们在装置 Jenkins 的服务器上进入 /var/lib/jenkins/updates
目录,能够看到有个 default.json
文件,第一步:咱们须要替换外面的局部字段,输出命令如下:
sudo sed -i ‘s#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g’ default.json && sudo sed -i ‘s#www.google.com#www.baidu.com#g’ default.json
第二步:咱们进入到 /var/lib/jenkins
目录,编辑 hudson.model.UpdateCenter.xm
,将外面的 https://updates.jenkins.io/update-center.json
批改为 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
最初一步: 输出以下命令进行重启 Jenkins:
systemctl restart jenkins
通过以上步骤,咱们就能够欢快的装置插件了!
2. 用户治理
在 Jenkins 中咱们也能够进行用户权限治理,这个时候咱们须要借助插件 Role-based Authorization Strategy
- 首先装置
Role-based Authorization Strategy
插件
- 开启全局平安配置
将受权策略切换为 "Role-Based Strategy"
- 创立用户
更改完受权策略,咱们就能够来创立用户了,进入系统管理页面中的Manage Users
这里咱们创立了两个用户,别离是 cbuc1
和 cbuc2
- 创立角色
创立好用户,咱们就能够来创立角色了,在系统管理页面进入 Manage and Assign Roles
角色次要分为 Global roles(全局角色) 和 Item roles(我的项目角色)
Global roles(全局角色): 管理员等高级用户能够创立基于全局的角色
Item roles(我的项目角色): 针对某个或者某些我的项目的角色
咱们零碎当初曾经存在了两个用户,而后咱们就能够给这两个用户绑定对应的角色
3. 凭证治理
什么是凭证呢?凭证 能够用来存储须要密文爱护的数据库明码,GitLab 明码信息,Docker 公有仓库的登录明码。保留了这些信息后,Jenkins 就能够和这些第三方的利用进行交互。当然,这还是得借助 Jenkins 的插件!
1)装置
首先装置 Credentials Binding
插件
装置好插件后,在零碎首要的菜单栏中就会多了个 凭证 菜单
点击进去,咱们能够看到能够增加的凭证有 5 种:
- Username with password:用户名和明码
- SSH Username with private key: 应用 SSH 用户和密钥
- Secret file: 须要窃密的文本文件,应用时 Jenkins 会将文件复制到一个长期目录中,再将文件门路设置到一个变量中,等构建完结后,所复制的 Secret file 就会被删除
- Secret text: 须要保留的一个加密的文本串,如钉钉机器人或 GitHub 的 api token
- Certificate: 通过上传证书文件的形式
咱们平时比拟罕用的类型为:Username with password
和 SSH Username with private key
2)Git 凭证治理
咱们如果要应用 Jenkins 从 GitLab 拉取我的项目代码,咱们就得应用凭证来验证。
- 装置 Git 插件
咱们须要在 Jenkins 中装置 Git 插件 来拉取我的项目代码
而后咱们在服务器上也须要装置 Git 工具:
# 装置命令
yum install git -y
# 验证命令
git –version
1. 形式 1:用户明码类型
咱们能够应用 用户明码 登录后拉取我的项目代码,这个时候咱们须要用到 凭证的 Username with password 类型:
创立胜利咱们就能够测试是否可用,咱们先创立一个 FreeStyle 我的项目
而后在 GitLab 中复制咱们我的项目的 URL
在 Credentials 中抉择咱们刚刚创立的凭证,保留配置后,咱们点击 Build Now 来构建我的项目:
这个时候在控制台能够看到输入
而后在进入服务器的 /var/lib/jenkins/workspace
目录中看到咱们拉取的我的项目:
阐明咱们曾经胜利应用 用户明码 凭证模式拉取到 Git 我的项目了
2. 形式 2:SSH 密钥类型
除了用账号密码形式来验证 Git,咱们还能够用 SSH 密钥 来验证,步骤流程如下:
从图上咱们能够得悉,第一步须要生成 公私钥,咱们在 Jenkins 服务器 上输出以下指令生成:
ssh-keygen -t rsa
输出指令后,一路回车,便可在 /root/.ssh/
目录下生成公私钥:
- id_rsa:私钥文件
- id_rsa.pub:公钥文件
而后咱们把生成的公钥放在 GitLab 中,root 账户登录 -> 点击头像 ->Settings->SSH Keys
,复制 id_rsa.pub 中的内容,点击 “Add key”
而后咱们再回到 Jenkins 零碎页面中增加凭证,抉择 SSH Username with private key
,把刚刚生成的公有文件内容复制过去
增加后就会生成一条凭证
创立胜利咱们就能够测试是否可用,咱们先创立一个 FreeStyle 我的项目
而后在 GitLab 中复制咱们我的项目的 URL
在 Credentials 中抉择咱们刚刚创立的凭证,保留配置后,咱们点击 Build Now 来构建我的项目:
这个时候在控制台能够看到输入
而后在进入服务器的 /var/lib/jenkins/workspace
目录中看到咱们拉取的我的项目:
阐明咱们曾经胜利应用 SSH Username with private key 凭证模式拉取到 Git 我的项目了
4. 项目管理
1)Maven 装置
咱们当初开发中的我的项目大部分都是 Maven 我的项目,应用 Maven 我的项目,咱们就须要进行 依赖治理,因而咱们该当在服务器上安装 Maven 来下载我的项目依赖。
- 装置 Maven
咱们能够从 Maven 官网上下载压缩包,而后上传到服务器上进行解压
tar -xzf apache-maven-3.6.0-bin.tar.gz
- 配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/home/maven/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
编辑后使配置文件失效:
source /etc/profile
验证:
mvn -v
而后设置 Maven 的 settings.xml
# 创立本地仓库目录
mkdir /data/localRepo
vim /home/maven/apache-maven-3.6.2/conf/settings.xml
将本地仓库改为:/root/repo/
增加阿里云私服地址:alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central
- Jenkins 配置
在 Jenkins 咱们也须要配置 JDK 和 Maven 的关联.
进入 Jenkins -> Global Tool Configuration -> JDK
进入 Jenkins -> Global Tool Configuration -> Maven
增加全局变量
进入Manage Jenkins->Configure System->Global Properties
,增加三个全局变量
JAVA_HOME、M2_HOME、PATH+EXTRA
而后咱们进入我的项目中点击 configure
而后增加 shell 执行脚本:
保留后从新构建,查看控制台,能够看到 mvn 构建胜利:
2)war 包部署
如果咱们的我的项目是打成 war 包的模式,那么咱们须要借助 tomcat 容器来运行,那么咱们首先便是要先装置一个 tomcat
Tomcat 装置
咱们将当时下载好的 Tomcat 安装包上传到服务器上,通过 tar -xzf apache-tomcat-8.5.47.tar.gz
解压,而后运行 bin
目录下的 start.sh
启动 Tomcat,看到以下后果则阐明启动胜利:
下一步咱们须要配置 Tomcat 用户角色权限,默认状况下 Tomcat 是没有配置用户角色权限的
首先咱们须要批改 tomcat/conf/tomcat-users.xml
文件:
(复制)内容如下:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
而后批改 /tomcat/webapps/manager/META-INF/context.xml
文件,将以下内容正文:
而后进入tomcat 页面,点击进入:
账号密码都是 tomcat
胜利页面如下:
这样子咱们就实现了 tomcat 的装置,而后接下来就能够进行部署了
Tomcat 部署
- 在 jenkins 中装置
Deploy to container
插件 - 增加 Tomcat 凭证
- 构建配置
在我的项目的 configure 中配置
而后点击构建,查看控制台输入:
显示曾经部署胜利,而后拜访我的项目页面,能够看到 war 包我的项目部署胜利:
3)jar 包部署
下面说完了 war 包我的项目是如何部署的,然而咱们当初我的项目用到比拟多的还是 SpringBoot,这个时候打进去的是 jar 类型,然而 SpringBoot 外面内置了 tomcat 容器,这样子咱们就不须要借助内部 tomcat 容器的应用了。
- 首先咱们在 Jenkins 中下载 Maven 插件,这个时候新建我的项目的时候会有个 Maven 我的项目的选项
而后在我的项目的 configure 中作如下配置:
Repository URL:库地址 Credentials:凭证 Branch Specifier (blank for‘any’):分支
Run only if build succeeds:在构建胜利时执行后续步骤 Add post-build step:增加构建后的步骤 Send files or execute commands over SSH:通过 ssh 发送文件或执行命令
- 装置
Publish Over SSH
插件
因为咱们要部署的服务器与 Jenkins 不在同一个服务器上,所以咱们须要这个插件来近程部署
装置好插件后咱们须要先配置近程服务器,在 Jenkins 服务器上输出 ssh-copy-id 近程服务器 IP
将公钥拷贝到近程服务器上,而后在 Jenkins 系统配置中增加服务器信息,如下:
实现以上步骤后,咱们就能够回到我的项目的 configure 中增加咱们刚刚配置的服务器信息:
Name:SSH Servers 中配置的服务器 Source files:源文件 Remove prefix:删除前缀 Remote directory:上传到服务器的目录 Exec command:执行的脚本
实现以上步骤,咱们就能够欢快的点击 Build Now 了!
4)流水线我的项目
Jenkins 中主动构建我的项目的类型有很多,罕用的有以下三种:
- 自在格调软件我的项目(FreeStyle Project)
- Maven 我的项目(Maven Project)
- 流水线我的项目(Pipeline Project)
每种类型的构建其实都能够实现一样的构建过程与后果,只是在操作形式、灵便度等方面有所区别,其中流水线类型灵便度比拟高,其余两种类型咱们在下面的例子中都曾经尝试过了,上面咱们就来介绍如何构建流水线我的项目。
1. 概念
Pipeline 就是一套运行在 Jenkins 上的工作流框架,将原来独立运行与单个或者多个节点的工作连接起来,实现单个工作难以完成的简单流程编排和可视化工作
2. 长处
- 代码:Pipeline 以代码的模式实现,通常被检入源代码管制,使团队可能编辑,审查和迭代其传送流程。
- 持久性: 无论是打算内的还是计划外的服务器重启,Pipeline 都是可复原的
- 可进行: Pipeline 可接管交互式输出,以确定是否继续执行 Pipeline
- 多功能: Pipeline 反对事实世界中简单的继续交付要求,它反对 fork/join、循环执行、并行执行工作的性能
- 可扩大: Pipeline 插件反对其 DSL 的自定义扩大,以及与其余插件集成的多个选项
3. 创立
创立 Pipeline 我的项目之前咱们须要装置 Pipeline 插件:
而后在创立我的项目的时候便会多了 Pipeline 类型:
抉择好我的项目类型之后咱们就能够在我的项目中的 configure 进行配置了:
- 首先老样子配置好 git 地址,跟下面一样,这里不多作赘诉
- 而后配置 Pipeline 脚本
Pipeline 我的项目是对立通过 Pipeline 脚本来治理,这样也更好的进步灵活性
Hello World
模板:
pipeline {
agent any
stages {
stage(‘Hello’) {
steps {
echo ‘Hello World’
}
}
}
}
stages: 代表整个流水线的所有执行阶段,通常 stages 只有 1 个,外面蕴含多个 stage
stage: 代表一个阶段内须要执行的逻辑,steps 外面是 shell 脚本,git 拉取代码,ssh 近程公布等任意内容
申明式 Pipeline
模板:
pipeline {
agent any
stages {stage('拉取代码') {
steps {echo '拉取代码'}
}
stage('编译构建') {
steps {echo '编译构建'}
}
stage('我的项目部署') {
steps {echo '我的项目部署'}
}
}
}
你也齐全不必放心不会书写 Pipeline 脚本,咱们能够点击 [Pipeline Syntax]
跳转到 Pipeline 代码生成页面
书写好脚本后点击构建,能够看到整个构建过程:
如果咱们须要部署到不同环境,比方生产环境和开发环境,咱们还能够在我的项目的 configure 中进行配置:
- 首先须要装置 Extended Choice Parameter 插件
- 而后在配置中增加 Extended Choice Parameter 参数
实现以上配置后,点击保留,这个时候咱们就能够在构建的时候抉择须要部署的服务器了
而后咱们就能够从 Pipeline 脚本中读取咱们抉择的参数,贴上该项目标构建脚本,如下:
node {
//git 凭证 ID
def git_auth = "7fdb3fa3-74eb-4862-b36f-c03701f71250"
//git 的 url 地址
def git_url = "git@192.168.100.131:cbuc_group/cbuc_web.git"
// 获取以后抉择的服务器名称
def selectedServers = "${publish_server}".split(",")
stage('开始拉取代码') {checkout([$class: 'GitSCM', branches: [[name: '*/v3.0']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: git_auth, url: git_url]]])
}
stage('开始打包') {sh "mvn -Dmaven.test.skip=true clean package"}
stage('开始近程部署') {
// 遍历所有服务器,别离部署
for(int j=0;j<selectedServers.length;j++){
// 获取以后遍历的服务器名称
def currentServerName = selectedServers[j]
// 生产环境部署目录
def pro_address = "/home/pro/java"
// 开发环境部署目录
def dev_address = "/home/dev/java"
// 依据不同的 profile 来部署服务器
if(currentServerName=="pro"){sshPublisher(publishers: [sshPublisherDesc(configName: 'pro_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:'sh build.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:'[,]+', remoteDirectory: pro_address, remoteDirectorySDF: false, removePrefix:'target', sourceFiles:'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}else if(currentServerName=="dev"){sshPublisher(publishers: [sshPublisherDesc(configName: 'dev_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:"sh build.sh", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:'[,]+', remoteDirectory: dev_address, remoteDirectorySDF: false, removePrefix:'target', sourceFiles:'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
还有一种状况就是如果部署 Jenkins 的服务器宕机了,这个时候就会失落 Pipeline 脚本文件,从新书写是一件很麻烦的事件,那么咱们就能够将脚本文件放到咱们的我的项目的根目录下,而后在 configure 中配置 Pipeline 脚本文件的地位:
而后咱们点击构建,能够看到后果也是胜利的:
5)构建触发器
下面咱们讲完了几种我的项目的构建形式,其中都是通过手动点击构建进行构建的,咱们也能够通过触发器来构建
罕用的有:
1. Build After Other Projects Are Built
其余工程构建后触发。在选项中填写咱们关注的我的项目,其中也反对 3 个抉择以供选择:
Trigger only if build is stable: 仅在我的项目稳固构建时执行
Trigger even if the build is unstable: 即便我的项目构建不稳固也执行
Trigger even if the build fails: 即便我的项目构建失败也执行
2. Build Periodically
定时构建。语法类型如 cron 表达式,定时字符串从左往右别离为:分 时 日 月 周
3. Poll SCM
轮询 SCM。指定工夫扫描本地代码仓库的代码是否有变更,如果代码有变更就触发我的项目构建。
4. Trigger builds remotely
近程触发构建。通过应用咱们定义的密钥,而后拜访构建地址:http://192.168.100.131:8888/job/test01/build?token=123123
5. 主动触发构建
方才咱们看到在 Jenkins 的内置构建触发器中,轮询 SCM能够实现 Gitlab 代码更新,我的项目主动构建,然而该计划的性能不佳。那有没有更好的计划呢?有的。就是利用 Gitlab 的webhook实现代码 push 到仓库,立刻触发我的项目主动构建。
实现主动触发构建咱们须要在 Jenkins 装置插件:GitLab Hook
和 GitLab
而后咱们在 Build Trigger 中就能够看到多了一个选项:
复制这串 WebHook 地址,跟着到 GitLab 页面进行设置:
门路步骤:Admin Area -> Settings -> Network
而后咱们在对应的我的项目中进行设置:
最初再回到 Jenkins 页面中做以下配置:Manage Jenkins->Configure System
做完以上配置,咱们就能够欢快的代码进行主动触发构建了!
END
这篇文章较长,都是满满的干货,从装置到应用,一步步带你入 运维
的坑,学完这篇快给你的我的项目用上吧!路漫漫,小菜与你一起求索!
明天的你多致力一点,今天的你就能少说一句求人的话!
我是小菜,一个和你一起学习的男人。
????
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!