打造高效Jenkins CICD环境全解析

目录

基于Jenkins构建生产CICD环境

一、安装与配置Jenkins

导入安装源

安装jenkins

登录jenkins

导入登录密码

创建管理员用户

配置实例

开始使用

重新登录jenkins

修改用户密码

安装必要插件

[安装Publish Over SSH](#安装Publish Over SSH)

[安装maven integration插件](#安装maven integration插件)

配置jenkins并发执行数量

配置邮件地址

二、基于Jenkins自动打包并部署Tomcat环境

传统网站部署的流程

传统代码上线的过程

目前主流网站部署的流程

1、配置git主机

安装git并配置git用户信息

创建本地仓库probe

git命令

克隆项目代码同步到自己创建的仓库中

2、配置jenkins主机

添加验证凭据

[添加 Publish Over SSH 远程主机](#添加 Publish Over SSH 远程主机)

[配置 JDK、Maven、Git 环境](#配置 JDK、Maven、Git 环境)

配置JDK

配置Maven

配置git

3、配置web主机

4、新建Maven项目

配置代码仓库

配置bulid

构建后操作

Jenkins自动化部署PHP项目

1、实验环境

2、准备git仓库

3、上传代码到仓库

4、部署web主机环境

5、Jenkins主机将密钥发布到web主机及git仓库所在主机

6、基于rsync部署

[7、 基于ansible部署](#7、 基于ansible部署)

修改jenkins运行用户

添加Ansible插件

8、使用pipline部署

9、Discuz论坛部署

git主机操作​


基于Jenkins构建生产CICD环境

一、安装与配置Jenkins

导入安装源

复制代码
[root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo --no-check-certificate https://pkg.jenkins.io/redhat-stable/jenkins.repo
[root@jenkins ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

安装jenkins

复制代码
[root@jenkins ~]# yum remove java-1.8.0-openjdk-headless java -y
[root@jenkins ~]# yum install fontconfig java-17-openjdk -y
[root@jenkins ~]# yum install jenkins -y

登录jenkins

导入登录密码

复制代码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 
fa041812a53a478eb47ae69264731f81

创建管理员用户

配置实例

开始使用

重新登录jenkins

修改用户密码

安装必要插件

安装Publish Over SSH

安装maven integration插件

配置jenkins并发执行数量

配置邮件地址

二、基于Jenkins自动打包并部署Tomcat环境

传统网站部署的流程

在运维过程中,网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码-->内网部署-->内网测试-->确认上线-->备份数据-->外网更新-->外网测试-->发布完成。如果在内网测试时发现代码有异常,返回代码开发人员名字,调整代码;如果在外网测试时发现外网部署的代码有异常,可以及时进行网站回滚。

传统代码上线的过程

开发人员发起代码上线的需求(邮件中包含开发做好的WAR包)-->运维人员连接线上负载调度器(Nginx)--> 隔离一组服务器(Tomcat)--> 连接服务器(Tomcat)--> 备份旧代码(tar打包)--> 删除旧代码目录 --> 上传新的WAR包 --> 外网测试 --> 测试不通过则通过备份回滚代码 --> 测试通过则利用rsync的脚本推送代码到其他服务器--> 统一外网测试 -->连接调度器恢复隔离机制 --> 隔离另一组服务器实施上线步骤 --> 上线完成。

目前主流网站部署的流程

目前主流网站部署方法:通过 Hudson/Jenkins 工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,属于开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins 非常易于安装和配置,简单易用。

  • 开发人员:写好代码,不需要自己进行源码编译、打包等工作,直接将代码分支存放在 SVN、Git 仓库即可。

  • 运维人员:减轻人工干预的错误率,同时解放运维人员繁杂的上传代码、手动备份、更新等操作。

  • 测试人员:可以通过 Jenkins 进行简单的代码及网站测试。

Jenkins 的工作原理是先将源代码从 SVN/Git 版本控制系统中拷贝一份到本地,然后根据设置的脚本调用Maven进行 build(构建)。整个系统的关键就是 build 脚本,build 脚本告诉Jenkins 在一次集成中需要执行的任务。

实验环境

操作系统 IP地址 主机名 角色
CentOS7.9 192.168.115.128 jenkins jenkins服务器
CentOS7.9 192.168.115.129 git git服务器
CentOS7.9 192.168.115.130 tomcat web服务器

1、配置git主机

安装git并配置git用户信息

复制代码
[[root@git ~]# yum -y install git
​
[root@git ~]# useradd git
​
[root@git ~]# echo "123456" | passwd --stdin git

创建本地仓库probe

复制代码
[root@git ~]# su - git
​
[git@git ~]$ mkdir probe.git
​
[git@git ~]$ cd probe.git
​
#初始化空的 Git 版本库于 /home/git/probe.git/
[git@git probe.git]$ git --bare init
​
[git@git probe.git]$ exit

git命令

复制代码
用法:git [--version] [--help] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
​
最常用的 git 命令有:
   add        添加文件内容至索引
   bisect     通过二分查找定位引入 bug 的变更
   branch     列出、创建或删除分支
   checkout   检出一个分支或路径到工作区
   clone      克隆一个版本库到一个新目录
   commit     记录变更到版本库
   diff       显示提交之间、提交和工作区之间等的差异
   fetch      从另外一个版本库下载对象和引用
   grep       输出和模式匹配的行
   init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库
   log        显示提交日志
   merge      合并两个或更多开发历史
   mv         移动或重命名一个文件、目录或符号链接
   pull       获取并合并另外的版本库或一个本地分支
   push       更新远程引用和相关的对象
   rebase     本地提交转移至更新后的上游分支中
   reset      重置当前HEAD到指定状态
   rm         从工作区和索引中删除文件
   show       显示各种类型的对象
   status     显示工作区状态
   tag        创建、列出、删除或校验一个GPG签名的 tag 对象

克隆项目代码同步到自己创建的仓库中

复制代码
#从gitee克隆测试项目到本地
[root@git ~]# git clone https://gitee.com/xiaobingby/Exam.git
#将仓库的空项目拉取到当前目录
[root@git ~]# git clone git@192.168.115.129:/home/git/probe.git
#将exam项目中的代码拷贝到probe/目录中
[root@git ~]# cp -r Exam/* probe/
[root@git ~]# cd probe/
#将当前目录下的所有修改或新增的文件添加到Git的暂存区
[root@git probe]# git add .
#设置全局的用户邮箱地址
[root@git probe]# git config --global user.email "z13516052620@163.com"
#设置全局的Git配置中的用户名
[root@git probe]# git config --global user.name "zhx"
#将本地代码变更提交到本地仓库,并添加一条简短的提交信息
#git commit:表示执行提交操作。
#-m "all probe"`:-m是一个选项,用于指定提交信息。"all probe"是提交信息的内容,可以根据实际情况进行修改。
[root@git probe]# git commit -m "all probe"
#将本地仓库的提交推送(上传)到远程仓库
#git push:表示执行推送操作。
#origin:是远程仓库的名称,默认情况下,Git会创建一个名为origin的远程仓库,它通常指向代码仓库的URL地址。
#master:表示要推送的本地分支的名称。master是Git默认的主要分支名称,但也可以是其他分支的名称。
[root@git probe]# git push origin master
​
####解决无法推送代码到master分支
git config receive.denyCurrentBranch ignore

2、配置jenkins主机

添加验证凭据

添加 Publish Over SSH 远程主机

复制代码
[root@tomcat ~]# mkdir /data

配置 JDK、Maven、Git 环境

配置JDK
复制代码
[root@jenkins ~]# tar xf jdk-8u371-linux-x64.tar.gz
[root@jenkins ~]# mv jdk1.8.0_371/ /usr/local/java8
配置Maven
复制代码
[root@jenkins ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz --no-check-certificate
[root@jenkins ~]# tar xf apache-maven-3.9.4-bin.tar.gz
[root@jenkins ~]# mv apache-maven-3.9.4 /usr/local/maven/
#配置maven源
[root@git ~]# vim /usr/local/maven/conf/setting.xml
153     <mirror>
154       <id>mirrorId</id>
155       <mirrorOf>repositoryId</mirrorOf>
156       <name>Human Readable Name for this Mirror.</name>
157       <url>https://maven.aliyun.com/repository/public</url>
158     </mirror>
​
#配置环境变量
[root@jenkins ~]# vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=${PATH}:${MAVEN_HOME}/bin
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# mvn -v
配置git
复制代码
[root@jenkins bin]# which git
/usr/bin/git

3、配置web主机

复制代码
[root@tomcat ~]# tar xf apache-tomcat-8.5.99.tar.gz 
[root@tomcat ~]# mv apache-tomcat-8.5.99 /usr/local/tomcat

发布公钥给jenkins主机

复制代码
[root@tomcat ~]# ssh-keygen 
[root@tomcat ~]# ssh-copy-id 192.168.115.128

4、新建Maven项目

配置代码仓库

复制代码
git clone git@192.168.115.112:/home/git/probe.git

主机Jenkins默认用jenkins用户去连接git,所以用jenkins用户生成密钥对,并发送给git。

复制代码
[root@jenkins ~]# id jenkins
uid=988(jenkins) gid=982(jenkins) 组=982(jenkins)
[root@jenkins ~]# cat /etc/passwd| grep jenkins
jenkins:x:988:982:Jenkins Automation Server:/var/lib/jenkins:/bin/false
[root@jenkins ~]# su -s /bin/bash jenkins 
bash-4.2$ ssh-keygen 
bash-4.2$ ssh-copy-id git@192.168.115.112

配置bulid

复制代码
Maven的"Goals and options"字段中可以指定多种构建命令(Goals)和选项(Options),用于执行不同的构建操作。以下是一些常见的构建命令:
​
1. clean:清理项目,删除生成的目标文件和临时文件。
2. validate:验证项目是否正确且所有必要信息可用。
3. compile:编译项目源代码。
4. test-compile:编译项目的测试代码。
5. test:运行项目的单元测试。
6. package:将编译的代码打包成可分发的格式,例如JAR或WAR文件。
7. install:将项目的包安装到本地仓库,以供其他项目或模块使用。
8. deploy:将项目的包部署到远程仓库,供其他开发人员或团队使用。
9. site:生成项目的文档网站。
10. clean-compile:先进行清理,然后进行编译。
11. clean-test:先进行清理,然后运行单元测试。
当使用Maven的"Goals and options"字段时,使用以下其他命令行选项:
​
1. "-U":强制更新依赖项的SNAPSHOT版本。
2. "-o":离线模式,不访问远程仓库来获取依赖项。
3. "-T":多线程构建,用于加快构建速度。例如,"-T 4"表示使用4个线程进行构建。
4. "-B":批处理模式,禁用交互式模式,使构建更加自动化。
5. "-DskipTests":跳过运行单元测试。
6. "-Dmaven.test.skip=true":跳过编译和运行测试。
7. "-Dmaven.compiler.source":指定项目的源代码兼容性版本。
8. "-Dmaven.compiler.target":指定生成的字节码的目标JVM版本。
9. "-Dmaven.repo.local":指定使用不同于默认的本地仓库。
10. "-Dmaven.wagon.http.proxyHost"和"-Dmaven.wagon.http.proxyPort":设置HTTP代理。

构建后操作

选择"构建后操作"中的"send build artfacts over SSH" "Exec command"中执行命令的含义是:在自动部署前先杀掉 Tomcat 进程,然后删除 war 包,用 scp 远程拷贝命令将 Jenkins 自动打包好的项目包拷贝到当前 Tomcat 应用目录。 然后重启 Tomcat 。

复制代码
/usr/local/tomcat/bin/shutdowm.sh 
rm -rf /usr/local/tomcat/webapps/*
scp 192.168.115.111:/var/lib/jenkins/workspace/probe/* /usr/local/tomcat/webapps/
/usr/local/tomcat/bin/startup.sh

Jenkins自动化部署PHP项目

1、实验环境

2、准备git仓库

复制代码
[root@git ~]# useradd git
[root@git ~]# echo "123" | passwd --stdin git
[root@git ~]# su - git
上一次登录:三 8月 23 20:41:53 CST 2023pts/0 上
[git@git ~]$ mkdir php.git
[git@git ~]$ cd php.git
#--bare:创建一个裸仓库。裸仓库是一种特殊的Git仓库,它不包含工作目录(没有文件的检出和编辑空间),主要用于共享,是作为远程仓#库被其他仓库推送(push)和拉取(pull)的中心存储库。
[git@git php.git]$ git --bare init
#初始化空的 Git 版本库于 /home/git/php.git/
[git@git php.git]$ exit
#登出

3、上传代码到仓库

复制代码
[root@git ~]# git clone git@192.168.166.9:/home/git/php.git
正克隆到 'php'...
git@192.168.200.111's password: 
warning: 您似乎克隆了一个空版本库。
[root@git ~]# cd php/
[root@git php]# cat << EOF > index.php
<?php
phpinfo();
?>
EOF
[root@git php]# git add .
[root@git php]# git commit -m "all"
[master(根提交) 4ec0ba3] all
 1 file changed, 3 insertions(+)
 create mode 100644 index.php
[root@git php]# git push origin master
git@192.168.166.9's password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.166.9:/home/git/php.git
* [new branch]      master -> master

4、部署web主机环境

复制代码
 ####httpd方式
 yum install -y httpd php php-mysqlnd mysql-server
 vim /etc/httpd/conf/httpd.conf
 <Directory>
    DocumentIndex index.html index.php
 </Directory>
 
 systemctl start httpd mysqld
 
 
###nginx方式
yum install -y nginx php php-mysqlnd mysql-server php-fpm
cd /etc/nginx/
mv nginx.conf nginx.conf.back
cp nginx.conf.default nginx.conf
vim nginx.conf
http {
...
include       conf.d/*.conf;
...
server {
...
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            root           html;
            fastcgi_pass   php-fpm;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
...
}
}
systemctl start  php-fpm mysqld nginx
###测试访问

5、Jenkins主机将密钥发布到web主机及git仓库所在主机

复制代码
[root@jenkins ~]# su -s /bin/bash jenkins
bash-4.2$ ssh-keygen
bash-4.2$ ssh-copy-id root@192.168.158.5
bash-4.2$ ssh-copy-id git@192.168.158.4

6、基于rsync部署

创建一个Freestyle project

build Now

7、 基于ansible部署

复制代码
[root@jenkins ~]# rpm -ivh epel-release-latest-7.noarch.rpm 
[root@jenkins ~]# yum -y install ansible
[root@jenkins ~]# vim /etc/ansible/hosts
[webserver]
192.168.166.6

修改jenkins运行用户

复制代码
[root@jenkins ~]# vim /usr/lib/systemd/system/jenkins.service 
User=root
Group=root
[root@jenkins ~]# systemctl daemon-reload 
[root@jenkins ~]# systemctl restart jenkins
 ###设置SSH的免密登录
[root@jenkins ~]#  ssh-keygen -N '' -f ~/.ssh/id_rsa
[root@jenkins ~]#  ssh-copy-id root@192.168.158.5
[root@jenkins ~]# ssh-copy-id git@192.168.158.4

添加Ansible插件

复制代码
[root@web ~]# cat /etc/nginx/nginx.conf
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html/php-ansible;
        index index.html index.php;
​
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf; 
        .....
[root@web ~]# systemctl restart nginx

8、使用pipline部署

复制代码
pipeline {
    agent any
    stages {
        stage('Checkout Code') {
            steps {
                // 使用 SSH 方式拉取 Git 代码
                git branch: 'master', // 替换为你的分支名称
                   url: 'git@192.168.158.4:/home/git/discuz.git' // 替换为你的 Git 仓库地址
            }
        }
​
        stage('Deploy to Server') {
            steps {
                sh 'scp -r ** root@192.168.158.5:/usr/share/nginx/html/ ;'
            }
        }
    }
​
    post {
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

9、Discuz论坛部署

git主机操作​
相关推荐
aristo_boyunv3 天前
拦截器和过滤器(理论+实操)
java·数据仓库·hadoop·servlet
张3蜂5 天前
CI/CD流水线驱动自动化流程深度解析:选型、竞品、成本与资源消耗
servlet·ci/cd·自动化
fqq36 天前
记录一个细节问题Servlet注解有两种方式
java·servlet·tomcat
小薛博客6 天前
26、Jenkins流水线
java·servlet·jenkins
KellenKellenHao6 天前
Jenkins调用ansible部署lnmp
servlet·ansible·jenkins
程序员的世界你不懂6 天前
【框架】基于selenium+java框架设计(0-1实战)
java·selenium·servlet
步行cgn11 天前
Servlet 注解:简化配置的完整指南
hive·hadoop·servlet
小菜全12 天前
HTML 和 JavaScript 关联的基础教程
servlet
晨晖212 天前
SpringMvc下
servlet