运维从0开始学习jenkins
0、介绍
(0.1)CICD的概念
想要学会jenkins运维,了解相关概念。

(0.2 )jenkins介绍
jenkins由JAVA写的,所以要JDK,jenkins由很多插件组成强大的功能。
同时主要分为下面五大步骤。

1、gitbal 服务端安装配置
gitlab安装 1. 安装相关依赖 yum -y install policycoreutils openssh-server openssh-clients postfix 2. 启动ssh服务&设置为开机启动 systemctl enable sshd && sudo systemctl start sshd 3. 设置postfix开机自启,并启动,postfix支持gitlab发信功能 systemctl enable postfix && systemctl start postfix 4. 开放ssh以及http服务,然后重新加载防火墙列表 firewall-cmd --add-service=ssh --permanent firewall-cmd --add-service=http --permanent firewall-cmd --reload 5. 下载安装(不行就直接复制链接) wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-17.1.1-ce.0.el7.x86_64.rpm # rpm -ivh gitlab-ce-17.1.1-ce.0.el7.x86_64.rpm yum install gitlab-ce-17.1.1-ce.0.el7.x86_64.rpm 6. 修改gitlab配置 vi /etc/gitlab/gitlab.rb 修改gitlab访问地址和端口,默认为80,我们改为82 external_url 'http://192.168.66.100:82' nginx['listen_port'] = 82 7. 重载配置及启动gitlab gitlab-ctl reconfigure gitlab-ctl restart 8. 把端口添加到防火墙 firewall-cmd --zone=public --add-port=82/tcp --permanent firewall-cmd --reload 启动成功后,默认用户为 root 密码为 /etc/gitlab/init_password 文件
2、IDEA push 到 gitlab
idea提交到gitlab上:https://cloud.tencent.com/developer/article/1735099
超简单方式
3、jenkins 体系
https://cloud.tencent.com/developer/article/2536005
使用信息
| 事项 | 版本 | |
| 1 |
JDK8 JRE1.8 |
https://www.oracle.com/cn/java/technologies/downloads/ centos7虚拟机系统自带 |
| 2 | jenkins2.26 | https://mirror.twds.com.tw/jenkins/war-stable/2.263.4/jenkins.war |
| 3 | maven | |
| 4 | ||
| 5 |
(3.1)JDK的下载安装
JDK8下载:https://download.oracle.com/otn/java/jdk/8u471-b09/99a6cb9582554a09bd4ac60f73f9b8e6/jdk-8u471-linux-x64.rpm?AuthParam=1769068541_e62a040cd1e0a999c8100b476cf4f1e2
官网下载了,安装教程参考:https://www.java.com/zh-cn/download/help/linux_x64rpm_install.html
官网教程:https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html#BJFGGEFG 关键词(Installing the JDK on RPM-Based Linux Platforms)
其他参考:https://cloud.tencent.com/developer/article/2536005
例如,要将软件安装到 /usr/java/ 目录中,请键入: cd /usr/java 卸载任何之前安装的 Java 程序包。 rpm -e package_name 安装程序包。 rpm -ivh jre-8u73-linux-x64.rpm 要升级程序包,请键入: rpm -Uvh jre-8u73-linux-x64.rpm 如果要节省磁盘空间,请删除 .rpm 文件。 退出 root shell。不需要重新启动。 查看/etc/profile,是否有JAVA_HOME 等环境变量,rpm安装默认会在 /usr/lib/java
export JAVA_HOME=/usr/java/jdk1.8.0_191
export CLASSPATH=.:%JAVA_HOME%\lib\dt.jar:%JAVA_HOME%\lib\tools.jar:
export PATH=$PATH:$JAVA_HOME/bin
(3.2)下载并运行 Jenkins
(1)war包直接使用
所有的东西目录默认在 /root/.jenkins下。
现在都是war包,安装步骤如下:
-
打开终端进入到下载目录.
-
运行命令 java -jar jenkins.war --httpPort=8080 --httpListenAddress=0.0.0.0
-
打开浏览器进入链接
http://ip:8080. -
按照说明完成安装.
关闭 Jenkins http://localhost:8080/exit 重启 Jenkies http://localhost:8080/restart 重新加载配置信息 http://localhost:8080/reload
(2)RPM安装
rpm -ivh jenkins包.rpm

配置文件:用户要改成 root,否则 git 或者其他操作时可能会没有权限

(3.3)插件仓库配置与下载

(1)互联网下载
# jenkins国外官方插件地址下载速度非常慢,所以改为国内插件地址
# 先点击一下 kenkins->manager jenkins -> manage plugins 加载一下下载列表
如下图,这样就可以在默认default.json中把官方插件列表下载到本地了。


然后再去 Advaiable plugins 中查找搜索插件,如下图,勾上后再点击安装即可。

(3.4)jenkins常用插件
本次我们使用的插件有
- Localization:Chinese(Simplified):汉化包插件
- Role-based Authorization Strategy:管理Jenkins用户权限
- Credentials Binding:凭证管理功能
- git:从gitlab 拉取代码(OS与插件都需要)
(3.5)Role-based-Authorization 角色管理
找到security,启用角色策略。

然后在设置目录下:找到 Manage and Assign Roles
进行新建,分配即可(分配角色给用户需要先新建用户,角色还有通配符匹配一说)。
如下图,先建一个全局角色给读权限,再建两个项目角色,集成

用户必须要有全局读权限才能看到项目,否则项目角色无意义,如下图:

这样用户登录后就只能看到对应有权限的项目
(3.6)凭据管理Credentials 与 git插件安装
核心:
1. git插件 和 Jenkins服务器上都要装 git
2. jenkins 免密 ssh 登录 gitlab
# ssh密钥登录 github: #1. 使用 root 用户生成公钥和私钥 ssh-keygen -t rsa #默认生成在 /root/.ssh/ 目录 # id_rsa 为私钥, id_rsa.pub 为公钥 # 私钥用在 jenkins 凭据里, 公钥必须放在 github 项目里的 ssh 配置里
其实私钥、公钥在哪个机器上生成都没有关系,主要是是一对就行。
私钥jenkins凭据使用,公钥是针对 gitlab的用户(点击用户头像-》偏好设置,配置 ssh密钥)
3. 详细说明

(3.7)maven安装与配置
(1)下载安装与仓库配置
#下载 wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip --no-check-certificate #解压 unzip -d /usr/local apache-maven-3.6.3-bin.zip #配置环境变量: vim /etc/profile | \|/ # 增加到文件的末尾 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el7_9.x86_64 export MAVEN_HOME=/usr/local/apache-maven-3.6.3 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin | \|/ # 刷新配置文件 source /etc/profile | \|/ #查看是否安装成功: mvn -v
修改本地仓库
cd /usr/local/apache-maven-3.6.3 mkdir repository vim conf/settings.xml
<!-- 修改内容 --> <localRepository>/usr/local/apache-maven-3.6.3/repository</localRepository>

<mirrors>
<!-- 修改内容 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
(2)构建简单的maven项目并上传到 gitlab
-- maven 服务器上运行 mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=myapp \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false cd myapp -- maven 上安装好git cd 你的maven项目目录 git init git add .
git config --global user.name "gitlab的用户名"
git config --global user.email "用户对应的邮箱"
git commit -m "initial commit"
# 去GitLab新建一个空项目,复制仓库地址(HTTPS或SSH都行) git remote add origin <你的gitlab仓库地址> git branch -M main # 统一用main分支 git push -uf origin main
到时候就可以看到有代码了,也许不在main 里面,点击那个main,切换master,就有代码了。
pom.xml 是mavcen能够编译的核心参数文件, artifactID 为名称(打包后的名称也是这个)。
(3)配置环境变量并打包
jenkins 配置-》全局工具配置


添加全局变量 Jenkins–>Manage Jenkins–>Configure System–>Global Properties,添加三个全局变量:JAVA_HOME、M2_HOME和PATH+EXTRA。

测试manven
在构建步骤中 shell 里写 mvn clean package
4、应用 jenkins(基础与手动)
(4.1)构建执行shell 命令
需求:能执行shell,让用户输入变量进行对应的操作、输出。
echo '###当前的家目录是###' pwd echo '###当前的用户是###' whoami case "$choice" in dev) echo "部署在开发环境" ;; prod) echo "部署在生曾环境" ;; pre-prod) echo "部署到预发布环境" ;; esac
步骤一:新建项目-》常用的三种项目模板
1. freestyle:一般用于静态项目,各种都行
2. maven:JAVA代码(需要编译)。
3. 流水线(pipeline):把地1个或者第2个任务通过指令(代码)方式实现。
步骤二:点击项目-》配置
1. discatd old builds :就是说销毁历史的构建记录,一般有时间保存、次数保存
2.this project is parameterized :参数化构建过程,本案例需要用到。(会有很多类型,本案例选择 choice parameter)
在jenkins运行时,会加载这些参数。

步骤三:构建步骤-》增加构建步骤
1.Execute windows batch command
2.Execute shell(本次案例选这个)
3.Invoke top-level Maven targets
然后在弹出的节目框中写上shell脚本
echo '###当前的家目录是###' pwd echo '###当前的用户是###' whoami case "$choice" in dev) echo "部署在开发环境" ;;
prod) echo "部署在生曾环境" ;;
pre-prod) echo "部署到预发布环境" ;;
esac
保存后。
步骤四:运行项目
如下图,我们的信息全部都出来了,选择之后开始构建,则生成了。

运行后,查看实际的运行信息

额外新增一个 文本参数(string parameter)

构建时,则情况如下:

(4.2)jenkins集成gitlabel
前提:安装 git、gitlabel 插件(管理jenkins-》插件管理)

流程与步骤:
其实私钥、公钥在哪个机器上生成都没有关系,主要是是一对就行.
私钥jenkins凭据使用,公钥是针对 gitlab的用户(点击用户头像-》偏好设置,配置 ssh密钥)
1、书写并提交代码:开发提交代码至Gitlab
2、插件(gitlab)Jenkins安装gitlab所需插件
3、创建任务:Jenkins创建freestyle项目,然后配置gitlab仓库项目对应地址。
3.1在Jenkins服务器上解析gitlab地址
3.2 在jenkins上面创建密钥对:公钥发gitlab项目对应的用户,私钥jenkins web页面添加保存
3.3配置gitlab地址和分支
实际使用,见3.6、3.7。
(4.3)拉取代码、部署方案(CD)
步骤:
1、书写并提交代码:开发提交代码至Gitlab
2、插件(gitlab)Jenkins安装gitlab所需插件
3、创建任务:Jenkins创建freestyle项目,然后配置gitlab仓库项目对应地址。
3.1在Jenkins服务器上解析gitlab地址
3.2 在jenkins上面创建密钥对:公钥发gitlab项目对应的用户,私钥jenkins web页面添加保存
3.3配置gitlab地址和分支
4、web:jenkins 构建
5、web+lb集群 :(1)IP地址: (2)前端目录:/app/code/html/
6、书写脚本把jenkins拉取代码,推送到web服务器站点目录
7、调试测试

上面4.2 中已经执行了 步骤1-3。
前置准备:配置 jenkins服务器(sshkeygen.exe)到 发布机器(如nginx、web server)的密钥认证(ssh-copy-id ip)
手动上线:

下面的 代码打包、分发代码、分发后web处理与配置,成为CD(持续发布),如何通过 jenkins实现呢

CD方案
1、使用Jenkins执行Shell命令,脚本。
2、通过Jenkins的插件Publish 0ver SSH插件实现。(分发文件,远程执行命令)。
3、使用Jenkins执行Ansible剧本、Ad-hoc。
4、使用Jenkins执行Docker指令。(架构中使用到了docker)
(4.4)手动构建
步骤1:配置免密ssh登录,jenkins私钥,公钥复制到被发布的机器上
ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.7 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.8
步骤二:下载代码
git clone git@gitlab.oldboylinux.com:dev/web_html.git
步骤三:打包、分发、解压、发布代码
在jenkins 里面的构建一个脚本
#jenkins [root@oldboy-jenkins ~]# cat/server/scripts/deploy_web_html.sh
#!/bin/bash#author:lidao996
#desc:通过脚本,打包,分发,解压,连接,代码
App_time=$(date +%F_%H-%M)
App_home=$WORKSPACE App_dir=/opt App_web_servers="172.16.1.7 172.16.1.8" app_pack() { #01.从 gitlab的代码打包操作 cd ${App_home} tar -zcf ${App_dir}/web_html-${App_time}.tar.gz ./ app_scp(){ #02.推送代码包scp:推送到web服务器的/opt
for ip in ${App_web_servers}
do scp ${App_dir}/web_html-${App_time}.tar.gz ${ip}:${App_dir}
done app_deploy() {
#03.解压,修改目录名字,创建软连接 for ip in ${App_web_servers}
do ssh -o StrictHostKeyChecking=no $ip "cd $App_dirssh &&\
tar -zxf web_html-${App_time}.tar.gz &&\
mv web_html we_html-${App_time}&&\ rm -f /code/html&&\
ln -s ${App_dir}/web_html-${App_time} /code/html
" done main(){ app_pack app_scpapp_deploy
} main
其中 workspace 变量,是jenkins自带变量,哪里看呢?

后续按4.1 执行 shell即可。
Maven构建参考
进入项目-》配置-》构建步骤


然后开始构建,查看日志即可。
(4.5)基于TAG、webhook、回滚
能不能基于某个指定tag进行发布;每次都是发布,基于tag方式发布
生产环境:手动构建
**测试环境:自动通过触发器,自动构建**
1)为什么要让项目支持tag版本方式上线?
由于之前上线方式是直接获取最新代码,那么会造成后期回退变的困难。
那如果采用tag方式,比如第一次上线V1.1、第二次上线V1.2、如果上线V1.2出现问题,那么我们可以快速回退至上一个版本v1.1。
2)实现tag版本上线方式思路
1.开发如果需要发布新版本,必须将当前的版本打上一个标签。
2.jenkins需要让其脚本支持传参比如用户传递 v1.1则拉取项目的 v1.1标签
实践操作:
步骤1:配置jenkins git参数
新建一个 tag_version 参数,动态自动从 gitlab中拉取

下面拉取代码界面,指定分支这里需要引用上面的参数,构建时也可以使用该参数 tag_version

然后就4.4操作即可,构建时会选择TAG标签。

(4.6)通过webhook钩子 实现自动化部署到测试环境
就是钩子,jenkins 勾到 gitlab 。
需求:
1. 研发一提交最新代码,自动发布到测试环境。
2. 实现代码自动发布
(1)jenkins触发器功能(点击 Build when a change is pushed to gitlab...),获取webhook地址,点击高级-》general获取token令牌码
(2)gitlab开启相关功能:开启钩子获取token令牌。
管理中心-》设置-》网络设置-》外发请求-》允许钩子和服务器访问本地网络(勾选上)
配置gitlab 上的webhook,测试是否可以访问
(3)通过上述代码,就可以自动部署
步骤1:jenkins triggers 触发器
复制URL:https://......./05-auto-deploy-webhook-html (这是webhook地址)

点击高级后,有个令牌,点击生成 Generate,这个是令牌。

步骤2:gitlab配置
(1)开放内网权限:管理中心-》设置-》网络-》出站请求-》允许来自webhook和集成对本地网络的请求 (默认不让使用内网地址来做webhook的URL)
(2)配置webhook:项目-》到指定项目-》webhooks-》添加-》URL写步骤1中的 webhook地址-》secret 令牌写步骤1中的令牌码。
(3)测试webhook:点击测试,push events,看看是不是返回200;
然后git修改提交一下,就成功了。会自动触发调用jenkins对于项目的构建。
看一下jenkins的控制台即可。
(4.7)回滚方案
方案1:通过tag标签,jenkins重新部署。
方案2:找到最近的一次部署包备份,通过shell 获取到包。做软链接 或者 覆盖重启等
方案3:通过容器,用老镜像重新起一个容器即可。(镜像都有版本号,tag等)
还有个很重要的点,是数据库,需要额外管理,与jenkins无关了。
(4.8)避免重复构建(如无代码更改)
方案1:对比 tag,或者 commit id,利用shell,保存上次tag、commit id (自带 gti_commit 变量)到文件,用shell 去对比当前的与上一次的。
方案2:对比内置变量(第1和第3个对比),写个if 对比变量1和变量3一下是否一样即可。
变量1:GIT_COMMIT(本次提交的ID)
变量2:GIT_PREVIOUS_COMMIT(上一次提交的ID)
变量3:GIT_PERVIOUS_SUCCESSFUL_COMMIT(上一次提交成功的ID)
5、Jenkins对接 Java项目(maven)
基本步骤:
1.开发提交代码-> gitlab 2.jenkins->git->获取Gitlab代码I3.代码的质量检测;sonarqube4.代码的编译;mvn clean package -->jar/war 5.发布过程: 5.1)摘除节点; 5.2)发布代码,创建软连接。(也是通过shell) 5.3)重载Tomcat服务,curl测试一下; 5.4)加入节点; 6.继续下一台节点;
(5.1)maven项目
安装与配置见3.7。
一般我们用mvn打包的命令是 mvn clean package。这个clean 就是把之前的编译包清掉。
新建 maven 项目。
与之前的区别如下图,加了个 -DskipTests,就是打包的时候跳过测试。


故障处理
(1)老版本jenkins插件包手动上传下载配置
老版本jenkins获取插件会报错,因为不是最新版本,很多插件需要至少某个版本以上才能支持。
需要自己手动下载老插件包、上传,相关操作参考:https://blog.csdn.net/GyaoG/article/details/157024588
插件下载:https://updates.jenkins-ci.org/download/plugins/
比如下载汉化版插件:
https://updates.jenkins-ci.org/download/plugins/localization-support/
https://.jenkins.io/download/plugins/localization-zh-cn/
我们的是2.26版本,找一个低版本最近的

然后登录自己Jenkins,在里面的"插件管理”->"Advanced settings",选择“选择文件”,然后再点击部署(不同版本Jenkins的Advanced settings界面显示有稍许不同)。

相关插件,全部下载好
git 用于拉取,credentials-binding用于凭据绑定。role用于角色,localization-support 用于本地汉化支持,localization-zh-cn 用户直接汉化,
浙公网安备 33010602011771号