DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查

Posted serendipity_cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查相关的知识,希望对你有一定的参考价值。

更新时间: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地址软件包
Jenkins192.168.0.100Jenkins Git
Gitlab192.168.0.200Gitlab
Web192.168.0.10Nginx 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 | 环境部署 | 性能优化 | 报错排查的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins践行持续集成与持续部署实战之DevOps详解

云原生 • DevOps一文掌握持续集成工具 Jenkins

深入浅出DevOps:持续集成工具Jenkins

DevOps实践之持续集成Jenkins

基于Jenkins打造符合DevOps能力成熟度三级标准的持续集成流水线

devops持续集成开发——jenkins安装及基本使用