Git+Jenkins实战(一)

一、案例环境

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.1libcrypt.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
相关推荐
Sadsvit1 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos
网硕互联的小客服1 小时前
如何配置安全的SFTP服务器?
运维·服务器·安全
程序员不迷路2 小时前
Nginx学习
运维·nginx
雅菲奥朗2 小时前
雅菲奥朗SRE知识墙分享(一):『SRE对智能运维领域所产生的深远影响』
运维·ai·sre
--运维实习生--3 小时前
shell脚本第二阶段-----选择结构
linux·运维·shell编程
Hello.Reader4 小时前
Elasticsearch Rails 集成(elasticsearch-model / ActiveRecord)
大数据·elasticsearch·jenkins
chenglin0164 小时前
Logstash——输出(Output)
运维·jenkins
苦逼IT运维4 小时前
Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务
运维·git·测试工具·ci/cd·jenkins
明天见~~5 小时前
Linux下的网络编程
linux·运维·网络