Gitlab官方网址:
在线安装包下载安装教程-选择对应版本后:
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客户端下载链接:
默认安装即可,使用方法和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的插件并安装gitlab和Blue 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 Hook和 Gitlab Authentication
注意事项:
https://jenkins.io/security/advisory/2018-05-09/#SECURITY-263
– 在 jenkins-系统管理-全局安全设置,认证改为登录用户可以做任何事情
– 取消跨站请求伪造保护
– Gitlab Hook Plugin 以纯文本形式存储和显示 GitLab API 令牌

jenkins 修改登录认证方式



jenkins新建test-project项目
可以分别创建开发测试项目和正式部署项目,如test-project-develop和test-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 area–System 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
官方介绍
pipline是帮助Jenkins实现CI到CD转变的重要角色,是运行在 jenkins 2.X 版本的核心插件 ,简单来说Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程, 从而实现单个任务很难实现的复杂流程编排和任务可视化 Pipeline 的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本。
pipline 语法
- Stage 阶段:一个 pipline 可以划分为若干个 stage ,每个 stage 都是一个操作,比如 clone 代码、代码编译、代码测试和代码部署阶段是一个逻辑分组, 可以跨多个node执行。
- Node节点:每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是jenkins agent,node 是执行 step 的具体服务器。
- Step:步骤,step 是 jenkins pipline 最基本的操作单元。从在服务器创建目录到构建容器镜像 ,由各类 Jenkins 插件提供实现,例如: sh “make”
pipline 优势
- 可持续性: jenkins 的重启 或者 中断后不影响已经执行的 Pipline Job
- 支持暂停: pipline 可以选择 停止并 等待人工输入 或 批准后再继续执行。
- 可扩展:通过 groovy 的编程更容易的扩展插件。
- 并行执行:通过 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
官方网站:

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
部署 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。
- Jenkins->系统管理->系统设置->SonarQube server

让Jenkins安装sonar scanner:可在线安装,如果提前部署了,指定scanner路径。
- 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
