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账号中
配置jenkins拉取game
5.jenkins给web推送代码
- jenkins拿到代码后,推送给web服务器,前提要做ssh免密
6.配置自动触发webhook钩子
2eee8142d44a4fd7aae2f9ab323ad781
6.1 jenkins配置
6.2gitlab页面配置勾子
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
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.增加构建步骤,发现爆红
2.配置填写sonarqube服务器信息
3.配置客户端信息位置
sonar.projectName=${JOB_NAME} # 项目在sonarqube上的显示名称
sonar.projectKey=html # 项目的唯一表示,不能重复
sonar.sources=. # 扫描那个项目的源码
修改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
,即时间格式。
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 发通知。
删除临时日志文件
9.测试
1.更改代码,提交代码
2.观察自动化jenkins和sonarqube
3.查看微信有没有收到消息
线上发布流程
1.配置jenkins获取tag版本号
将当前的稳定版本打tag版本号
[root@hao ~/game]# git tag -a v1.3 -m "v1.3稳定版本"
[root@hao ~/game]# git push -u origin v1.3
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
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 或并行执行命令保证一致性部署。