CICD-持续集成-代码上线-jenkins和sonarqube

gitLab

ubt安装gitlab

1. 更换阿里云仓库

jenkins

1.Jenkins 介绍与安装配置

1. Jenkins 简介

官网:jenkins.io
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

2. 安装 Jenkins

2.1 系统信息

Kylin 系统,IP 地址为 10.0.0.202,配置为 1 核 2G 内存。

2.2 安装 JDK 运行环境
[root@jenkins:~]# yum -y install java
2.3 使用 rpm 安装 Jenkins
[root@jenkins:~]# rpm -ivh jenkins-2.405-1.1.noarch.rpm

3. 启动 Jenkins 并修改启动用户

3.2 修改启动用户为 root(默认使用 jenkins 运行)
[root@jenkins:~]# grep root /usr/lib/systemd/system/jenkins.service
User=root
Group=root
3.3 重新加载配置文件
[root@jenkins:~]# systemctl daemon-reload
3.4 修改配置文件中的启动用户
[root@jenkins:~]# grep root /etc/sysconfig/jenkins
JENKINS_USER="root"
3.1 启动 Jenkins,
[root@jenkins:~]# systemctl start jenkins

4. 配置 Jenkins 的插件

4.1 上传插件压缩包,并重启服务

jenkins_plu.tar.gz 压缩包上传到 /var/lib/jenkins/plugins 目录:

[root@jenkins ~]# tar xf jenkins_plu.tar.gz  -C  /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins

5.页面访问配置jenkins

打开浏览器通过页面安装步骤:10.0.0.202:8080

2.手动的将gitlab中的代码运行到web服务器

  • 在web服务器把代码运行起来,模拟生产环境
[root@web01 /code/game]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  _;
    root /code/game;
    index index.html;
}
[root@web01 /code/game]# ls /code/game/
bgm.mp3  css  images  index.html  js  roms  shuoming.html
[root@web01 /code/game]# 

3.查看jenkins默认路径

默认路径:/var/lib/jenkins/workspace/game_job

4.jenkins拉取gitlab的代码

配置免密拉取

1.jenkins生成秘钥对
[root@jenkins:~]#ssh-keygen
[root@jenkins:~]#
[root@jenkins:~]#cat .ssh/id_rsa.pub
2.将公钥复制到gitlab的root账号中
image-20250218211509973

配置jenkins拉取game

image-20250218212437694
image-20250218212754455

5.jenkins给web推送代码

  • jenkins拿到代码后,推送给web服务器,前提要做ssh免密
image-20250218213021093

6.配置自动触发webhook钩子

2eee8142d44a4fd7aae2f9ab323ad781

6.1 jenkins配置

image-20250218214625574
image-20250218213912736

6.2gitlab页面配置勾子

image-20250218215340791
image-20250218215454708
image-20250218215013051
image-20250218225242247

6.3更改代码测试

步骤:开发改代码提交---dev账号gitlab申请合并---root账号同意合并---观察钩子有没有触发---访问web看有没有变化
[root@nfs01 ~]# git clone git@10.0.0.201:hsc/game.git 
[root@nfs01 ~]# cd game/
[root@nfs01 ~/game]# vim index.html
[root@nfs01 ~/game]# git add .
[root@nfs01 ~/game]# git commit -m "dev check hdl ddddd v1.5"
[root@nfs01 ~/game]# git branch dev
[root@nfs01 ~/game]# git push -u origin dev

SonarQube

sonarqbe介绍

Jenkins 将代码拉取到 Jenkins 本地,先将代码推送到 Sonar 服务器上进行代码扫描检测,可检测漏洞、逻辑和坏味道。

安装sonarqbe

1. 安装 Java

[root@sonarqube:~]# yum -y install java

2. 安装 MySQL

# 下载 radhad6 仓库
[root@sonarqube ~]# wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
# 安装 yum 仓库,也就是配置 repo 文件
[root@sonarqube ~]# rpm -ivh mysql-community-release-el6-5.noarch.rpm

编辑 /etc/yum.repos.d/mysql-community.repo 文件,关闭 gpgcheck,否则安装会报错:

[root@sonarqube ~]# vim /etc/yum.repos.d/mysql-community.repo
...
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=0
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
....

继续安装数据库相关组件、启动服务、设置密码并创建 Sonar 数据库:

[root@sonarqube ~]# yum -y install mariadb-server
[root@sonarqube ~]# service mysqld start
[root@sonarqube ~]# mysqladmin -uroot password lzy123.com
[root@sonarqube ~]# mysql -uroot -plzy123.com -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;"
[root@sonarqube:~]# mysql -uroot -plzy123.com -e "show databases;"

3. 安装 SonarQube

# 解压提前准备的包
[root@sonarqube:~]# unzip sonarqube-7.0.zip -d /usr/local/
# 创建软链接
[root@sonarqube:~]# ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube

修改连接数据库信息:

# 进入配置文件目录
[root@sonarqube:conf]# cd /usr/local/sonarqube/conf/
# 修改配置文件的 16、17 和 26 行
[root@sonarqube:conf]# vim sonar.properties
16 sonar.jdbc.username=root
17 sonar.jdbc.password=lizhenya123
18
26 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

4. 创建普通用户 sonar

SonarQube 服务必须由普通用户运行,创建 sonar 用户并修改相关目录的权限:

[root@sonarqube:~]# useradd sonar
[root@sonarqube:~]# chown -R sonar.sonar /usr/local/sonarqube-7.0/

5. 使用 sonar 用户运行服务

[root@sonarqube:~]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"

6. 浏览器访问

在浏览器中访问 10.0.0.203:9000 即可进入 SonarQube 服务界面。用户名和密码都是admin。

7.安装汉化插件

删除原有插件
[root@sonarqube:~]# cd /usr/local/sonarqube/extensions/plugins
[root@sonarqube /usr/local/sonarqube/extensions/plugins]# rm -rf *
上传插件
[root@sonarqube:plugins]# ll
total 44052
-rw-r--r-- 1 root root 45106788 Sep 27 17:20 sonar_plugins.tar.gz
解压插件
[root@sonarqube:plugins]# tar xf sonar_plugins.tar.gz
[root@sonarqube:plugins]# mv plugins/* .
重启 SonarQube 服务
[root@sonarqube:~]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"

配置sonarqube

image-20250219154802269
image-20250219154832542
image-20250219155137613

sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.0.203:9000 \
-Dsonar.login=41dd050e31f33e2f06372249252905c9bf7d18e1

sonar-scanner \       #命令
  -Dsonar.projectKey=html \   #名字
  -Dsonar.sources=. \     #.表示扫描当前目录的代码,所以要扫描的话需要先进去代码目录
  -Dsonar.host.url=http://10.0.0.203:9000 \   #服务器地址
  -Dsonar.login=41dd050e31f33e2f06372249252905c9bf7d18e1   #相当于密码,推送需要

配置 SonarQube 客户端

这里 SonarQube 客户端是 Jenkins 服务器,以下是在 Jenkins 服务器上的配置步骤:

1. 解压 SonarScanner 压缩包

[root@jenkins ~]# ll
-rw-r--r-- 1 root root 42397119 Sep 27 17:20 sonar-scanner-cli-4.2.0.1873-linux.zip
[root@jenkins ~]# unzip sonar-scanner-cli-4.2.0.1873-linux.zip -d /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins /usr/local]# ln -s sonar-scanner-4.2.0.1873-linux sonar-scanner

2. 将客户端命令写入 PATH 变量

确保能通过 tab 键补全 sonar 命令:

[root@jenkins ~]# tail -1 /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/sonar-scanner/bin"
[root@jenkins ~]# source /etc/profile

或者$PATH:
export PATH="$PATH:/usr/local/mysql/bin"

3. 执行 SonarQube 服务端提供的命令

将服务端提供的命令复制粘贴执行,\ 表示换行,必须在项目目录执行这个命令:

[root@jenkins /var/lib/jenkins/workspace/game_job]# sonar-scanner \
>   -Dsonar.projectKey=html \
>   -Dsonar.sources=. \
>   -Dsonar.host.url=http://10.0.0.203:9000 \
>   -Dsonar.login=41dd050e31f33e2f06372249252905c9bf7d18e1
执行成功
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 1:38.563s
INFO: Final Memory: 14M/151M
INFO: ------------------------------------------------------------------------

4.配置jenkins

  • jenkins–>sonarqub推送代码需要免密
1.jenkins生成秘钥对
[root@jenkins:~]#ssh-keygen
[root@jenkins:~]#
[root@jenkins:~]#cat .ssh/id_rsa.pub

2.将公钥推送到的sonarqube服务器
[root@jenkins ~]# ssh-copy-id 10.0.0.203
[root@jenkins ~]# ssh 10.0.0.203
[root@sonarqube ~]# exit

5.配置jenkins集成soanrqube

1.增加构建步骤,发现爆红
image-20250219170143846
image-20250219170425888
2.配置填写sonarqube服务器信息
image-20250219163223737
image-20250219170926889
3.配置客户端信息位置
image-20250219202719819
sonar.projectName=${JOB_NAME} # 项目在sonarqube上的显示名称
sonar.projectKey=html # 项目的唯一表示,不能重复
sonar.sources=. # 扫描那个项目的源码
image-20250219170143846
image-20250219172516070

修改sonar客户端指向10.0.0.203

  • 修改sonar客户jenkins端指向10.0.0.203
[root@jenkins /var/lib/jenkins/workspace/game_job]# vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://10.0.0.203:9000
sonar.login=815b5da0f31beb90ec2743e4c69cfb9141e6839e

最后由开发提交代码测试

1.检查jenkins有没有构建成功

2.检查sonarqube有没有检测代码质量

3.查看网页有没有变化成功

4.检查整条链路是否实现自动化

配置企业微信

1. 修改 Sonar 客户端指向

jenkins 服务器上修改 sonar 客户端配置,使其指向 10.0.0.203

[root@jenkins:conf]# cat sonar-scanner.properties
# Configure here general information about the
# environment, such as SonarQube server
# connection details for example
# No information about specific project should
# appear here

# ----- Default SonarQube server
sonar.host.url=http://10.0.0.203:9000
sonar.login=06ad81ebd4ad6fa78556a0556bbe8c6faed42287

# ----- Default source code encoding
sonar.sourceEncoding=UTF-8

2. 安装 Jenkins 插件

由于 Jenkins 没有官网的插件来完成此功能,所以我们只能使用网络上一些开源的插件(线下班不需要以2.步骤,已集合在 plugins插件中)。

  • 下载代码:从 GitHub 下载代码。
https://github.com/daniel-beck/changelog-environment-plugin
  • 解压并编译:将下载的代码解压到某个目录,然后进入该目录执行以下操作。
cd changelog-environment-plugin-master
mvn verify

此过程时间较长,执行完成后,会在 changelog-environment-plugin-master/target/ 目录下生成一个 changelog-environment.hpi 文件。

  • 上传插件:将生成的 changelog-environment.hpi 文件上传到 Jenkins 即可使用。

3. 配置 Jenkins

进入 Jenkins 项目,在构建环境中会多出 Add Changelog Information to Environment 选项,点击选择并进行如下配置:

  • Entry Format:添加 %3$s(at %4$s via %1$s),参数分别为 ChangeLog 内容,时间,提交人。
  • Date Format:添加 yyyy-MM-dd HH:mm:ss,即时间格式。
image-20250219210407292

4. 注册企业微信

此处需自行完成企业微信的注册操作。

注册企业微信,登录。https://work.weixin.qq.com/wework_admin/register_wx?from=myhome

5. 上传 Python 脚本

查看上传的 Python 脚本信息。

[root@jenkins:~]# ll /server/scripts/
total 4
-rw-r--r-- 1 root root 2008 Sep 28 14:59 jenkins_notify.py

6. 修改 Python 脚本信息

编辑 jenkins_notify.py 脚本,修改相关信息。

data = {
    "touser": "LiZhenYa",
    "msgtype": "text",
    "agentid": 1000002,
    "text": {
        # ... 其他内容 ...
    }
}

if __name__ == '__main__':
    Corpid = "wwc405833fe46b7159"
    Secret = "zF6EKit-phyTCs_r1ek4d5QI2HXGFzVGRhzSPXOmGAI"
    Subject = sys.argv[1]

7. 命令行测试

在命令行中安装必要的 Python 环境和依赖,并进行测试。

[root@jenkins:~]# yum -y install python2
[root@jenkins:~]# yum -y install python2-pip
[root@jenkins:~]# pip2.7 install requests   #如果爆红,更换网络
[root@jenkins:~]# python2.7 jenkins_notify.py test /etc/hosts game   #注意企业微信添加可信ip才行

测试结果示例:

[变更日志] : 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
[变更日志] : 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{"errcode":0,"errmsg":"ok","msgid":"Dv0oBVNA9p2BIWPODPqgkvbi0N1v9hStXHK_IQy35Yz3LogCCr6G6AqJJrtd0ZIxBRn8SI9fa8JJj_mYILOHEw"}

8. 集成到 Jenkins

在 Jenkins 中集成企业微信通知,注意传递 3 个参数。

echo "==========Start Notify=============="
echo ${SCM_CHANGELOG} > /tmp/${JOB_NAME}_change.log
python /server/scripts/jenkins_notify.py ${BUILD_URL} /tmp/${JOB_NAME}_change.log ${JOB_NAME}
rm -fv /tmp/${JOB_NAME}_change.log

---------------------
注意:脚本要放到/server/scripts/jenkins_notify.py
此代码用于 Jenkins 构建时发企业微信通知:
输出开始通知提示。
$SCM_CHANGELOG 是代码变更日志就是-m后面的,存入 /tmp 下以 $JOB_NAME(任务名)命名的文件。
运行脚本,传 $BUILD_URL(构建详情页 URL)、日志文件路径和 $JOB_NAME 发通知。
删除临时日志文件
image-20250219222437547
image-20250219210424947

9.测试

1.更改代码,提交代码

2.观察自动化jenkins和sonarqube

3.查看微信有没有收到消息

image-20250219223751352

线上发布流程

image-20250219224545316

1.配置jenkins获取tag版本号

image-20250222204443726
image-20250222212322287
将当前的稳定版本打tag版本号
[root@hao ~/game]# git tag -a v1.3 -m "v1.3稳定版本"
[root@hao ~/game]# git push -u origin v1.3
image-20250222200643082
image-20250222204602280
image-20250222204710023
image-20250222201553906
image-20250222204820730

2.配置到jenkins上,实现按钮发版和回滚

发版和回滚脚本:

[root@jenkins ~]# cat   /server/scripts/deploy.sh
#!/bin/bash
code_tar() {
    tar zcvf /opt/web.tar.gz ./*
}

code_cp() {
    scp /opt/web.tar.gz 10.0.0.7:/code/
}

code_un() {
    ssh 10.0.0.7 "mkdir -p /code/web_code_$git_tag"
    ssh 10.0.0.7 "cd /code; tar xf web.tar.gz -C web_code_$git_tag && rm -rf web.tar.gz"
}

code_ln() {
    ssh 10.0.0.7 "rm -rf /code/game && ln -s /code/web_code_$git_tag /code/game"
}

main() {
    code_tar
    code_cp
    code_un
    code_ln
}

if [ "$deploy_env" = "deploy" ]; then
    main
elif [ "$deploy_env" = "rollback" ]; then
    code_ln
fi
# 避免重复构建
#可以把上面的if判断换成下面这两个中的一个
# 当重复执行构建后会生成多个相同版本的文件,利用jenkins变量值解决重复性构建问题
# jenkins变量
# 1. GIT_COMMIT 当前版本提交产生的哈希唯一值
# 2. GIT_PREVIOUS_SUCCESSFUL_COMMIT 已经提交过的版本的哈希唯一值
# 使用以上两个值做比较,如果已提交则退出,如果没有提交过则继续执行构建,更改脚本做判断

if [ "$deploy_env" = "deploy" ]; then
    if [ "$GIT_COMMIT" = "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ]; then
        echo "构建失败该 $git_tag 版本号已部署"
    else
        main
    fi
elif [ "$deploy_env" = "rollback" ]; then
    code_ln
fi

# 也可以判断目标主机版本号是否存在
Te=`ssh 10.0.0.7 "ls -l /code/ | grep $git_tag | wc -l"`
if [ "$deploy_env" = "deploy" ]; then
    if [ $Te -eq 0 ]; then
        main
    else
        echo "该版本已经部署过,不可以重复构建"
        exit
    fi
elif [ "$deploy_env" = "rollback" ]; then
    code_ln
fi
image-20250222210731951

3.总结

代码测试流程:

在代码上线流程中,开发人员完成本地代码编写后,提交至 GitLab 的dev分支,再通过 Merge Request 合并到master主干分支。GitLab 利用 Webhook 自动通知 Jenkins 触发构建任务,Jenkins 从master分支拉取最新代码到本地构建目录。接着,Jenkins 调用 SonarQube 插件执行代码质量分析,依据代码规范、漏洞检测、重复代码等规则扫描。扫描结果发送到邮件或企业微信,流程终止。之后,Jenkins 通过 Shell 脚本将编译产物推送到测试服务器,自动重启测试服务器服务完成部署。


代码上线流程:

代码上线至生产环境时,首先从 master 分支打 Tag 标记稳定版本,如 v1.1,代表已通过测试的里程碑。在 Jenkins 中创建独立部署项目 deploy_prod,从 Tag 拉取代码确保版本确定性。部署时,按版本号创建目录并推送代码,通过设置发版和回滚按钮+shell脚本判断版本和按钮的变量可以实现自动执行,通过(按钮)人工选择与脚本化操作结合,兼顾效率与安全性。通过软链接切换到新版本,具备秒级回滚机制,可通过切换软链接到旧版本目录实现回退,同时保留多个历史版本,Jenkins 预设回滚按钮可一键触发脚本。对于多台服务器,使用 Ansible 或 Shell 脚本批量操作,通过 Playbook 或并行执行命令保证一致性部署。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇