运维从0开始学习jenkins

0、介绍

(0.1)CICD的概念

想要学会jenkins运维,了解相关概念。

img_v3_02u6_de135041-b1cd-4a9d-9bea-80c8ba69da1m

 

1)首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK, Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新 再执行一次整个流程
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问 应用。

(0.2 )jenkins介绍

jenkins由JAVA写的,所以要JDK,jenkins由很多插件组成强大的功能。

同时主要分为下面五大步骤。

image

 

 

 

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项目:https://www.jetbrains.com/zh-cn/help/idea/2025.1/creating-and-running-your-first-java-application.html#run_app

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包,安装步骤如下:

  1. 下载 Jenkins.

  2. 打开终端进入到下载目录.

  3. 运行命令 java -jar jenkins.war --httpPort=8080 --httpListenAddress=0.0.0.0

  4. 打开浏览器进入链接 http://ip:8080.

  5. 按照说明完成安装.

 

关闭 Jenkins
 http://localhost:8080/exit

重启 Jenkies
 http://localhost:8080/restart

重新加载配置信息
 http://localhost:8080/reload

(2)RPM安装

rpm -ivh jenkins包.rpm

 

image

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

image

 

 

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

 

image

 (1)互联网下载

 

# jenkins国外官方插件地址下载速度非常慢,所以改为国内插件地址

# 先点击一下 kenkins->manager jenkins -> manage plugins  加载一下下载列表

如下图,这样就可以在默认default.json中把官方插件列表下载到本地了。

  img_v3_02ub_cd0ca6fe-4b72-4077-9a99-ddc766a2eebm
然后我们就可以修改地址文件,替换为国内插件地址
进入Jenkins插件配置目录(Linux示例) cd /var/lib/jenkins/updates/,文件为 default.json
# 替换默认URL为清华镜像
# 替换默认URL 为华为云镜像(本次使用,主要是解决jenkins某些插件下载慢问题)
同时,插件管理配置里也修改

img_v3_02ub_972710cf-05c0-4c65-8889-93f5ee00b98m

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

img_v3_02ub_cd0ca6fe-4b72-4077-9a99-ddc766a2eebm

(3.4)jenkins常用插件

本次我们使用的插件有

  • Localization:Chinese(Simplified):汉化包插件
  • Role-based Authorization Strategy:管理Jenkins用户权限
  • Credentials Binding:凭证管理功能
  • git:从gitlab 拉取代码(OS与插件都需要)

(3.5)Role-based-Authorization 角色管理

找到security,启用角色策略。

img_v3_02uj_9b88bf46-bdac-4f84-9e46-69a6b13acf8m

 然后在设置目录下:找到 Manage and Assign Roles

进行新建,分配即可(分配角色给用户需要先新建用户,角色还有通配符匹配一说)。

如下图,先建一个全局角色给读权限,再建两个项目角色,集成

img_v3_02uo_b48b8b1f-cba9-4566-b5f8-c3e65b8a885m

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

 

img_v3_02uo_26836deb-e83b-477c-923d-a303e6b2a0am

 

这样用户登录后就只能看到对应有权限的项目

(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. 详细说明

  img_v3_0212b_93bc77a9-1ccf-476a-9932-949b7b2c762m

(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>

image

 

<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 配置-》全局工具配置

image

 

image

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

image

 测试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运行时,会加载这些参数。

image

 

步骤三:构建步骤-》增加构建步骤

  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

保存后。 

步骤四:运行项目

如下图,我们的信息全部都出来了,选择之后开始构建,则生成了。

       image

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

      image

 

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

       image

 构建时,则情况如下:

     image

(4.2)jenkins集成gitlabel

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

        image

 流程与步骤:

  其实私钥、公钥在哪个机器上生成都没有关系,主要是是一对就行.

  私钥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、调试测试

image

 上面4.2 中已经执行了 步骤1-3。

  前置准备:配置 jenkins服务器(sshkeygen.exe)到 发布机器(如nginx、web server)的密钥认证(ssh-copy-id ip)

手动上线:

image

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

image

 

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自带变量,哪里看呢?

image

 

后续按4.1 执行 shell即可。

Maven构建参考

进入项目-》配置-》构建步骤

image

 

image

 然后开始构建,查看日志即可。

(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中拉取

         image

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

                    image

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

       image

(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地址)

image

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

image

 

步骤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,就是打包的时候跳过测试。

image

image

 

 

 

 

故障处理

(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版本,找一个低版本最近的

image

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

image

 

相关插件,全部下载好

git 用于拉取,credentials-binding用于凭据绑定。role用于角色,localization-support 用于本地汉化支持,localization-zh-cn 用户直接汉化,

 

posted @ 2026-01-20 17:25  郭大侠1  阅读(45)  评论(0)    收藏  举报