一、概述

1、CI 持续集成

持续集成:持续集成(continuous integration)是指开发者在代码开发过程中,可以频繁将代码部署集成到主干,并进行自动化测试
持续交付:是指在持续集成的基础之上,将代码部署到预生产环境
持续部署:在持续交付的基础之上,把部署到生产环境的过程自动化

2、持续集成流程

1、开发者将新版本 pushGitlab
2、Gitlab 随后触发 jenkins master 节点进行一次 build。(或者通过 web hook 定时检测)
3、jenkins master 节点将这个 build 任务分配给若干个注册的 slave 结点中的一个,这个 slave 结 点根据一个事先设置好的脚本进行 build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给 jenkins 来做
4、我们在 build 中要进行编译,这里使用了分布式编译器 distcc 来加快编译速度

3、CICD流程

gitlab 创建代码项目  >>>  gitlab 部署公钥  >>>  jenkins 安装插件  >>>  创建新项目   >>>  绑定私钥  >>>  添加触发器  >>>  测试部署  >>>  增加 Build Pipeline 插件以流程图的形式展示各个 Job 的顺序

4、Jenkins

Jenkins 概述:是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能

官方地址:Jenkins

5、GitLab和GitHub的区别

相同点:
二者都是基于webGit仓库,在很大程度上 GitLab 是仿照 GitHub 来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化于存储的场所。

不同点:
1、GitHub
如果要使用私有仓库,是需要付费的。GitLab可以在上面创建私人的免费仓库。
2、GitLab 让开发团队对他们的代码仓库拥有更多的控制,相比于 GitHub,它有不少的特色:允许 免费设置仓库权限;允许用户选择分享一个 project 的部分代码;允许用户设置 project 的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度通过 innersourcing让不在权限范围内的人访问不到该资源。

总结:从代码私有性(安全性)方面来看,有时公司并不希望员工获取到全部的代码,这个时候 GitLab无疑是更好的选择。但对于开源项目而言,GitHub 依然是代码托管的首选

6、对比

git :是一种版本控制系统,是一个命令,是一种工具
gitlib :是用于实现 git 功能的开发库
github :是一个基于 git 实现的在线代码托管仓库,包含一个网站界面,向互联网开放
gitlab :是一个基于 git 实现的在线代码仓库托管软件,一般用于在企业内部网络搭 git私服

注意: gitlab-ce 社区版 ; gitlab-ee 是企业版,收费

二、部署Gitlab

系统 IP 主机名 角色
CentOS 7.4 192.168.2.14 Gitlab Gitlab
CentOS 7.4 192.168.2.15 jenkins jenkins
CentOS 7.4 192.168.2.16 Apache Apache(web)
windows 7 192.168.2.50 wind 客户端

注意:Gitlab主机内存  ≥ 4G ,不然后面会报错(内存5G,CPU 6)

清华大学镜像站:https://mirrors.tuna.tsinghua.edu,cn/gitlab-ce/yum/el7/

GitLab包含软件:alertmanager
gitaly
gitlab-exporter
gitlab-workhorse
grafana
logrotate
nginx
node-exporter
postgres-exporter
postgresql
prometheus
redis
redis-exporter
sidekiq
unicorn

 安装前需要设置好网卡可以上网

配置防火墙


[root@Gitlab ~]# iptables -F                      #清空规则
[root@Gitlab ~]# systemctl stop firewalld
[root@Gitlab ~]# systemctl disable firewalld        禁止防火墙,就不用执行下面两条命令:
[root@Gitlab ~]# firewall-cmd --permanent --add-service=http
[root@Gitlab ~]# systemctl reload firewalld               

时间同步服务器


[root@Gitlab ~]# yum -y install ntp
......
[root@Gitlab ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf
[root@Gitlab ~]# cat <<END >>/etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END           [root@Gitlab ~]# ntpdate time.nist.gov
11 Feb 17:27:25 ntpdate[73029]: adjust time server 128.138.141.172 offset 0.004230 sec[root@Gitlab ~]# systemctl restart ntpd
[root@Gitlab ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

(一)、安装Gitlab


[root@Gitlab ~]# yum install -y policycoreutils-python                     #安装依赖
.........
[root@Gitlab ~]# rpm -ivh gitlab-ce-14.7.2-ce.0.el7.x86_64.rpm             #上传rpm包
.......
[root@Gitlab ~]# vim /etc/gitlab/gitlab.rb                                 #修改 gitlab 外部访问地址;可以修改为IP地址,也可以修改为自定义的gitlab域名
.........32 external_url 'http://192.168.2.14
...
保存
[root@Gitlab ~]# gitlab-ctl reconfigure                                    #初始化gitlab,会重置为最原始的配置
...........
.....
gitlab Reconfigured![root@Gitlab ~]# gitlab-ctl status                                         #查看状态
........
..
[root@Gitlab ~]# netstat -anptu| grep 80                                   #默认使用nginx做为web界面
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      10439/puma 5.5.2 (u
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10757/nginx: master 

访问测试:192.168.2.14

访问成功后发现需要用户和密码在 Gitlab 中 默认有 root 用户但是密码是自动生成的接下来进行重置密码

(二)、重置密码

1、进入控制台


[root@Gitlab ~]# gitlab-rails console              

2、查询root用户账号信息并赋值给u


irb(main):001:0> u=User.where(id:1).first
=> #<User id:1 @root>

3、设置密码


irb(main):002:0> u.password=12345678           #root用户密码设置为12345678
=> 12345678

4、确认密码


irb(main):003:0> u.password_confirmation=12345678
=> 12345678

5、保存设置


irb(main):004:0> u.save!
=> true

6、退出控制台

exit

7、重启GitLab


[root@Gitlab ~]# gitlab-ctl restart

访问GitLab页面输入用户名root和你新设置的密码,登录成功则可进入到GitLab主页。

(三)、Gitlab的命令


gitlab-ctl stop                           #关闭 gitlabgitlab-ctl start                          #启动 gitlab gitlab-ctl restart                        #重启 gitlabsystemctl restart gitlab-runsvdir         #gitlab启动报warning: redis: unable to open supervise/ok: file does not existGitLab的配置文件:/etc/gitlab/gitlab.rb          #可以自定义一些邮件服务等
日志地址:/var/log/gitlab/                      #对应各服务
服务地址:/var/opt/gitlab/                      #对应各服务的主目录
仓库地址:/var/opt/gitlab/git-data              #记录项目仓库等提交信息sudo gitlab-ctl tail                           #查看所有的logs; 按 Ctrl-C 退出         sudo gitlab-ctl tail gitlab-rails              #拉取/var/log/gitlab下子目录的日志sudo gitlab-ctl tail nginx/gitlab_error.log    #拉取某个指定的日志文件gitlab-rake gitlab:check SANITIZE=true --trace #检查gitlab

(四)、关闭 gitlab的注册功能

默认情冴下可以直接注册账号,我们不需要注册功能,可以关闭

最后保存更改;退出登录后再次查看已经没有注册提示了

(五)、配置邮箱报警

linux运维最注重的一点就是告警邮件,所以Gitlab一样提供了邮件发送的功能。使用默认设置可能收不到邮件,这里使用第三方SMTP服务器

在官方有各种邮箱配置实例:SMTP settings | GitLab

1、修改配置文件

这里我使用的是QQ邮箱


[root@Gitlab ~]# vim /etc/gitlab/gitlab.rb            #在112行后面插入以下内容
...............113 gitlab_rails['smtp_enable'] = true114 gitlab_rails['smtp_address'] = "smtp.qq.com"115 gitlab_rails['smtp_port'] = 465116 gitlab_rails['smtp_user_name'] = "1234567890@qq.com"117 gitlab_rails['smtp_password'] = "邮箱授权码  不是邮箱密码"118 gitlab_rails['smtp_authentication'] = "login"119 gitlab_rails['smtp_enable_starttls_auto'] = true120 gitlab_rails['smtp_tls'] = true121 gitlab_rails['gitlab_email_from'] = '1234567890@qq.com'
.........
....
保存

[root@Gitlab ~]# gitlab-ctl reconfigure                #初始化gitlab
...........
....
[root@Gitlab ~]# gitlab-rails console                  #登陆控制台
--------------------------------------------------------------------------------Ruby:         ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]GitLab:       14.7.2 (89599212ee6) FOSSGitLab Shell: 13.22.2PostgreSQL:   12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.4)
irb(main):001:0> Notify.test_email('1234567890@qq.com', '测试一', '测试').deliver_now            #给1234567890发送一个测试邮件
Delivered mail 6205d85720795_16bb5adc2973c@Gitlab.mail (1179.0ms)
=> #<Mail::Message:279200, Multipart: false, Headers: <Date: Fri, 11 Feb 2022 11:30:31 +0800>, <From: GitLab <1228413999@qq.com>>, <Reply-To: GitLab <noreply@gitlab.example.com>>, <To: 1228413999@qq.com>, <Message-ID: <6205d85720795_16bb5adc2973c@Gitlab.mail>>, <Subject: 测试一>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>

在QQ邮箱进行查看邮件

修改用户root的邮箱,默认是 admin@example.com,修改之后创建组会发送邮件警告

修改完成后  保存更改

2.、创建群组

可见度
Private(私人的):只有组成员才能看到
Internal(内部):只要登录的用户就能看到
Public(上市):所有人都能看到

填写完成后  >> 点 >> 创建组

3、创建用户

填写完后  >>  创建用户

把刚刚创建的用户加入到组 web中

Gitlab用户在组中有五种权限:
Guest:可以创建issue、发表评论,不能读写版本库
Reporter:可以克隆代码,不能提交,QA(测试人员)、PM(主管或者产品经理)可以赋予这个权限
Developer:可以克隆代码、开发、提交、push,RD(研发人员)可以赋予这个权限
Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限

到邮箱进行设置密码

可以看到我们加入的web组

4、在 zs 用户上 创建一个项目

可以在群组里创建项目,也可以创建私有的项目,然后使用,使用方法跟github一样

5、 在新建的仓库创建一个文件

仓库使用:跟使用github方法一样。注意:没有在账号中新建SSH公钥之前将无法通过 SSH 拉取或推送代码

6、在windows 7 上创建秘钥

TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥。使用命令ssh-keygen -C "邮箱地址" -t rsa 产生的密钥在 TortoiseGit  中不能用
而基于 git 的开发必须要用到 rsa 密钥,因此需要用到 TortoiseGit putty key generator 工具来生成既适用于 git rsa 密钥也适用于 TortoiseGit ppk 密钥

6.1、运行TortoiseGit开始菜单中的puttygen程序

6.2、点击“Generate”按钮,鼠标在上图的空白地方来回移动直到进度条完毕,就会自动生一个随机的key

公钥,需要复制到gitlab

 6.3、保存公钥私钥

保存私钥

将生成的key保存为适用于 TortoiseGit 的私钥(扩展名为.ppk

保存公钥

复制公钥后面要用

6.4、 把私钥加入TortoiseGit

6.5、把公钥导入gitlab

 6.6、windows 7 上免密测试

克隆的URL路径

6.7、 查看结果

三、部署 jenkins

 同步时间


[root@jenkins ~]# yum -y install ntpdate
.......
[root@jenkins ~]# ntpdate 192.168.2.14
11 Feb 17:33:27 ntpdate[15420]: step time server 192.168.2.14 offset -28797.200506 sec

1、部署java环境

Jenkins是Java 编写的,所以需要先安装 JDK


[root@jenkins ~]# tar zxvf jdk-8u202-linux-x64.tar.gz
[root@jenkins ~]# mv jdk1.8.0_202 /usr/local/java/                配置 jdk 环境变量[root@jenkins ~]# vim /etc/profile
.........
.....         最后添加
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH              保存[root@jenkins ~]# source /etc/profile               [root@jenkins ~]# java -version           #java环境部署完成
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

2、部署 Jenkins

 Jenkins下载地址:Index of /jenkins/redhat-stable/

2.1、安装 Jenkins

这里使用旧版本后面会进行升级操作


[root@jenkins ~]# rpm -ivh jenkins-2.222.4-1.1.noarch.rpm
警告:jenkins-2.222.4-1.1.noarch.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID d50582e6: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...1:jenkins-2.222.4-1.1              ################################# [100%]

2.2、修改配置文件


[root@jenkins ~]# vim /etc/sysconfig/jenkins
......
..29 JENKINS_USER="root"                #修改默认运行账号
.....
..
保存

2.3、添加java软连接

如果不做java软连接,启动会报错
[root@jenkins ~]# ln -s /usr/local/java/bin/java /usr/bin/              

2.4、启动Jenkins


[root@jenkins ~]# /etc/init.d/jenkins start
Starting jenkins (via systemctl):                          [  确定  ][root@jenkins ~]# netstat -anput|grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      41820/java   ——————  添加到开机自启[root@jenkins ~]# chkconfig jenkins on
[root@jenkins ~]# chkconfig --list jenkins                 注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。查看在具体 target 启用的服务请执行'systemctl list-dependencies [target]'。jenkins         0:关    1:关    2:开    3:开    4:开    5:开    6:关

3、访问并安装插件

3.1、访问Jenkins

 访问:192.168.2.15:8080

出现解锁页面,并且提供了密码保存路径,打开文件把密码输入就可以了

查看密码


[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
7630e24287944f3298cf3744ed633efb

由于jenkins需要联网下载插件,默认插件的网址是jenkins的官网(速度特别慢)(暂时没有联网

3.2、 添加一个系统账户

3.3、手动安装Jenkins插件

这里使用手动安装

方法一:上传插件

上传插件需要提前下载,下载完成后在上传到服务器

下载地址:Index of /download/plugins

 方法二(本次使用方法二):把一台安装好 jenkins 插件服务器的 /var/lib/jenkins/plugins 目录下的文件复制到新的 jenkins 中。然后重启新的 jenkins 使插件生效

下载插件:Jenkins插件,解压即可用-网络安全文档类资源-CSDN下载


[root@jenkins ~]# mv /var/lib/jenkins/plugins /var/lib/jenkins/plugins.bf
[root@jenkins ~]# tar -zxvf plugins.tar.gz -C /var/lib/jenkins/
[root@jenkins ~]# systemctl restart jenkins                     #让插件生效注意: 不重启,插件不会生效

查看安装的插件

3.4、Jenkins升级

目前版本2.222.4

官方下载最新稳定版的 war包: https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.319.3/jenkins.war

清华大学镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/latest/jenkins.war

两个网站都可以下载

查看war包所在的目录
——————————————————————————
[root@jenkins ~]# rpm -ql jenkins | grep .war
/usr/lib/jenkins/jenkins.war备份原来的war包,拷贝最新版本war包
——————————————————————————————————————————————[root@jenkins ~]# cd /usr/lib/jenkins/
[root@jenkins jenkins]# mv jenkins.war jenkins.war.bak
[root@jenkins jenkins]# ls
jenkins.war  jenkins.war.bak[root@linux-node2 jenkins]# service jenkins start        —————————————————如上命令执行完发现版本还是原来的,执行以下命令或者重启服务器使用命令: init 6
[root@jenkins ~]# netstat -anptu |grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      5952/java      [root@jenkins ~]# kill -9 5952
[root@jenkins ~]# /etc/init.d/jenkins start

查看版本已经成功升级到2.319.3版本

4、配置 Jenkins 使用 gitlab 更新代码

4.1、配置jenkins免密拉取gatlab代码

           在Jenkins上生成密钥对
[root@jenkins ~]# ssh-keygen
..........
.....查询公钥,复制到 gitlab 上
————————————————————————————
[root@jenkins ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNGUs0sCd3XhWSK4JuIrLhxrrO2jzdeWmNAieMbkKj0PECa5djZetCuDouiUuKT7g7x3wWSqjwpOurBh5YlLcbeHnlT+kT6rVoR/O08rl4HduwN640nj8YU8hqOTV2BFz2EXplJMb57rV88UmMN/46QZTrcRYCOttYN9Akmv2TYSOsMlYB0bJqQRW5OGqaWSxF9SO78TDlMttHoFpP2ZUoMtGfV8r8O3WkQaVGwkWxsvAfLG2EjdLcgYMHYavmXRwDLDCnmXevyS+mnBd4ao+UJXtr6XIzlMyTuNUll+xoT2Qg3Uf12pXTXHdrXV4Jat3bU8Yh6B/yhG5UfVDHMMi5 root@jenkins

测试 key


[root@jenkins ~]# yum install -y git
[root@jenkins ~]# git clone git@192.168.2.14:zs/web.git
正克隆到 'web'...
The authenticity of host '192.168.2.14 (192.168.2.14)' can't be established.
ECDSA key fingerprint is SHA256:S7MFrLTUcEUCDUIZePIXhSGFSvtI7n4F9Tkou5MMhzI.
ECDSA key fingerprint is MD5:9c:49:dc:85:0c:bd:6c:aa:81:01:67:38:30:c5:3b:9c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.14' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (6/6), done.[root@jenkins ~]# ls web/
index.html  README.md

测试发现不需要密码就可以直接clone项目,免密clone OK!

4.2、把 Jenkins 服务器刚刚生成的私钥配置到  jenkins

查看私钥
————————————————————————
[root@jenkins ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAzRlLNLAnd14VkiuCbiKy4ca6zto83XlpjQInjG5Co9DxAmuX
Y2XrQrg6LolLik+4O8d8Fkqo8KTrqwYeWJS3G3h55U/pE+q1aEfztPK5eB3bsDeu
NJ4/GFPIajk1dgRc9hF6ZSTG+e61fPFJjDf+OkGU63EWAjrbWDfQJJr9k2EjrDJW
AdGyakEVuThqmlksRfUju/Ew5TLbR6BaT9mVKDLRn1fK/Dt1pEGlRsJFsbLwHyxt
hI3S3IGDB2Gr5l0cAywwp5l3r8kvppwXeGqPlCV7a+lyM5TMk7jVJZfsaE9kIN1H
9dqV01x3a11eCWrd21PGIegf8oRuVH1QxzDIuQIDAQABAoIBADToU3gyANxQDux4
ANt8Y/zOER6POahAS7QuXBlj0BkGK0Xej1z6y6eYcpnSnQP+8J2rJh1yAQai5JBn
sahUJLAXcgpvhMa4gzd1aC7Ddoi/2w4oLu4v7ELQSiDsxRe+pGRtuc8hn5qVs4eZ
jsl3IEPS6yGZOH42xKKLM0xeFw/PRt5tL/3zKzwLqWePLDnRW9pFWYcoJcr/sBIx
vVaMvAduDQufj2I1j6M2EePswgqY2135vID/qiGbzJ6LexwgdCvJOfPHGAQA/sL1
ZKiCpFNdYm5kDX2BsTfuu1uzuAZ20QJnbCggj0oEy6hgUPlZP9JdpjIBldKpe95+
y6UZwYkCgYEA7mGuwvU+MDXj1bC/dzZ4wqJhr183GXLRCBPVfNdN+fyryV+17TQQ
4qVWd97NT2I5MmfJ8yI9hZq7diAwl6Ln1PWv7tLW3DiEgeh5R21XngUxodvP8NJ0
hRCaV+1Ag7hrNsqRTJ9YwSHBaM5Aial7zdO+0QNDSVZP7hA7CSVlwa8CgYEA3EHh
wTd4/b/YCMZKb6KK8/yoFO0Z1rXN/LmYS8uOQzB2dYWsLaWwA0A/gTR+H7hPGaY6
Aojk9EpQqXEMSbkAT9ysxyGEX+DjLej078DTVQt9Qaf8vICqTtELHg7GIqpGnJYK
WHDvaUOEnueNxchK/Y/AcDvfUkpyH4lMg5kcPhcCgYEA3yQbNi3hB7n6SpbHs20O
/4qHDGWBq1W56+i9B753JJHrsHXiU2dQgwgn989cunmEdvWGqgwcMMtVvU6GjfsV
LljJVjKQo9ZX207k8AKfaLEN86hSbuhh4AlZoQLaSDLCUaiu+F2U9DyH0nZ3HSXE
WThjvz1hp+2epocU7AvQw8sCgYAsRnoREwuZRpUwvlt8MVppTWKkQj0tcgJkSRKa
OeLxEq7dVO+VhXbqUGHzoQ+xZKVR7J5AoDAWA1JPnU/xCeVMKHn61Xv8ogJI2klS
YJqav+J/7jrZ0atqiI8JjcK6eSwUkfymZp1ZtZ7VKorPNUIN0nXGmeJ8ckaanEjr
Mz4AJQKBgCFot3uIzFMGED+JLVx+LZcZY3rspHL72WIccbTsjXFBH7NO22rRKUa+
fKR9i2K8HVir4WZbPqEWH+q9Z6nmaQFYvivmXrmoJgO8+Vb4gYhiYGVkj8phI8/y
A8pzK3P1s+zJol4t9X1bNcSAkHID55/TdlRkl2xv5oUskE/cMfPL
-----END RSA PRIVATE KEY-----

在jenkins中添加私钥

Jenkins 服务器 的公钥在gitlabJenkins 服务器的私钥在 jenkins,这样 jenkins 就可以直接拉取 gitlab 上的代码。全局凭证(不受限制)

4.3、Jenkins创建项目

以下选项二选一,都可以新建任务

选择  >>>  自由式项目

点击 web-job 右边的倒三角形

自定义  描述

上图的 Repository URL 路径在 gitlab下进行复制如下图

添加凭据

以下的私钥是   4.2、Jenkins的私钥  >>  复制到以下即可

上图的URL是下图的http路径;velrslon(版本号)是Gitlab 的版本号 我这里是 14.7 版本

修改完后就可以  >>  应用   >>   保存了

4.4、测试下载代码

 在构建时报错问题如下


ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.
Finished: FAILURE

原因分析:

jenkins找不到分支来拉指定的git代码,是因为githubmaster节点名称变更为main

解决办法:

保存后在进行测试

刷新页面之后就可以看到之前构建的项目执行成功了,jenkins可以从gitlab上下载代码

可以在控制台查看输出结果

拉取下来的代码会保存到:/var/lib/jenkins/workspace/web-job 路径下

查看下载的代码


[root@jenkins ~]# cat /var/lib/jenkins/workspace/web-job/index.html
<h1> GItlab !!!!!!!!</h1>

5、将代码发布到 web 服务器

可以通过执行命令脚本的方式进行代码发布,这里使用 root 用户在 web 服务器上发布代码。也可以建立一些普通用户如果 Gitlabapache 来发布。如果使用普通用户发布代码,要保持所有服务器上的用户id一致,这样就没有权限的问题了

拓扑图如下:

5.1、部署Apache服务器

 同步时间


[root@Apache ~]# yum -y install ntpdate
.........
[root@Apache ~]# ntpdate 192.168.2.14
12 Feb 15:38:40 ntpdate[3130]: step time server 192.168.2.14 offset -28798.840450 sec

安装apache


[root@Apache ~]# yum -y install httpd
.......
[root@Apache ~]# systemctl start httpd

 访问测试:192.168.2.16

5.2、配置ssh免密认证

配置Jenkins服务器登录到web服务器免密认证


[root@jenkins ~]# ssh-copy-id root@192.168.2.16

5.3、创建自动上传web代码的脚本


[root@jenkins ~]# vim web-jod.sh
#!/bin/bash
scp /var/lib/jenkins/workspace/web-job/* root@192.168.2.16:/var/www/html
cp /var/lib/jenkins/workspace/web-job/*  /var/www/html/            保存[root@jenkins ~]# mkdir -p /var/www/html
[root@jenkins ~]# chmod -x web-jod.sh                 

5.4、把脚本添加到Jenkins

5.5、测试

修改之前的web项目中的index.html文件

构建项目在Jenkins上构建

查看测试结果


[root@Apache ~]# cat /var/www/html/index.html
<h1> GItlab !!!!!!!!</h1>测试web页面

5.6、更新 Gatlab 代码触发Jenkins自动部署

在公司的测试环境当中,当开发人员向 gitlab 仓库提交代码后,gitlab 自动通知 jenkins进行构建项目、代码质量测试然后部署至测试环境,这里先暂时部署到测试环境。对于生产环境,后期使用手动部署代码

生成身份令牌: 在jenkins服务器上生成 Tokenopenssl rand 生成随机密码

    说明:-hex:输出结果为16进制数据; 数字12是指定生成的随机字符为12字节,即24个 16 进制个数
[root@jenkins ~]# openssl rand -hex 12
54bd93946b7c0efb3caa49ef

jenkins上配置触发器

git项目配置界面设置链接和token

在配置token前先设置 web 钩子

因为 gitlab 10.6 版本以后为了安全,不允许向本地网络发送webhook请求,如果想向本地网络发送webhook请求,则需要使用管理员帐号登录,去修改配置

 注意:登录root用户进行修改修改完成后切换zs用户

切换到zs用户进行配置

添加jenkins地址和token


链接使用如下地址:http://192.168.2.15:8080/buildByToken/build?job=web-job&token=54bd93946b7c0efb3caa49ef
格式:http://jenkins地址/buildByToken/build?job=jenkins项目名&token=token值

测试web钩子 :往下划

5.7、进行测试

更新gitlab中 web 项目代码

然后提交进行访问查看   192.168.2.16

6、使用Build Pipeline插件显示流程图

web-job 项目添加一个视图

视图名称自定义

显示最近5次没有显示的构建

查看结果

7、使用分支进行网站版本回滚

7.1、分支类型和概念

master:用于发布生产环境的分支,该分支上的代码必须是测试通过的代码,只接受来自于featurehotfix的分支合并每次发布需要进行tag标记以便于出错时进行回滚
develop:测试分支,所有feature分支开发完毕的功能需要合并到develop进行测试后才能合并到masterdevelop可能会存在多个。develop不能合并到master
feature:开发分支
hotfix:紧急修复分支,在master分支出现BUG需要进行紧急修复时使用

7.2、流程规范

 当前4种分支类型的工作流程

master和develop

master是用于发布的分支,因此需要与生产环境保持绝对一致,不能出现直接提交的情况。在每次master发布上线时,我们需要继续tag标记,万一生产环境出现紧急问题可以迅速通过tag进行版本回滚
develop是用于测试的分支,可能在一个develop分支种存在多个来自于feature的开发功能,因此不能直接从develop合并到master上,避免出现将未测试通过的功能偷跑上线的情况发生。一般一个develop分支对应一个测试环境,根据团队进行可以部署多个测试环境和多个develop分支
masterdevelop分支通常不允许出现直接在进行commitpush操作,也就是直接这些分支上提交代码,这些分支只能通过merge进行修改。这些限定在大部分git平台上均有实现,通过设定为保护分支可以防止被删除,通过权限设置可以只允许部分人员进行push操作

feature

这个分支是开发者最常用到的分支之一,在接到新的功能需求时,feature需要从当前最新的master切出分支来进行开发。多个feature之间是互相独立的,因此也会存在代码冲突的情况,这就需要各位开发人员互相的协调合作了。这里说明以下feature的操作流程

1、有新需求,从最新的master上切出分支,进行功能开发
2、feature上开发完毕功能后,需要先mergedevelop分支进行测试。在合并之前,需要将最新的master合并到当前分支来,确保不会有生产环境的功能遗漏而导致测试不通过的情况
3、测试人员在develop上出现问题,由开发人员在feature上进行修复后,重新操作步骤2发布到测试
4、测试通过,mergemaster进行上线
5、上线完毕,删除feature分支
这便是feature的整个生命周期,这里有人可能有疑惑,如果上线后出现BUG要怎么办呢?别着急,马上我们就来讲讲hotfix

hotfix

一旦feature发布到生产环境后出现BUG需要紧急修复,但是feature的职责其实在mergemaster时就已经终结了,现在我们需要的一个补救分支hotfix
hotfix就如同名字一样,用于生产环境的快速修复,一旦生产环境出现问题
1、首先我们要将版本进行回滚
2、然后立刻切出hotfix,进行问题排查和修复
3、在修复完毕后同样需要进入到develop进行测试,千万不要盲目的自信上线
4、在测试通过之后,mergemaster进行上线
5、上线完毕,删除hotfix分支
不过要是这次上线完了还有问题,那就再来一个hotfix

7.3、新建分支

这里使用图形化新建分支(也可以使用命令进行新建)

修改fz分支上的index.html文件

7.4、 根据 fz 分支进行回滚;回滚我们采取手动回滚的方式,编写shell脚本来执行


[root@jenkins ~]# vim hg.sh
#!/bin/bash
cd /root
git clone -b fz git@192.168.2.14:zs/web.git
scp /root/web/index.html root@192.168.2.16:/var/www/html/index.html            保存


[root@jenkins ~]# rm -rf web
[root@jenkins ~]# bash hg.sh
正克隆到 'web'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 31 (delta 8), reused 25 (delta 6), pack-reused 0
接收对象中: 100% (31/31), done.
处理 delta 中: 100% (8/8), done.
index.html                                                                               100%   36    48.7KB/s   00:00    

8、 jenkins发布tomcat项目

8.1、在Jenkins上安装Maven(需要java环境)

maven:  就是将开发写的Java代码,打包成war包,然后在将打包成的war包,部署到tomcat上,供客户端访问

Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心

官网下载Maven:Maven – Download Apache Maven


[root@jenkins ~]# tar xf apache-maven-3.8.4-bin.tar.gz
[root@jenkins ~]# mv apache-maven-3.8.4 maven
[root@jenkins ~]# ln -s /root/maven/bin/mvn /usr/bin/mvn                  ————————添加maven的环境变量[root@jenkins ~]# vim /etc/profile
.....  最后加入内容
export MAVEN_HOME=/root/maven
export PATH=$PATH:$MAVEN_HOME/bin                保存[root@jenkins ~]# source /etc/profile

8.2、创建Maven私服nexus

默认Maven下载jar包去官网太慢,因此搭建nexus能够加快jar包的下载

配置仓库两个选项
项目下的pom.xml配置、只生效当前的项目
maven配置全局所有项目生效

上传 nexus 安装包[root@jenkins ~]# tar xf nexus-3.13.0-01-unix.tar.gz
[root@jenkins ~]# mv nexus-3.13.0-01 /usr/local/nexus
[root@jenkins ~]# /usr/local/nexus/bin/nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus[root@jenkins ~]# netstat -anptu | grep 8081            #启动比较慢
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      61384/java         

访问:192.168.2.15:8081

修改私服拉取编译的包去阿里云:http://maven.aliyun.com/nexus/content/groups/public

修改完成后  保存  应用

8.3、 配置私服


[root@jenkins ~]# vim /root/maven/conf/settings.xml
...........
.....          #添加到servers区域  忽略:-->--><server><id>my-nexus-releases</id><username>admin</username><password>admin123</password></server><server><id>my-nexus-snapshot</id><username>admin</username><password>admin123</password></server></servers>......            #在mirrors区域添加<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror><mirror><id>nexus</id><mirrorOf>*</mirrorOf><url>http://192.168.2.15:8081/repository/maven-central/</url></mirror></mirrors>
......
..                #添加到properties区域<profile><id>nexus</id><repositories><repository><id>central</id><url>http://192.168.2.15:8081/repository/maven-central/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://192.168.2.15:8081/repository/maven-central/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories></profile><properties>
......
...         #在settings区域添加<activeProfiles><activeProfile>nexus</activeProfile></activeProfiles>
</settings>保存

8.4、配置Jenkins

以下图中有一个 选项,需要取消即可

8.5、新建一个jenkins任务

这里是一些通用的设置,  丢弃旧的构建  多次构建又不手动清除  会生成很多文件 ,占用磁盘空间  这里的丢弃旧的构建的配置大家按需配置即可

源码管理: URL从Gitlab中进行复制

定时构建  “日程表”格式为和cron表达式一样(相当于任务计划)

这里不进行配置


[root@jenkins ]# vim tomcat.sh               #!/bin/bash            source /etc/profile
scp /var/lib/jenkins/workspace/test/test1/target/test1.war              root@192.168.2.16:/usr/local/tomcat/webapps/
ssh root@192.168.2.16 "/usr/local/tomcat/bin/shutdown.sh"
sleep 3
ssh root@192.168.2.16 "/usr/local/tomcat/bin/startup.sh"                    保存

上传项目文件


[root@jenkins ~]# mkdir aaa
[root@jenkins ~]# cd aaa
[root@jenkins aaa]# pwd
/root/aaa
[root@jenkins aaa]# ls
test1  time.java[root@jenkins aaa]# git config --global user.email "jenkins@example.com"
[root@jenkins aaa]# git config --global user.name "jenkins"
[root@jenkins aaa]# ssh-copy-id root@192.168.2.14
[root@jenkins aaa]# git clone git@192.168.2.14:zs/web.git
正克隆到 'web'...
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 38 (delta 1), reused 1 (delta 0), pack-reused 35
接收对象中: 100% (38/38), 4.02 KiB | 0 bytes/s, done.
处理 delta 中: 100% (13/13), done.[root@jenkins aaa]# mv  time.java test1 web
[root@jenkins web]# git rm -rf index.html
rm 'index.html'
[root@jenkins web]# ls
README.md  test1  time.java[root@jenkins aaa]# git add .
[root@jenkins aaa]# git commit -m "ceshi jenkins"
........
[root@jenkins web]# git push -u origin main
Counting objects: 38, done.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (37/37), 5.26 KiB | 0 bytes/s, done.
Total 37 (delta 1), reused 0 (delta 0)
To git@192.168.2.14:zs/web.gitf64ebcc..906cc87  main -> main
分支 main 设置为跟踪来自 origin 的远程分支 main。

Apache 服务器上安装 tomcat


[root@Apache ~]# tar zxvf jdk-8u202-linux-x64.tar.gz
.....
[root@Apache ~]# mv jdk1.8.0_202/ /usr/local/java
[root@Apache ~]# cat <<END>>/etc/profile
export JAVA_HOME=/usr/local/java
export PATH=\$PATH:/usr/local/java/bin
END                 [root@Apache ~]# source /etc/profile
[root@Apache ~]# tar zxvf apache-tomcat-10.0.13.tar.gz
.......
[root@Apache ~]# mv apache-tomcat-10.0.13 /usr/local/tomcat
[root@Apache ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
————————————————————————————————赋权
[root@Apache ~]# chmod a+x /usr/local/tomcat/bin/shutdown.sh
[root@Apache ~]# chmod a+x /usr/local/tomcat/bin/startup.sh
[root@Apache ~]# chmod -R o=rx /usr/local/tomcat/bin/
[root@Apache ~]# chmod -R o=rwx  /usr/local/tomcat/logs/                 

进行测试

这时候出现报错:查看原因

错误提示倒是非常的清晰,“没有定义JAVA_HOMEJRE_HOME环境变量 至少需要这些环境变量之一才能运行此程序”,就是说找不到JAVA_HOME这个变量,但是我确定在目标机器上是有这个环境变量的,echo $JAVA_HOME也可以打印出来,而且更诡异的是,我在目标机器上手动执行这个脚本的时候,是没有任何问题的。

脚本很简单,跟jenkins在本机自动部署一样,最后一步也就是启动tomcat,并没有什么特殊的操作,仔细检查了一下,也没啥特殊字符,真实见鬼了,百度了一下,发现已经有前辈高人碰见过这个问题了,解决思路也比较真实,既然你没有,既然你要,那就给你一个。。。

解决方案:tomcatcatalina.sh文件里加入JAVA_HOME环境变量的配置,就写在文件开头处就行


[root@Apache ~]# vim /usr/local/tomcat/bin/catalina.sh
#!/bin/sh
export JAVA_HOME="/usr/local/java"
export JRE_HOME="/usr/local/java/jre"
.....
..保存

在次测试

访问测试

Gitlab与Jenkins构建CICD环境相关推荐

  1. 我的docker随笔37:使用gitlab和jenkins实现CICD

    本文涉及一种利用容器部署 gitlab 和 jenkins 服务实现持续集成(CICD)的方法,其目的是为了在实际工作中使用代码托管及自动化操作. 一.引言 因工作需要,需部署 gitlab 和 je ...

  2. Gitlab+Jenkins+Artifactory, CI/CD自动构建发布环境搭建使用实践

    CI/CD自动构建发布环境搭建使用实践 通过C/C++的cmake工程示例项目,构建Gitlab+Jenkins+Artifactory自动构建发布环境.其中 Gitlab提供源码仓库功能,通过web ...

  3. Gitlab自动触发Jenkins构建打包

    一.目的 在部门的测试环境中,开发人员一旦向gitlab仓库提交成功代码,gitlab就会自动触发jenkins构建项目.当然在构建后还可以添加项目部署或者自动化测试的脚本.这里只针对测试环境. 二. ...

  4. gitlab ci 自动化部署_前端gitLab加jenkins自动化构建和部署,以及服务器常用的linux命令行操作,免密登录...

    常用的linux命令行操作 将项目部署到服务器后,需要查看文件是否已经部署成功,已经对文件进行增删改查操作,就需要用到命令行操作,常用操作如下: ll 罗列出当前文件或目录的详细信息,含有时间.读写权 ...

  5. Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

    一.环境需求 本帖针对的是Linux环境,Windows或其他系统也可借鉴.具体只讲述Jenkins配置以及整个流程的实现. 1.JDK(或JRE)及Java环境变量配置,我用的是JDK1.8.0_1 ...

  6. 搭建GitLab+Jenkins持续集成环境图文教程

    GitLab是一个代码仓库,用来管理代码.Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务.所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率 ...

  7. Jenkins 与 GitLab 的自动化构建之旅

    本文来自作者 墨雪卿 在 GitChat 上分享 「Jenkins 与 GitLab 的自动化构建之旅」,「阅读原文」查看交流实录. 「文末高能」 上一篇:<Git 企业开发者教程> 1. ...

  8. Jenkins + Gitlab+ Docker + SpringBoot 构建流水线

    1 环境 192.168.38.80 docker jenkins gitlab 2 Spring Boot 2.1 HelloController @RestController public cl ...

  9. 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...

最新文章

  1. C++中this指针的用法.
  2. 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植
  3. [转]SQL Server 2000执行计划成本(1/5)
  4. XCTF-MISC-新手区:give_you_flag
  5. java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
  6. 量子计算机西南交大,交大量子光电实验室
  7. 【编译原理笔记08】语法制导翻译:语法制导定义,SSD的求值顺序,S属性定义与L属性定义
  8. 无密码退出、卸载趋势防毒墙网络版
  9. 树莓派制作语音对话机器人
  10. 怎样做小游戏挖金子(VC,源码3)
  11. 拼多多进军社区团购 店宝宝:巨头竞争加剧
  12. Mapgis技巧篇1
  13. VS2017报错 class “Cxxxx“没有成员“GetContextMenuManager“ “GetContextMenuManager“:不是“Cxxxx“的成员
  14. 2023系统分析师综合知识必备知识点
  15. RabbitMQ-基础(二)
  16. CSAPP Lab2:Bomb Lab
  17. python视觉识别线条_简单车道线识别
  18. 海尔云悦2db微型计算机,客厅小伙伴 海尔云悦mini2迷你主机评测
  19. 数据结构课程设计--学生信息管理系统
  20. c语言初学者常见错误归纳,C语言中常见错误分析.doc

热门文章

  1. 二叉树遍历-层序-递归
  2. 苹果工具条_苹果iOS 13.4 Beta 1来袭:网友直接吐槽0创新
  3. 基于springboot的学生管理系统
  4. linux进阶-ssh命令的使用技巧全get
  5. 第一类和第二类曲面积分的转换
  6. 图片头顶距离顶部百分比怎么修改_PS中,新手该怎么修改图像尺寸?看老师傅们都采用哪些方法?...
  7. 分享一个matplotlib柱状图
  8. 信捷 XDH Ethercat 正负极限的设置
  9. 【微信小程序】云函数使用excel-export导出excel
  10. 基于html家具装饰网站设计毕业设计.rar(含论文毕设+项目源码+答辩设计+成绩评分表+评定表)