DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查
Posted serendipity_cat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查相关的知识,希望对你有一定的参考价值。
DevOps 持续集成 - Jenkins + Gitlab
- 一、DevOps 概述
- 二、部署 Jenkins
- 三、部署 Gitlab
- 四、Jenkins + Gitlab + Nginx 自动化部署
- 五、报错排查
- ① webhook Hook executed successfully but returned HTTP 422
- ② Hook executed successfully but returned HTTP 404
- ③ Error 403 No valid crumb was included in the request
- ④ Failed to connect to repository : Error performing git command: git ls-remote -h
- ⑤ Urlis blocked: Requests to the local network are not allowed
更新时间:2021年5月24日
一、DevOps 概述
DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠
1.1 持续集成
在开发工程中可以频繁的将代码部署并集成到服务器进行自动化测试
1.2 持续交付
在持续集成的环境基础之上,将代码部署到预生产环境
1.3 持续部署
在持续交付的基础上,把部署到生产环境的过程自动化
持续部署和持续交付的区别在于最终部署到生产环境是自动化的
二、部署 Jenkins
Jenkins是一款基于Java编写的开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件
2.1 安装 JDK
yum -y install java-1.8.0-openjdk*
2.2 安装 Jenkins
国内下载源:清华源
cd /opt
#如果下载较慢可以尝试scp上传
curl -o /opt/jenkins-2.277.4-1.1.noarch.rpm https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.4-1.1.noarch.rpm
#使用版本为最新的LTS稳定版
rpm -ivh jenkins-2.277.4-1.1.noarch.rpm
2.3 Jenkins 配置优化
① JVM内存优化
cd /etc/sysconfig
cp -p jenkins{,.bak}
sed -i "47c JENKINS_JAVA_OPTIONS=\\"-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true\\"" jenkins.bak
cat jenkins.bak > jenkins
② 插件源优化
cd /var/lib/jenkins/updates
cp -p default.json{,.bak}
sed -i 's/http:\\/\\/updates.jenkins-ci.org\\/download/https:\\/\\/mirrors.tuna.tsinghua.edu.cn\\/jenkins/g' default.json && sed -i 's/http:\\/\\/www.google.com/https:\\/\\/www.baidu.com/g' default.json.bak
cat default.json.bak > default.json
2.4 启动 Jenkins
systemctl start jenkins
netstat -natp | grep java
① 解锁 Jenkins
根据提示的路径查看密钥
cat /var/lib/jenkins/secrets/initialAdminPassword
② 选择插件安装
如果不知道该如何选择可以点击安装推荐的插件
如出现插件安装失败多重试几次即可
2.5 安装 Git
yum -y install git
2.6 配置 Git
#配置git使用用户
git config --global user.name "fox"
#配置git使用邮箱
git config --global user.email "***@qq.com"
#配置git语法高亮
git config --global color.ui true
git config --list
2.7 初始化 Git
mkdir /work
cd /work
git init
git status
三、部署 Gitlab
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目
3.1 安装 Gitlab
官方下载源:https://packages.gitlab.com/gitlab/gitlab-ce
yum install -y policycoreutils-python
#YUM安装[不推荐]
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum install gitlab-ce-13.12.0-ce.0.el7.x86_64
#RPM安装
rpm -ivh gitlab-ce-13.12.0-ce.0.el7.x86_64.rpm
3.2 Gitlab 初始化
gitlab-ctl reconfigure
gitlab-ctl stop
3.3 Gitlab 配置优化
① 修改仓库地址
vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
② 优化内存占用
vim /etc/gitlab/gitlab.rb
#设置站点地址
external_url 'http://192.168.0.200'
#进程超时时间
unicorn['worker_timeout'] = 60
#减少进程数
unicorn['worker_processes'] = 10
#进程内存限制
unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
unicorn['worker_memory_limit_max'] = "300 * 1 << 20"
#减少数据库缓存
postgresql['shared_buffers'] = "256MB"
#减少数据库并发量
postgresql['max_parallel_workers_per_gather'] = 0
#关闭监控monitor
prometheus['monitor_kubernetes'] = false
egrep -v "#|^$" /etc/gitlab/gitlab.rb
#启动gitlab
gitlab-ctl start
四、Jenkins + Gitlab + nginx 自动化部署
4.1 生产环境
主机 | IP地址 | 软件包 |
---|---|---|
Jenkins | 192.168.0.100 | Jenkins Git |
Gitlab | 192.168.0.200 | Gitlab |
Web | 192.168.0.10 | Nginx Git |
4.2 Nginx 部署
Shell 一键部署脚本
#!/bin/bash
yum -y install git pcre pcre-devel zlib zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
wget -P /opt http://nginx.org/download/nginx-1.12.0.tar.gz
cd /opt
tar zxvf nginx-1.12.0.tar.gz
#配置伪装数据
cd /opt/nginx-1.12.0/src/core
cp -p nginx.h{,.bak}
sed -i '13c #define NGINX_VERSION "=)"' nginx.h.bak
sed -i '14c #define NGINX_VER "*Do you want have a bad time" NGINX_VERSION' nginx.h.bak
cat nginx.h.bak > nginx.h
cd /opt/nginx-1.12.0
./configure \\
--prefix=/usr/local/nginx \\
--user=nginx \\
--group=nginx
make -j && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf
echo '
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service &> /dev/null
systemctl restart nginx
ss -tnlp | grep "nginx" &> /dev/null
if [ $? -eq 0 ];then
echo "Nginx部署完毕!"
fi
① Nginx 配置优化[可选]
cd /usr/local/nginx/conf/
cp -p nginx.conf{,.bak}
#获取CPU核心数量
CPU=`cat /proc/cpuinfo | grep -c "physical id"`
#开启性能优化
sed -i '12a\\\\ use epoll;' nginx.conf.bak
#开启伪装
sed -i '20a\\\\ server_tokens on;' nginx.conf.bak
#设置工作线程
sed -i "3c worker_processes $CPU;" nginx.conf.bak
#开启网页压缩
sed -i -e '35 s/#//g' -e '35a\\\\ gzip_min_length 1k;' -e '35a\\\\ gzip_buffers 4 16k;' -e '35a\\\\ gzip_http_version 1.1;' -e '35a\\\\ gzip_comp_level 6;' -e '35a\\\\ gzip_vary on;' -e '35a\\\\ gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;' nginx.conf.bak
#开启防盗链
sed -i -e '50a\\\\tlocation ~* \\\\\\.(jpg|gif|swf)$ {' -e '50a\\\\t valid_referers none blocked *.benet.com;' -e '50a\\\\t if ( $invalid_referer ) {' -e '50a\\\\t rewrite ^/ http://www.benet.com/error.png;' -e '50a\\\\t }' -e '50a\\\\t root html;' -e '50a\\\\t expires 1d;' -e '50a\\\\t}' nginx.conf.bak
cat nginx.conf.bak > nginx.conf
4.3 Jenkins 插件安装
- Build Authorization Token Root
- Publish Over SSH
- Gitlab Authentication
- Gitlab Hook
- Gitlab
- Git Paramete
4.4 Jenkins 密钥认证
将公钥分发到Gitlab服务器
#全部回车
ssh-keygen -t rsa
将公钥传给 Web 服务器
ssh-copy-id 192.168.0.10
查看公钥
cat /root/.ssh/id_rsa.pub
① Gitlab新增SSH公钥
打开 Gitlab http://192.168.0.200
将 Jenkins 中的公钥插入其中 cat /root/.ssh/id_rsa.pub
② Jenkins 拉去代码认证
cat /root/.ssh/id_rsa
打开 Jenkins http://192.168.0.100:8080
添加凭证
③ Jenkins 集成 Gitlab
打开 Gitlab http://192.168.0.200
密钥一定要保存好
打开 Jenkins http://192.168.0.100:8080
添加新的凭证
修改全局配置
④ 添加 SSH 服务器
打开 Jenkins http://192.168.0.100:8080
Jenkins查看Key cat /root/.ssh/id_rsa
4.4 构建任务
打开 Jenkins http://192.168.0.100:8080
创建一个新项目
打开 Gitlab http://192.168.0.200
创建一个新项目
打开 Jenkins 项目选择源码管理,并勾选 git
配置构建触发器
Target branch Regex 目标分支正则表达式
生成WebHooks安全令牌
WebHooks是一种微服务API
通过自定义回调函数的方式来改变Web应用的一种行为
Source file 源文件地址 ,这里表示仓库中当前分支的所有代码
Remove prefix 指定要删除的目录
Remote directory 指将当前分支的代码所要部署的目录
Exec command 指代码部署后执行的指令,一般为重启服务
打开 Jenkins 项目 http://192.168.0.200/root/demo
选择设置 WebHooks
将刚才在 Jenkins 的key复制到这里
4.5 开始测试
传数据至gitlab
cd /work
git clone git@192.168.0.200:root/demo.git
cd demo
echo "Hello World" > index.html
git add index.html
git commit -m "add index.html"
git push
① 通过 WebHooks 构建
返回 HTTP 200 成功
② 通过 Jenkins 构建
打开 Jenkins 项目进行构建
查看 Web 服务器文件
五、报错排查
① webhook Hook executed successfully but returned HTTP 422
HTTP 422 请求格式正确,但是由于含有语义错误,无法响应
解决方法:检查WebHooks地址是否正确
② Hook executed successfully but returned HTTP 404
请求页面没用找到
解决方法:前往gitlab配置勾选 Enable authentication for '/project' end-point
③ Error 403 No valid crumb was included in the request
关闭跨站请求伪造保护,高版本jenkins取消了这个机制的关闭,这里直接对配置文件进行修改
解决方法:
vim /etc/sysconfig/jenkins
47行 修改为
JENKINS_JAVA_OPTIONS="-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dhudson.security.csrf.G lobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
systemctl restart jenkins
④ Failed to connect to repository : Error performing git command: git ls-remote -h
缺少软件包Git
解决方法:需要安装Git,并进行初始化,步骤参考章节2.5
⑤ Urlis blocked: Requests to the local network are not allowed
Gitlab默认禁止内网通信
解决方法:打开管理员设置 -> 网络
以上是关于DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查的主要内容,如果未能解决你的问题,请参考以下文章
云原生 • DevOps一文掌握持续集成工具 Jenkins