一、案例环境
1、案例拓扑

2、资源清单
主机 | IP 地址 | 软件包 | 备注 |
---|---|---|---|
Jenkins | 192.168.10.104 | Jenkins | 大管家 |
gitlab | 192.168.10.105 | gitlab | 代码仓库 |
web01 | 192.168.10.101 | apache | web 服务器 |
dev | 192.168.10.102 | git | 开发人员 |
二、部署GitLab(192.168.10.105)
1、基础环境配置
(1) 关闭防火墙及内核
bash
hostnamectl set-hostname gitlab
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
(2) 解压并安装
bash
tar zxf gitlab-ce-17.8.2.rpm.tar.gz
cd gitlab-ce-17.8.2.rpm
ls
dnf -y install gitlab-ce-17.8.2-ce.0.el9.x86_64.rpm
(3) 修改配置文件
bash
vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.10.105'
是 GitLab 配置中的核心参数,用于指定 GitLab 服务对外提供访问的基础 URL

(4) 解决版本兼容问题
bash
ln -s /usr/lib64/libcrypt.so.1 /usr/lib64/libcrypt.so.2
具体来说:
libcrypt.so
是系统中负责密码加密相关功能的共享库文件- 某些版本的 GitLab(或其依赖的组件)可能编译时依赖
libcrypt.so.2
这个库文件 - 但部分 Linux 系统(如 CentOS 7 等)默认只安装了
libcrypt.so.1
(通常是glibc
提供的版本) - 通过创建从
libcrypt.so.1
到libcrypt.so.2
的软链接,可以让依赖libcrypt.so.2
的程序 "误以为" 找到了所需的库文件,从而避免因库版本不匹配导致的启动失败或功能异常
这个操作本质上是一种兼容处理,在系统库版本与软件依赖版本不一致时,通过链接方式临时解决依赖问题。如果系统环境允许,更规范的做法是安装对应版本的 libcrypt
库(如 libcrypt2
)。
2、部署
(1) GitLib初始化
bash
gitlab-ctl reconfigure
(2) 找到初始化密码
bash
cat /etc/gitlab/initial_root_password
EDgqXDTjQnTGv/gMKYyFBS2yfp/BHaHntPA6cQ/e3to=

(3) 登录

(4) 修改root密码

三、jenkins部署(192.168.10.104)
1、基础环境
bash
hostnamectl set-hostname jenkins
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
2、安装git
bash
dnf -y install git
3、安装字体库
bash
dnf -y install fontconfig
4、部署JDK
(1) 解压并移动到合适位置
bash
tar zxf jdk-11.0.16.1_linux-x64_bin.tar.gz
mv jdk-11.0.16.1 /usr/local/java
(2) 设置环境变量
bash
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
(3) 加载环境变量
bash
source /etc/profile
(4) 查看版本
bash
java -version

5、部署Tomcat
bash
tar zxf apache-tomcat-8.5.56.tar.gz
mv apache-tomcat-8.5.56 /usr/local/tomcat
6、部署Meven
(1) 解压并移动到合适位置
bash
tar zxf apache-maven-3.6.0-bin.tar.gz
mv apache-maven-3.6.0 /usr/local/maven
(2) 设置环境变量
bash
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
(3) 加载环境变量
bash
source /etc/profile
(4) 查看版本
bash
mvn -version

(5) 修改配置文件
将Maven仓库改为国内
bash
vim /usr/local/maven/conf/settings.xml
bash
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

7、部署nodejs(运行时)
(1) 部署nodejs的依赖环境
bash
dnf -y install gcc automake autoconf libtool
(2) 解压并移动到合适位置
bash
tar zxf node-v14.18.0-linux-x64.tar.gz
mv node-v14.18.0-linux-x64 /usr/local/nodejs14
(3) 优化路径并查看版本
bash
ln -s /usr/local/nodejs14/bin/* /usr/local/bin
node -v

(4) 查看node包管理工具(构建工具)
bash
npm -v

8、部署jenkins
bash
mv jenkins.war /usr/local/tomcat/webapps/
cd /usr/local/tomcat/webapps/
ls
/usr/local/tomcat/bin/startup.sh

9、设置Jenkins插件更新源
bash
cd
cd .jenkins/updates/
sed -i 's/https:\/\/www.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

10、找到初始密码
bash
cat /root/.jenkins/secrets/initialAdminPassword

11、登录Jenkins

12、安装插件(选离线)

13、跳过在线安装插件

14、创建管理员用户生成永久链接


15、开始使用

16、后续如需安装插件




17、拉取本地插件(原先下载好的)

18、然后重启 Jenkins
bash
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
重新查看插件是否已经被添加

19、安装JDK


20、安装Maven

21、安装NodeJS

四、Jenkins实现静态web网站自动发布
本案例部署了一个简单的静态网站,通过此操作过程,主要掌握代码发布的基本流程,以及在这个过程中我们需要注意的重点环节,也是掌握 jenkins 项目发布的入门级操作。在这些操作中,进一步学习jenkins 持续集成、持续部署流程。
1、安装web服务(192.168.10.101)
bash
hostnamectl set-hostname web01
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
dnf -y install httpd
systemctl start httpd
netstat -anpt | grep httpd
2、上传代码到GitLab
在本环节中,需要为项目团队创建一个网站开发的项目,此处我们在 gitlab 中创建一个模拟网站,项目的名字为 league。
(1) 在 gitlab 中创建空白项目 league

3、克隆空项目到dev主机开发者本地(192.168.10.102)
(1) 基础环境
bash
hostnamectl set-hostname dev
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
yum -y install git
(2) 克隆
bash
git clone http://192.168.10.105/root/league.git
(3) 设置代码提交者信息
bash
cd league
git config --global user.name "zhangsan"
git config --global user.email zhangsan@league.com
git config --global core.editor vim
git config --list
(4) 开发人员创建本地代码
我不会写,我找了一个案例

(5) 初始化本地仓库
bash
git init
(6) 提交至暂存区
bash
git add .
(7) 提交至本地仓库
bash
git commit -m "my info01"
(8) 为分支命名为main
bash
git branch -M main
(9) 输入GitLab账密,将分支版本移交远程仓库
在执行 git clone 操作的时候,已经将远程 gitlab 的仓库添加为了自己的仓库,默认的仓库名称为 "origin" 不需要在执行 git remote add 的命令。
bash
git push -u origin main
(10) GitLab查看提交结果

4、添加远程主机(将接收到的代码给服务器)
"Manage Jenkins"-->"System"-->"Publish over SSH",点击 SSH Servers 的新增按钮。须填写的信息如下:
- Name:为远程主机的起的名字;
- Hostname:远程主机的 IP 地址或域名;
- Username:远程主机的登录账号;
- Remote Directory:远程同步路径(如果要拷贝文件,此处填写远程主机接收文件的目录);
- 点击高级按钮,并勾选"Use password authentication,or use different key";
- 在 Passphrase/Password 中输入密码;
- 其他保持默认,并点击 test 按钮进行连接测试,测试结果为 Success 表示参数设置成功。
- 最后保存设置。
- 可以用同样的方法添加更多的主机。


5、jenkins 中设置项目构建参数
(1) 到 gitlab 中获取项目仓库的 URL
bash
http://192.168.10.105/root/league.git

(2) 创建一个项目

(3) 源码管理
在源码管理中选择 Git,并且把 gitlab 中获取的仓库 URL 填写进去。
注意在 "指定分支" 的地方,将分支名称修改为 "*/main"。在 gitlab 中我们自己创建一个新项目的时候,项目的分支名称由早期的 "master",修改为现在的 "main"

(4) 构建步骤配置
在本案例中,我们需要将 web 网站的代码文件同步到 web01 主机,需要同步文件,需要一个发送文件的构建步骤,具体操作如下:
增加构建步骤"Send files or execute commands over SSH"需要设置的关键参数如下:
- Name:在下拉菜单中选择目标主机;
- Source files:选择源文件位置,注意这里是工作目录的相对路径,不要写绝对路径。如果要同步此目录下所有内容,就填写"**/*";如果要同步工作目录下的 img 目录下的所有文件,就填写"img/*"。
- Remove prefix 该操作是针对上面的 source files 目录,会移除匹配的目录。通常留空
- Remote directory:远程主机的同步目录,注意这里也是相对路径。是相对于远程主机的同步目录的,我们在前面的远程主机中设置同步的目录是"/var/www/html",此处就直接写"/",代表将文件同步到远程主机的"/var/www/html"目录下。
- 如果需要同时将文件批量同步到更多的主机,可以继续增加构建步骤。
- Exec command:同步接收后需要在远程主机执行的命令。


(5) 构建并查看输出日志


(6) 测试

五、带有参数的项目发布
1、修改代码并重新提交
bash
cd leauge
vim index.html

bash
git add .
git commit -m "AAA"
git tag AAA
git push origin main AAA

bash
vim index.html

bash
git add .
git commit -m "BBB"
git tag BBB
git push origin main BBB

bash
vim index.html

bash
git add .
git commit -m "CCC"
git tag CCC
git push origin main CCC

2、Jenkins 项目设置
(1) 修改 General 参数
勾选 "This project is parameterized",并点击 "添加参数",添加 "Git Parameter" 参数。
设置的参数如下:
名称:Tag
默认值:origin/main


设置源码管理

构建项目并测试

AAA

BBB

CCC

六、Jenkins项目实时触发
在配置 Jenkins 实现前端自动化构建的过程中,Git 如何通知 Jenkins 对应 Job 的工作区实时构建呢?web 开发过程中的 webhook,是一种通过通常的 callback,去增加或者改变 web page 或者 web app行为的方法。这些 callback 可以由第三方用户和开发者维持当前,修改,管理,而这些使用者与网站或者应用的原始开发没有关联。
webhook 这个词是由 Jeff Lindsay 在 2007 年在计算机科学 hook 项目第一次提出的。Webhooks 是"user-defined HTTP 回调"。它们通常由一些事件触发,例如"push 代码到 repo",或者"post 一个评论到博客"。因此,我们可以将 jenkins 的某个项目的 webhook 放置到 gitlab,当 gitlab 中对应的项目代码有更新时,就会向 jenkins 触发一个构建的事件,这样就完成了一个项目自动触发的流程。

1:设置触发器
项目-->配置-->构建触发器,勾选项目的 webhook
复制出里面的 webhook URL
bash
http://192.168.10.104:8080/jenkins/project/league

生成token
在"构建触发器"中生成一个 Token,并且把这个 Token 复制出来:
bash
df00c1462b8b5149961bd67f2a16f8e4

2、设置触发机制
(1) 找到 Admin 选项
单击 Menu-->Admin

(2) 为 gitlab 设置外发请求
在这里要设置 gitlab 允许利用钩子(webhook)发送请求到本地网络。
Menu-->Admin-->Settings-->Network-->Outbound requests
设置 Outbound request(外发请求)
勾选 "允许 webhook 和服务对本地网络的请求" 和 "允许系统钩子向本地网络发送的请求",如下图所示

(3) 设置项目的 webhook 参数
打开自己创建的项目,Settings-->Webhooks
点击右上角 Add new Webhook 按钮,
粘贴前面步骤中生成的 webhook 的 URL 和 Token


(4) 设置触发器

(5) 测试


(6) 修改代码测试是否自动触发
bash
vim index.html

bash
git add .
git commit -m "DDD"
git tag DDD
git push origin main DDD



五、jenkins+ansible+gitlab 实现 PHP 项目发布
在此案例中,我们将进一步学习 jenkins 较为复杂一点的应用,本案例将 ansible 集成到了 jenkins 中,让 jenkins 利用 ansible 插件,向远程主机推送文件和指令,完成自动化的项目部署。
1、安装 LAMP 环境
在 web01 主机上,安装 LAMP 环境。
bash
dnf -y install httpd httpd-devel mysql mysql-server mysql-devel php php-mysqlnd php-common php-gd php-xml rsync
systemctl start mysqld
mysqladmin -uroot password 'pwd123'
mysql -uroot -ppwd123
create database wordpress;
grant all on *.* to root@'localhost';

2、jenkins 主机安装 Ansible 插件
(1) 做无密码验证
Ansible 的工作是基于 SSH 协议的,它使用 SSH 连接到远程主机并执行命令。因此在将 ansible 集成给 jenkins 的时候,需要在 jenkins 主机上生成密钥对,并同步公钥给远程 web 主机,为 ansible 的运行提供基础。
bash
ssh-keygen
ssh-copy-id 192.168.10.101
(2) 在 jenkins 主机安装 ansible
如果要结合 ansible 实现项目的自动发布,就需要在 jenkins 上添加 ansible 插件,但是只在 Jenkins 中安装 Ansible 插件是不行的,还要在 Jenkins 主机上安装 Ansible 程序。
bash
dnf -y install ansible rsync
vim /etc/ansible/hosts
bash
[webservers]
192.168.10.101

3、在GitLab中创建空项目

4、程序员提交代码到本地
(1) 克隆空项目到本地
bash
git clone http://192.168.10.105/root/wordpress.git
(2) 生成代码
bash
tar zxf wordpress-6.8.2.tar.gz
cd wordpress
git init .
git add .
git commit -m "wp"
git tag 1.0.0
git push origin 1.0.0

5、Jenkins创建项目并发布测试
(1) 创建空项目

(2) 动态获取 Git 仓库 Tag,与用户交互选择 Tag 发布
勾选 "This project is parameterized",并点击 "添加参数",添加 "Git Parameter" 参数。
设置的参数如下:
名称:Tag
默认值:origin/main


(3) 设置源码管理参数
在源码管理项,选中 Git,添加代码仓库的 URL:
修改 */master 为 $Tag。Tag 是上面动态获取的变量名,表示根据用户的选择确定要发布的代码版本。

(4)设置 "Build Steps" 参数,添加 ansible 同步参数
在 "Build Steps" 中,点 "增加构建步骤"→"Invoke Ansible Ad - Hoc Command",在这里设置的主要参数如下:
- Host pattern:设置 ansible 中的主机组的名字,本案例中我们用的是 "webservers"
- Inventory:选择 File or host list,填写的文件是 ansible 的主机清单 /etc/ansible/hosts
- Module:设置同步方式,此处使用 "synchronize" 的方式,表示使用 rsync 同步;
- Module arguments or command to execute:填写 ansible 的同步命令:命令如下:
src=${WORKSPACE} dest=/var/www/html rsync_opts=--exclude=.git
备注:
ansible 命令解释:
- ${WORKSPACE} 表示该变量指向的路径是 jenkis 主机从 git 服务器获取到的项目 :/root/.jenkins/workspace
- rsync_opts=--exclude=.git:同步时将.git 文件除外,该文件不同步


(5) 设置 "Build Steps" 参数,添加远程主机执行的命令
在 "Build Steps" 选项中,再次点击 "增加构建步骤",选择 "Execute shell",填写需要让 jenkins 主机执行的 ansible 命令:
bash
ansible "webservers" -m command -a "systemctl restart httpd"
ansible "webservers" -m command -a "chown -R apache:apache /var/www/html/"
ansible "webservers" -m command -a "chmod 755 -R /var/www/html/"


(6) 构建


6、访问测试
bash
http://192.168.10.101/blog-wordpress

