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

DevOps 持续集成 - Jenkins + Gitlab

  • 一、DevOps 概述
    • 1.1 持续集成
    • 1.2 持续交付
    • 1.3 持续部署
  • 二、部署 Jenkins
    • 2.1 安装 JDK
    • 2.2 安装 Jenkins
    • 2.3 Jenkins 配置优化
      • ① JVM内存优化
      • ② 插件源优化
    • 2.4 启动 Jenkins
      • ① 解锁 Jenkins
      • ② 选择插件安装
    • 2.5 安装 Git
    • 2.6 配置 Git
    • 2.7 初始化 Git
  • 三、部署 Gitlab
    • 3.1 安装 Gitlab
    • 3.2 Gitlab 初始化
    • 3.3 Gitlab 配置优化
      • ① 修改仓库地址
      • ② 优化内存占用
  • 四、Jenkins + Gitlab + Nginx 自动化部署
    • 4.1 生产环境
    • 4.2 Nginx 部署
      • ① Nginx 配置优化[可选]
    • 4.3 Jenkins 插件安装
    • 4.4 Jenkins 密钥认证
      • ① Gitlab新增SSH公钥
      • ② Jenkins 拉去代码认证
      • ③ Jenkins 集成 Gitlab
      • ④ 添加 SSH 服务器
    • 4.4 构建任务
    • 4.5 开始测试
      • ① 通过 WebHooks 构建
      • ② 通过 Jenkins 构建
  • 五、报错排查
    • ① 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 持续集成

在开发工程中可以频繁的将代码部署并集成到服务器进行自动化测试

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第1张图片

1.2 持续交付

在持续集成的环境基础之上,将代码部署到预生产环境

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第2张图片

1.3 持续部署

在持续交付的基础上,把部署到生产环境的过程自动化

持续部署和持续交付的区别在于最终部署到生产环境是自动化的

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第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

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第4张图片

② 选择插件安装

如果不知道该如何选择可以点击安装推荐的插件
如出现插件安装失败多重试几次即可
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第5张图片

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

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第6张图片

三、部署 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

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第7张图片

3.2 Gitlab 初始化

gitlab-ctl reconfigure
gitlab-ctl stop

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第8张图片

3.3 Gitlab 配置优化

① 修改仓库地址

vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第9张图片

② 优化内存占用

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

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第10张图片

四、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

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第11张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第12张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第13张图片

4.4 Jenkins 密钥认证

将公钥分发到Gitlab服务器

#全部回车
ssh-keygen -t rsa

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第14张图片
将公钥传给 Web 服务器

ssh-copy-id 192.168.0.10

查看公钥

cat /root/.ssh/id_rsa.pub

① Gitlab新增SSH公钥

打开 Gitlab http://192.168.0.200
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第15张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第16张图片
将 Jenkins 中的公钥插入其中 cat /root/.ssh/id_rsa.pub
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第17张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第18张图片

② Jenkins 拉去代码认证

cat /root/.ssh/id_rsa

打开 Jenkins http://192.168.0.100:8080

添加凭证
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第19张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第20张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第21张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第22张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第23张图片

③ Jenkins 集成 Gitlab

打开 Gitlab http://192.168.0.200
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第24张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第25张图片
密钥一定要保存好
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第26张图片
打开 Jenkins http://192.168.0.100:8080
添加新的凭证
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第27张图片
修改全局配置
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第28张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第29张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第30张图片

④ 添加 SSH 服务器

打开 Jenkins http://192.168.0.100:8080
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第31张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第32张图片
Jenkins查看Key cat /root/.ssh/id_rsa
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第33张图片

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第34张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第35张图片

4.4 构建任务

打开 Jenkins http://192.168.0.100:8080

创建一个新项目
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第36张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第37张图片
打开 Gitlab http://192.168.0.200

创建一个新项目
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第38张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第39张图片

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第40张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第41张图片
打开 Jenkins 项目选择源码管理,并勾选 git
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第42张图片
配置构建触发器
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第43张图片

Target branch Regex 目标分支正则表达式

生成WebHooks安全令牌

WebHooks是一种微服务API
通过自定义回调函数的方式来改变Web应用的一种行为

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第44张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第45张图片

Source file 源文件地址 ,这里表示仓库中当前分支的所有代码
Remove prefix 指定要删除的目录
Remote directory 指将当前分支的代码所要部署的目录
Exec command 指代码部署后执行的指令,一般为重启服务

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第46张图片
打开 Jenkins 项目 http://192.168.0.200/root/demo

选择设置 WebHooks
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第47张图片
将刚才在 Jenkins 的key复制到这里
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第48张图片

4.5 开始测试

传数据至gitlab

cd /work
git clone [email protected]:root/demo.git
cd demo
echo "Hello World" > index.html
git add index.html
git commit -m "add index.html"
git push

① 通过 WebHooks 构建

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第49张图片
返回 HTTP 200 成功
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第50张图片
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第51张图片

② 通过 Jenkins 构建

DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第52张图片
打开 Jenkins 项目进行构建
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第53张图片
查看 Web 服务器文件
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第54张图片

五、报错排查

① 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
DevOps 持续集成 - Jenkins + Gitlab | 环境部署 | 性能优化 | 报错排查_第55张图片

③ 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 | 环境部署 | 性能优化 | 报错排查_第56张图片

你可能感兴趣的:(运维,devops,jenkins,gitlab,ci/cd,运维)