devops持续集成-jenkins+gitlab|环境部署|性能优化|报错排查(代码片段)

serendipity_cat serendipity_cat     2022-12-12     565

关键词:

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-1:持续集成工具jenkins的安装(代码片段)

Jenkins是一个开源的持续集成工具,基于Java开发。简单说,它能帮助团队,进行自动化的代码审核、代码构建、自动化测试、发布等一系列流程,并且有非常多的插件进行过程增强、监控、多项目联动构建部署、... 查看详情

深入浅出devops:持续集成工具jenkins

查看详情

devops实践之持续集成jenkins(代码片段)

一、安装Jenkins(1)下载并安装配置JavaDevelopmentKit8[[email protected]~]#rpm-ivhjdk-8u161-linux-x64.rpmPreparing...###########################################[100%]1:jdk1.8################################### 查看详情

使用gitlab+jenkins实现持续集成(ci)环境(代码片段)

使用GitLab+Jenkins实现持续集成(CI)环境一、持续集成简介1.GitLab简介2.Jenkins简介3.GitLab和GitHub的区别4.持续集成系统的工作流程二、使用GitLab+Jenkins实现持续集成(CI)环境1.安装Gitlab1)登录Gitlab2)配... 查看详情

gitlab+jenkins持续集成

构建:  需要将jenkins服务器上 jenkins用户的公钥发送给 目标服务器的gs用户,使得在jenkins上能用gs免密登录目标服务器自动化构建需要配置gitlab的钩子,并在jenkins上做配置 自动构建后,邮件通知 查看详情

1.gitlab和jenkins结合构建持续集成(ci)环境

14.1持续集成概述及运行流程14.1.1持续集成概述持续集成概述:持续集成(Continuousintegration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进行自动化测试。持续交付:持续交付指的是在持续... 查看详情

devops持续集成开发——jenkins的权限管理配置

前言jenkins作为目前主流的devops工具,受到了广大开发用户的追捧。由于其丰富的插件库,其可插拔的功能使得其功能和生态都十分强大。本节内容是关于jenkins的权限管理组件Role-basedAuthorizationStrategy的安装及使用。正文... 查看详情

持续集成之④:gitlab触发jenkins构建项目

持续集成之④:GitLab触发jenkins构建项目一:目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署... 查看详情

jenkins持续集成之gitlab组权限设置

一、在GitLab管理平台上创建一个组二、基于组的权限创建仓库三、把相应用户加入到该组上四、权限测试 查看详情

jenkins+gitlab实现持续集成(代码片段)

一、Jenkins及持续集成1)什么是Jenkins?Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1)持续的软... 查看详情

jenkins持续集成之gitlab安装(代码片段)

一、安装相应所需依赖包yuminstalllokkityuminstallcurlopenssh-serveropenssh-clientspostfixcronie-yservicepostfixstartchkconfigpostfixonlokkit-shttp-ssshcurl-sShttp://packages.gitlab.cc/install/gitlab-ce/script.rpm 查看详情

devops-1:持续集成工具jenkins的安装(代码片段)

Jenkins是一个开源的持续集成工具,基于Java开发。简单说,它能帮助团队,进行自动化的代码审核、代码构建、自动化测试、发布等一系列流程,并且有非常多的插件进行过程增强、监控、多项目联动构建部署、... 查看详情

linux-gitlab+jenkins持续集成+自动化部署(代码片段)

GitLab+Jenkins持续集成+自动化部署什么是持续集成?(1)Continuousintegration(CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都... 查看详情

jenkins——持续集成介绍及jenkins安装部署(插件+用户权限+凭据+maven打包)(代码片段)

持续集成介绍及Jenkins安装部署持续集成及Jenkins介绍软件开发生命周期什么是持续集成?持续集成的组成要素持续集成的好处Jenkins介绍Jenkins安装和持续集成环境配置持续集成流程说明Gitlab代码托管服务器安装Gitlab添加组、创... 查看详情

云原生•devops一文掌握持续集成工具jenkins(代码片段)

目录一、持续集成工具Jenkins介绍1.什么是持续集成2.Jenkins介绍二、Jenkins的安装与部署1.安装 Jenkins2.本地访问Jenkins3.插件的安装4.卸载Jenkins三、Jenkins全局配置1.Git的安装与配置2.JDK的安装与配置3.maven的安装与配置三、将代码上传... 查看详情

jenkins+gitlab实现持续集成[二]

项目:使用git+jenkins实现持续集成650)this.width=650;"src="https://s4.51cto.com/wyfs02/M01/99/AB/wKioL1lLJhDi_OfmAAAxZYAJltQ794.png-wh_500x0-wm_3-wmp_4-s_25854876.png"title=")]XMLZ2AN8A74XP_{51RBOC.png"alt="wKioL 查看详情

03持续集成和部署/基础设施-devops之路(代码片段)

02持续集成和部署/基础设施-DevOps之路文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi服务的持续集成和部署这里有两套选择方案:GitlabRunnerJenkinsGitlabRunner此处采用GitlabRunner进行CI/CD。官方文档:https://about.gitlab.com/features/... 查看详情

devops-2:持续集成工具jenkins构建.net项目(代码片段)

本文介绍,如何使用Jenkins构建.Net项目。环境配置安装MsBuild编译工具1、下载工具下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/进入页面,最下面“所有下载”,点开“适用于VisualStudio2022的工具”,下载... 查看详情