Gitlab与Jenkins的部署和使用

Gitlab官方网址:

https://about.gitlab.com/

在线安装包下载安装教程-选择对应版本后:

https://about.gitlab.com/install/

各版本离线安装包下载地址:

https://packages.gitlab.com/gitlab/gitlab-ce

rpm包国内下载地址:

https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

离线安装包安装Gitlab

[Thu Jul 18 13:55
 root@gitlab /opt]#ll
-rw-r--r--  1 root root 668531950 Jul 18 11:16 gitlab-ce_11.11.5-ce.0_amd64.deb

#使用dpkg安装
[Thu Jul 18 13:55
 root@gitlab /opt]#dpkg -i gitlab-ce_11.11.5-ce.0_amd64.deb

#使用`dpkg -c file`,可查看安装目录列表
[Thu Jul 18 13:55
 root@gitlab /opt]#dpkg -c gitlab-ce_11.11.5-ce.0_amd64.deb | less

安装生成的目录有哪些:

/etc/gitlab         #配置文件目录
/run/gitlab         #运行pid目录
/opt/gitlab         #安装目录
/var/opt/gitlab     #数据目录
/var/log/gitlab     #日志目录

使用docker安装gitlab:

mkdir -pv /data/gitlab/{etc,log,data}

docker run \
    --detach \
    --publish 443:443 \
    --publish 80:80 \
    --name gitlab \
    --restart unless-stopped \
    -v /data/gitlab/etc:/etc/gitlab \
    -v /data/gitlab/log:/var/log/gitlab \
    -v /data/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:12.10.14-ce.0

配置第三方邮件通知:

[Thu Jul 18 13:54
 root@gitlab ~]# vim /etc/gitlab/gitlab.rb
#配置访问网址,此网址需要内网DNS解析。佛则写IP地址
external_url 'http://gitlab.martin.com'

#下面的两个邮箱要一致
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "XXXX@qq.com"
gitlab_rails['smtp_password'] = "****"      #此为授权秘钥,非密码
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'XXXX@qq.com
user["git_user_email"] = "XXXXX@qq.com"

默认存储目录为/var/opt/gitlab/git-data/repositories/

可选修改gitlab数据存储目录,也可挂载NFS或分布式存储到此目录:

git_data_dirs({
   "default" => {
     "path" => "/mnt/nfs-01/git-data"
    }
})

重读配置文件内容:

[Thu Jul 18 17:13
 root@gitlab ~]#gitlab-ctl reconfigure

gitlab常用命令:

# gitlab-ctl reconfigure    #修改完配置文件要执行此操作
# gitlab-rails --help   #用于启动控制台进行特殊操作,比如修改管理员密码、打开数据库控制台(如# gitlab-rails dbconsole)等
# gitlab-psql           #数据库命令行
# gitlab-rake           #数据备份恢复等数据操作
# gitlab-ctl            #客户端命令行操作行
# gitlab-ctl stop       #停止gitlab
# gitlab-ctl start      #启动gitlab
# gitlab-ctl restart    #重启 gitlab
# gitlab-ctl status     #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志

WEB界面登录:

初次访问设置root登录密码,需要符合密码复杂度。

默认首页如下:

修改管理员账号的邮箱,该邮箱用于发送系统提醒邮件。

取消账号注册功能

使用管理员登录创建一个用户

使用管理员登录创建一个组

使用管理员登录创建一个项目

将用户加入这个项目,并授权为Maintainer,即devops组blogs项目的leader,此用户可自行向blogs项目中添加组成员。

创建一个index.html

客户端尝试clone项目

[Thu Jul 18 23:19
 root@docker1 /usr/local/src]#git clone http://192.168.1.10/devops/blogs.git
正克隆到 'blogs'...
Username for 'http://192.168.1.10': martin
Password for 'http://martin@192.168.1.10': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.

[Thu Jul 18 23:20
 root@docker1 /usr/local/src]#tree blogs/
blogs/
└── index.html
0 directories, 1 file
编辑文件并测试提交:
/usr/local/src]#cd blogs/

# 下面两条命令会在当前用户家目录下生成.gitconfig。作用的话,只是提交代码的时候不提示--global信息而已,无实际意义。
/usr/local/src/blogs]#git config --global user.name "martin"

/usr/local/src/blogs]#git config --global user.email 478165273@qq.com

# 重新编辑index.html内容
/usr/local/src/blogs]#cat index.html
blogs v1
<h2>blogs v2</h2>

提交到本地仓库
/usr/local/src/blogs]#git add index.html

/usr/local/src/blogs]#git commit -m "v2"
[master 335a562] v2
 1 file changed, 2 insertions(+), 1 deletion(-)

/usr/local/src/blogs]#git push
Username for 'http://192.168.1.10': martin
Password for 'http://martin@192.168.1.10':
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 251 bytes | 251.00 KiB/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.1.10/devops/blogs.git
   4b0d8a4..335a562  master -> master

Web端验证:

配置ssh key,使客户端可以免秘钥pull或push和git clone。

/usr/local/src/blogs]#ssh-keygen    生成公钥
/usr/local/src/blogs]#cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3HGvY4JvBNGF0Bn9QOLH0xk4vG216m+chL/bbQOnHqL/ggm6mAj+khowcokyNiPr3GNmj4gy/lap4HEyGzlhyL+tf13iQgb+piRpTiNVkb8oTMXLDLR259aCC+FLineBjFQW4JFeQJ/MJzDSmLADLDjT5nkF4rK/JTv1eyVQM8XqsCoP1WPFJjrAQrMYBKejgj9pq3QwxOZ4JZXXVlS9tizeRMASPiACY5xffIeLJCsLKltRahvxszKZWtGnZGQo+NuNZHRF2io1jM5CI71T6EW84UeiBvQjlV3d164f21bIc/5KaHpQfc8NBsf8BI3eMcBS4gAdxCiV6DgMWoreZ root@docker1.martinhe.com

客户端测试ssh克隆项目到本地

git常用命令:

# git config --global user.name "martin"    #设置全局用户名
# git config --global user.email "478165273@qq.com"     #设置全局邮箱
# git config --global --list        #列出用户全局设置
user.name=martin
user.email=478165273@qq.com

#基于http方式clone项目文件,此方法需要输入用户名和密码,需用户在相应项目组内
# git clone http://gitlab.martin.com/devops/blogs.git

#基于ssh方式clone项目文件,此方法需事先配置id_rsa.pub key在服务器端,方可免密上传或下载。
# git clone git@gitlab.martin.com:devops/blogs.git


# git add ./*   |   git add index.html      #添加到暂存区,可以单个文件或多个文件
# git commit -m "这是注释版本信息"      #提交到本地工作区
# git push      #上传到gitlab分布式仓库服务器
# git pull      #获取代码到本地
# git log       #查看操作日志
# vim gitignore #定义忽略文件
# git reset hard HEAD^^ #git版本回滚, HEAD为当前版本,加一个^为上一个,两个即为上上个
# git reflog    #获取每次提交的ID ,可以使用hard根据提交的ID进行版本回退
# git reset hard 10b67f1 回退到指定 id 的版本

# git branch    #查看当前所 处的分支
# git checkout -b develop   #创建并切换到一个新分支
#默认情况下开发领导创建分支后,所有开发提交代码到分支,后经开发领导组合到master分支
# git checkout develop  #切换分支

Windos客户端下载链接:

https://gitforwindows.org/

默认安装即可,使用方法和linxu界面一样

gitlab数据备份恢复:

停止gitlab数据服务

# gitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up

# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up

手动备份数据:

# gitlab-rake gitlab:backup:create  #在任意目录即可备份当前 gitlab 数据
2019-07-19 14:15:30 +0800 -- Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping repositories ...
 * devops/blogs ... [DONE]
[SKIPPED] Wiki
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping uploads ... 
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping builds ... 
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping artifacts ... 
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping pages ... 
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping lfs objects ... 
2019-07-19 14:15:32 +0800 -- done
2019-07-19 14:15:32 +0800 -- Dumping container registry images ... 
2019-07-19 14:15:32 +0800 -- [DISABLED]
Creating backup archive: 1563516932_2019_07_19_11.11.5_gitlab_backup.tar ... done
Uploading backup archive to remote storage  ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... skipping

# gitlab-ctl start      #备份完成后启动gitlab,或者单独启动上述停止的服务
ok: run: alertmanager: (pid 12919) 93981s
ok: run: gitaly: (pid 12803) 93986s
ok: run: gitlab-monitor: (pid 12858) 93984s
ok: run: gitlab-workhorse: (pid 12835) 93985s
ok: run: logrotate: (pid 84437) 2899s
ok: run: nginx: (pid 12473) 94093s
ok: run: node-exporter: (pid 12847) 93985s
ok: run: postgres-exporter: (pid 12934) 93980s
ok: run: postgresql: (pid 12101) 94237s
ok: run: prometheus: (pid 12879) 93983s
ok: run: redis: (pid 11862) 94271s
ok: run: redis-exporter: (pid 12866) 93984s
ok: run: sidekiq: (pid 89639) 0s
ok: run: unicorn: (pid 89646) 1s

查看要恢复的文件:

/var/opt/gitlab/backups/ #Gitlab数据备份目录,需要使用命令备份
/var/opt/gitlab/nginx/conf #nginx配置文件
/etc/gitlab/gitlab.rb #gitlab 配置文件

# ll /var/opt/gitlab/backups/
total 128
-rw-------  1 git  git  122880 Jul 19 14:15 1563516932_2019_07_19_11.11.5_gitlab_backup.tar

在Web界面删除devops/blogs项目:

执行恢复数据:

#恢复数据之前停止服务
# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq

# gitlab-rake gitlab:backup:restore BACKUP= 备份文件名
# gitlab-rake gitlab:backup:restore BACKUP=1563516932_2019_07_19_11.11.5
#备份恢复时会出现警告信息,即会删除所有现有数据,是否恢复,输入yes即可,后续给你5秒钟考虑时间,是否取消,不取消自动恢复数据

# gitlab-ctl start  启动服务即可

汉化gitlab

基于第三方gitlab爱好者汉化

gitlab地址:

https://gitlab.com/xhang/gitlab
https://gitlab.com/xhang/gitlab/-/tags/v11.11.5-zh

方法1:下载语言包替换:

#首次安装gitlab相关步骤
# vim /etc/gitlab/gitlab.rb 修改配置
# gitlab ctl reconfigure

#已经安装gitlab后,相关步骤
# gitlab-ctl stop
# tar xvf gitlab-vX.Y.Z-zh.tar
# cp -a /opt/gitlab/embedded/service/gitlab-rails /opt/gitlab rails.bak #备份源文件
# cp -a gitlab-vX.Y.Z-zh/* /opt/gitlab/embedded/service/gitlab-rails/   #替换文件
# gitlab-ctl reconfigure
# gitlab-ctl start

汉化后的管理界面:

方法2:基于源码汉化:有难度,各种报错

# git clone https://gitlab.com/xhang/gitlab.git
# head -1 /opt/gitlab/version-manifest.txt 查看当前 gitlab 版本
# cd gitlab
# git diff v11.11.5 v11.11.5-zh
# git diff v11.11.5 v11.11.5-zh > /root/v11.11.5-zh.diff
# gitlab-ctl stop
# patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < /root/v11.11.5-zh.diff -R        #为什么第一次执行成功,打翻从来,还是不行,pass
# gitlab-ctl reconfigure
# gitlab-ctl start

Jenkins官方下载地址:

https://jenkins.io/zh/download/

官方说明文档:

https://jenkins.io/zh/doc/book/installing/

Jenkins安装,基本使用安装包安装,因为临时起Jenkins非常麻烦,需要添加N多参数:首先提前部署java环境。佛则无法部署Jenkins。

Java部署参照博文:

https://blogs.jinchenghe.top/?p=233

centos安装Jenkins

ubuntu和centos配置文件内容不同,注意辨析。

[root@host-172-20-102-41 ~]# ll
-rw-r--r--  1 root root 77133106 Jul 18 10:55 jenkins-2.164.3-1.1.noarch.rpm

[root@host-172-20-102-41 ~]# yum install jenkins-2.164.3-1.1.noarch.rpm -y

修改配置文件:

[root@host-172-20-102-41 ~]# grep "^[^#]" /etc/sysconfig/jenkins | grep -v "^$" 
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="172.20.102.41""
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""

可选启动参数:
JENKINS_JAVA_OPTIONS="-server -Xms1g -Xmx1g -Xss512k -Xmn1g \
-XX:CMSInitiatingOccupancyFraction=65 \
-XX:+UseFastAccessorMethods \
-XX:+AggressiveOpts XX:+UseBiasedLocking \
-XX:+Di sableExplicitGC XX:MaxTenuringThreshold=10 \
-XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2 \
-XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5 \
-XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC \
-XX:+CMSParallelRemarkEnabled -Djava.awt.headless=true \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="192.168.7.104""

启动脚本启动:

 service jenkins start

ubuntu安装jenkins:

# apt-get install daemon
# ln -sv /usr/local/java/bin/java /bin/java
# dpkg -i jenkins_2.164.3_all.deb

Web页面访问:IP:8080

[root@host-172-20-102-41 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
4e819928f17b425796abc53fb3987e7f

安装推荐插件即可:

创建jenkins管理员:

配置访问地址:

开始使用并登陆:

登陆后界面:

jenkins插件管理及安装:

如果只有一台Jenkins能够上网更新插件,其余Jenkins可从主Jenkins拷贝插件目录/var/lib/jenkins/plugins/中的插件到本机插件目录即可
插件下载地址:

http://http://updates.jenkins-ci.org/download/plugins/

在可选插件中安装gitlab插件,搜索需要gitlab的插件并安装gitlabBlue Ocean,还有权限管理插件

Jenkins权限管理:

创建新用户:

默认情况下Jenkins创建的用户全部是管理员权限,风险很大

创建的用户在/var/lib/jenkins/users/目录下会有对应的文件夹,每个用户目录下面有一个config.xml,如果忘了密码,创建一个用户使用123456简单密码,并将加密的密码替换此文件中的密码,即为重置密码。
[root@host-172-20-102-41 jenkins]# ll /var/lib/jenkins/users/
total 4
drwx------ 2 jenkins jenkins  24 Jul 19 20:47 jenkinsmartin_1057324922730219668
drwx------ 2 jenkins jenkins  24 Jul 18 21:11 jenkinsroot_2704683074300801455
-rw-r--r-- 1 jenkins jenkins 431 Jul 19 20:47 users.xml
设置安全策略为role-based

创建角色:

将角色关联至用户:

使用限制权限用户登入系统,此时无管理员权限。

Jenkins邮箱配置:需要授权码,非密码

jenkins基于ssh key拉取gitlab代码

添加ssh key:

在jenkins上测试,基于秘钥拉取gitlab上代码

jenkins@Jenkinsm ~]$ git clone git@192.168.7.0:devops/blogs.git
Cloning into 'blogs'...
The authenticity of host '192.168.7.0 (192.168.7.0)' can't be established.
ECDSA key fingerprint is SHA256:VCN66F9JhexRzm/aAMb5iz0khkFpMEbxmJGDQq8a550.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.0' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 18 (delta 2), reused 18 (delta 2)
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (2/2), done.

对于gitlab上ssh端口非标准端口时,在jenkins上基于秘钥拉取gitlab上代码需要指定端口

/usr/local/src/# git clone ssh://git@gitlab.martin.com:2022/devop/bbs.git

配置 jenkins 自动 拉取代码:

jenkins 创建 test-project,指定源码管理为Git

验证构建结果:

将代码部署至后端服务器:

首先配置jenkins用户可以基于ssh key免密钥登录后端Tomcat服务器,然后继续下列操作。ssh-copy-id www@172.16.36.40,www用户需要有登录密码和家目录
Jenkins脚本内容:
cd /var/lib/jenkins/workspace/test-project
tar czvf code.tar.gz index.html 
scp code.tar.gz www@172.16.36.40:/data/webdir/
scp code.tar.gz www@172.16.36.50:/data/webdir/

ssh www@172.16.36.40 "/etc/init.d/tomcat  stop && rm -rf /data/webapps/blogs/* && cd /data/webdir && tar xvf code.tar.gz  -C /data/webapps/blogs/"
ssh www@172.16.36.50 "/etc/init.d/tomcat  stop && rm -rf /data/webapps/blogs/* && cd /data/webdir && tar xvf code.tar.gz  -C /data/webapps/blogs/"

ssh www@172.16.36.40  "/etc/init.d/tomcat  start"
ssh www@172.16.36.50  "/etc/init.d/tomcat  start"

构建触发器:仅限用于开发测试环境。

构建触发器( 有的人称为钩子 实际上是 一个 HTTP 回调 其用于在开发人员向 gitlab 提交代码后能够触发jenkins自动执行代码构建操作。
新建一个分支develop,只有当开发人员向develop分支提交代码的时候才会触发代码构建,而向主分支提交代码,不会自动构建,需要运维人员手动部署到生产环境。

创建新分支develop

jenkins 安装插件:

系统管理-管理插件-可选插件Gitlab HookGitlab Authentication
注意事项:

https://jenkins.io/security/advisory/2018-05-09/#SECURITY-263
– 在 jenkins-系统管理-全局安全设置,认证改为登录用户可以做任何事情
– 取消跨站请求伪造保护
– Gitlab Hook Plugin 以纯文本形式存储和显示 GitLab API 令牌

jenkins 修改登录认证方式

jenkins新建test-project项目

可以分别创建开发测试项目和正式部署项目,如test-project-developtest-project-master

jenkins配置构建触发器:

生成token认证:
$openssl rand -hex 12
064154793f3ca59c891606b1

jenkins 验证分支 job 配置文件:

如果一个主项目下,跟了很多子项目,可以使用添加如下配置,即当构建完成第一个任务后,触发后续定义的多个项目执行。可跟多个项目,使用逗号分隔

在gitlab上使用 curl 命令测试触发并验证远程触发构建:

使用浏览器测试
或者使用 curl 命令访问 URL:

curl http://192.168.7.3:8080/job/test-project/build?token=064154793f3ca59c891606b1

jenkins验证job是否自动构建:

gitlab 配置 webhook:

Admin areaSystem Hooks

测试钩子可用性:

返回下列测试结果表示正常:

gitlab 开发分支 develop 测试提交代码:

#创建相关目录,并进入目录进行克隆。
jenkins@Jenkinsm ~]$mkdir webdir
jenkins@Jenkinsm ~]$cd webdir/
jenkins@Jenkinsm ~/webdir]$git clone -b develop git@gitlab.martin.com:devops/blogs.git
Cloning into 'blogs'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 18 (delta 2), reused 18 (delta 2)
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (2/2), done.

# 删除原有index.html,新建index.html内容
jenkins@Jenkinsm ~/webdir]$rm -rf blogs/index.html
jenkins@Jenkinsm ~/webdir/blogs]$vim index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Marin company</title>
</head>
<body>
<h2>linux36 web1 v1 </h2>
<h2>linux36 web1 v2 </h2>
<h2>linux36 web1 v3 </h2>
<h2>linux36 web1 v4 </h2>
<h2>linux36 web1 v5 </h2>
</body>
</html>

# 重新提交代码到gitlab
jenkins@Jenkinsm ~/webdir/blogs]$git add ./*
jenkins@Jenkinsm ~/webdir/blogs]$git commit -m "new html"
jenkins@Jenkinsm ~/webdir/blogs]$git push

由于上述提交到gitlab后,gitlab上配置好的webhook会通知jenkins从gitlab拉取代码,并部署到后端tomcat服务器。

访问测试页面:

jenkins 分布式

在众多Job的场景下,单台jenkins master同时 执行代码 clone、编译、打包及构建,其性能可能会出现瓶颈,从而会影响代码部署效率,影响jenkins。官方提供了jenkins分布式构建, 将众多job分散运行到不同的jenkins slave节点,大幅提高并行job的处理能力。

配置slave节点java环境

slave服务器创建工作目录,如果slave需要执行编译job,必须要配置java环境并且安装git,svn,maven等与master相同的基础环境,另外也要创建与master相同的数据目录,因为脚本中调用的路径都是相对于master上的数据目录路径,so所有node节点此路径必须与master一致。
创建集群时,所有节点做时间同步,或者提前定义时间自动同步
# mkdir -pv /var/lib/jenkins/jdk/bin    #创建数据目录
# ln -sv /usr/bin/java /var/lib/jenkins/jdk/bin/java    链接java到jenkins。否则构建时会提示。

在jenkins-master上新建节点

查看添加日志,如下表示成功添加jenkins-node1节点。

pipline

官方介绍

https://jenkins.io/2.0/

pipline是帮助Jenkins实现CICD转变的重要角色,是运行在 jenkins 2.X 版本的核心插件 ,简单来说Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程, 从而实现单个任务很难实现的复杂流程编排和任务可视化 Pipeline 的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本。

pipline 语法

  1. Stage 阶段:一个 pipline 可以划分为若干个 stage ,每个 stage 都是一个操作,比如 clone 代码、代码编译、代码测试和代码部署阶段是一个逻辑分组, 可以跨多个node执行。
  2. Node节点:每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是jenkins agent,node 是执行 step 的具体服务器。
  3. Step:步骤,step 是 jenkins pipline 最基本的操作单元。从在服务器创建目录到构建容器镜像 ,由各类 Jenkins 插件提供实现,例如: sh “make”

pipline 优势

  1. 可持续性: jenkins 的重启 或者 中断后不影响已经执行的 Pipline Job
  2. 支持暂停: pipline 可以选择 停止并 等待人工输入 或 批准后再继续执行。
  3. 可扩展:通过 groovy 的编程更容易的扩展插件。
  4. 并行执行:通过 groovy 脚本可以实现 step stage 间的并行执行,和更复杂的相互依赖关系。

pipline job 测试:

创建 pipline job

测试简单 pipline job 运行:

node("jenkins-node1"){
    stage("clone 代码"){
        echo "代码clone"
        }
    stage("代码构建"){
        echo "代码部署" }
    stage("代码测试"){
        echo "代码测试"
        }
    stage("代码部署"){
        echo "代码部署"
        }
}

执行 pipline job

生成流水线脚本:

验证gitclone日志

jenkins-noede1服务器验证 clone 代码数据

node节点 需要打通 与 Tomcat web server 免密钥登录

#jenkins-node1
root@jenkinss1 /usr/local]#ssh-keygen 
root@jenkinss1 /usr/local]#ssh-copy-id www@172.16.36.40
root@jenkinss1 /usr/local]#ssh-copy-id www@172.16.36.50

pipline部署:

node("jenkins-node1"){ 
    stage("clone 代码"){
        sh 'rm -rf /var/lib/jenkins/workspace/myfirst-pipline/*'
        git branch: 'develop', credentialsId: '0bd035f0-2a42-47f2-8806-3f32aa765865', url: 'git@192.168.7.0:devops/blogs.git'
        }
    stage("代码构建"){
        sh 'cd /var/lib/jenkins/workspace/myfirst-pipline/ && tar czvf code.tar.gz ./index.html'
        }
    stage("代码复制"){
        sh 'cd /var/lib/jenkins/workspace/myfirst-pipline/ && scp code.tar.gz www@172.16.36.40:/data/webdir/'
        sh 'cd /var/lib/jenkins/workspace/myfirst-pipline/ && scp code.tar.gz www@172.16.36.50:/data/webdir/'
        }
    stage("停止tomcat服务"){
        sh 'ssh www@172.16.36.40 "/etc/init.d/tomcat stop"'
        sh 'ssh www@172.16.36.50 "/etc/init.d/tomcat stop"'
        }
    stage("代码部署"){
        sh 'ssh www@172.16.36.40 "rm -rf /data/webapps/blogs/* && cd /data/webdir/ && tar xvf code.tar.gz  -C /data/webapps/blogs/"'
        sh 'ssh www@172.16.36.50 "rm -rf /data/webapps/blogs/* && cd /data/webdir/ && tar xvf code.tar.gz  -C /data/webapps/blogs/"'
        }
    stage("启动tomcat服务"){
        sh 'ssh www@172.16.36.40 "/etc/init.d/tomcat start"'
        sh 'ssh www@172.16.36.50 "/etc/init.d/tomcat start"'
        }
}

构建成功:

验整jenkins-node1构建过程:



访问测试页面:

Jenkins+Gitlab架构部署:

Java环境部署参照博文:

https://blogs.jinchenghe.top/?p=233

tomcat部署参看博文:

https://blogs.jinchenghe.top/?p=236

在Jenkins上创建一个任务:

通常情况下,使用下图第一个和第二个选项创建任务,此处选第一项

下拉页面到构建,增加构建步骤,选择execute shell,执行shell命令或脚本

测试命令是否能够执行成功,选择构建Build Now,下方会出现执行Build History,选择一个有下拉三角,点击选择控制台输出

输出的执行结果

代码质量测试之SonarQube

官方网站:

http://www.sonarqube.org/

SonarQube管理代码质量管理的开放平台,插件机制可集成不同的测试工具,代码分析工具,以及持续集成工具,例如hudson/jenkins等。

下载地址:

最新版本SonarQube-7.9不支持mysal数据库,so要么下载过去的版本-上一个LTS版本为6.7.7,要么装oracle数据库。

https://www.sonarqube.org/downloads/

SonarQube 6.7.7官方文档:

https://docs.sonarqube.org/display/SONARQUBE67/Architecture+and+Integration

拷贝snoarqube相关文件到服务器并解压
root@jenkins-slave1:/usr/local/src# ll 
-rw-r--r--  1 root root 159921852 Jul 22 17:11 sonarqube-6.7.7.zip

/usr/local/src# unzip sonarqube-6.7.7.zip

/usr/local/src# ln -sv /usr/local/src/sonarqube-6.7.7 /usr/local/sonarqube
修改内核参数并添加用户:Kernel parameters
# vim /etc/sysctl.conf
vm.max_map_count=262144
fs.file-max=65536

# vim /etc/security/limits.conf
sonarqube   -   nofile   65536
sonarqube   -   nproc    2048

# useradd -s /bin/bash -m sonarqube

# reboot

# su - sonarqube
# ulimit -n
65535

部署 SonarQube

数据库准备:此版本sonar支持mysql5.6/5.7,且字符集为UTF-8

数据库安装略

创建数据库默认编码utf-8并授权:

mysql> create database sonar default character set utf8 collate utf8_general_ci;

mysql> GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'172.20.102.%' IDENTIFIED BY 'Sonar04.pass!';

远程测试账号连通性:

root@jenkins-slave1:~# mysql -usonar -p -h172.20.102.48
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.7.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye
修改sonar文件夹属主属组为sonar用户和组
root@jenkins-slave1:~# chown -RH sonarqube.sonarqube /usr/local/sonarqube
修改sonar配置文件# vim /usr/local/sonarqube/conf/sonar.properties
# grep "^[a-Z]" /usr/local/sonarqube/conf/sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=Sonar04.pass!
sonar.jdbc.url=jdbc:mysql://172.20.102.48:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.web.host=0.0.0.0
sonar.web.port=9000
启动sonar,内存需要调大些,佛则内核会kill进程。
sonarqube@jenkins-slave1:/usr/local/sonarqube$ ./bin/linux-x86-64/sonar.sh start
Starting SonarQube...
Started SonarQube.

sonarqube@jenkins-slave1:/usr/local/sonarqube$ tail -f logs/*.log
正常启动的话,会出现一堆INFO

访问sonar-WEB界面:admin admin

安装中文插件-在插件市场搜索chinese

扫描不同的源码使用的插件不同,如果要扫描的语言插件没有安装,搜索安装即可

如果当前服务器不连接外网,可gitlab下载插件后,导入到sonar插件目录/usr/local/sonarqube/extensions/plugins

插件地址:
https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.11/sonar-l10n-zh-plugin-1.11.jar

https://github.com/SonarQubeCommunity

部署 SonarQube scanner:需要部署到jenkins服务器

scanner下载地址:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/

官方文档:https://docs.sonarqube.org/latest/

root@jenkins-master:/usr/local/src# ll
-rw-r--r--  1 root root  42392358 Aug 17 19:52 sonar-scanner-cli-4.0.0.1744-linux.zip

root@jenkins-master:/usr/local/src# unzip -q sonar-scanner-cli-4.0.0.1744-linux.zip

root@jenkins-master:/usr/local/src# ln -sv /usr/local/src/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner
修改sonar-scanner配置文件:
root@jenkins-master# grep "^[a-Z]" /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://172.20.102.73:9000
sonar.sourceEncoding=UTF-8
官方测试包拷贝:
root@jenkins-master:/usr/local/src# ll
-rw-r--r--  1 root root   6796222 Aug 17 20:03 sonar-examples-master.zip

root@jenkins-master:/usr/local/src# unzip -q sonar-examples-master.zip

root@jenkins-master:/usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner# ll
-rw-r--r-- 1 root root 453 Jul 25  2016 README.md
-rw-r--r-- 1 root root 331 Jul 25  2016 sonar-project.properties
drwxr-xr-x 2 root root  22 Jul 25  2016 src/
-rw-r--r-- 1 root root 272 Jul 25  2016 validation.txt

每个源码包中必须带sonar-project.properties,内部定义了代码语言和字符编码格式,和源码目录
root@jenkins-master:/usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner# grep "^[a-Z]" sonar-project.properties 
sonar.projectKey=org.sonarqube:php-simple-sq-scanner
sonar.projectName=PHP :: Simple Project :: SonarQube Scanner    #web界面显示
sonar.projectVersion=1.0    版本
sonar.sources=src       #源码目录
sonar.language=php      #代码语言
sonar.sourceEncoding=UTF-8  #字符编码
执行代码扫描:
root@jenkins-master:/usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner# /usr/local/sonar-scanner/bin/sonar-scanner
Web界面查看:

SonarQube可自定义代码监测阈值:全栈才会写这规则吧

质量阈是一系列对项目指标进行度量的条件。项目必须达到所有条件才能算整体上通过了质量阈。

可以为没有特别指定质量阈的项目设置一个默认的质量阈。

配置Jenkins自动进行代码扫描

安装SonarQube Scanner,并配置jenkins将扫描结果传送给sonar server。

  1. Jenkins->系统管理->系统设置->SonarQube server

让Jenkins安装sonar scanner:可在线安装,如果提前部署了,指定scanner路径。

  1. Jenkins->系统管理->全局工具->配置:

手动指定绝对路径:

自动安装:

配置扫描:新建项目时,添加代码扫描,需要放到代码打包拷贝到后端tomcat之前进行扫描

自动化构建和选项框构建(配置SHELL脚本自动部署代码到后端服务器,并重启后端服务)




Generic Webhook Trigger Plugin

官方文档:https://wiki.jenkins.io/display/JENKINS/Generic+Webhook+Trigger+Plugin

github示例地址:https://wiki.jenkins.io/display/JENKINS/Generic+Webhook+Trigger+Plugin

Trigger only specific job

When using the plugin in several jobs, you will have the same URL trigger all jobs. If you want to trigger only a certain job you can:

方法1:可根据不同的token值触发不同的项目,但是不够精确匹配到项目分支,若master代码提交,很可能会导致该项目的develop分支被自动构建

方法2:添加一些请求参数(例如,header, 或者post content)使用regexp filter去触发仅当该参数具有特定值时。

Token parameter

此token可被触发的用法如下:

    Request parameter: curl -vs http://localhost:8080/jenkins/generic-webhook-trigger/invoke?token=abc123 2>&1
    Token header: curl -vs -H "token: abc123" http://localhost:8080/jenkins/generic-webhook-trigger/invoke 2>&1
    Authorization header of type Bearer : curl -vs -H "Authorization: Bearer abc123" http://localhost:8080/jenkins/generic-webhook-trigger/invoke 2>&1