文章目录
本文章达到了一万六千字,有点多,但是比较全
一、Jenkinx+Gitlab持续集成环境概述
(1)什么是CI/CD
-
CI为持续集成,CD为持续交付和持续部署,一般CD就是持续交付
-
CI/CD概述:
持续集成(CI): 持续集成(Continuous integration)是指开发者在代码的开发过程中,可以频繁的将代码部署到master主干上,并且进行自动化测试
持续交付(CD): 持续交付(Continuous Delivery)是指在持续集成的基础上,将代码部署到预生产环境,即测试环境
持续部署(CD): 在持续交付的基础上,把代码部署到生产环境的过程自动化
- 一层套一层,使用CI/CD的目的就是使整个开发、运维的环境变成一个闭环,提高效率
(2)Jenkins概述
-
Jenkins是一个开源软件项目,是基于JAVA开发的一款持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变为可能
-
官方网站: https://jenkins.io/
(3)Gitlab概述
-
Gitlab是一个利用Ruby on Redis开发的开源应用程序,实现了一个自托管的Git项目仓库,用户可以通过web界面进行访问公开或者私人项目
-
Gitlab拥有和Github类似的功能,都能浏览源代码、管理缺陷和注释,可以管理团队对仓库的访问,Gitlab会提供一个文件历史库去存放提交过的项目版本,并且还提供一个代码片段收集功能,可以轻松实现代码复用,方便以后有需要的时候进行查找
-
Ruby on Redis: 是一个可以使开发、部署、维护web应用程序变得简单的框架
-
官方网站: https://about.gitlab.com/
(4)Gitlab和Github的区别
- 相同点
二者都是基于web的Git仓库,很大程度上Gitlab是仿照Github做出来的,并且二者都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化的、云存储的场所
- 不同点
- GitHub如果要使用私有仓库,超过四个是需要付费的,而Gitlab可以在上面创建私人的免费仓库,因为公司可以自己部署Gitlab
- Gitlab让开发团队对他们的代码仓库拥有更多的控制,相对于Github,有着不少特色,例如:可以免费设置仓库权限、运行用户选择分享一个项目的源代码、运行用户设置项目的获取权限,进一步的提升了安全性,还可以设置获取到团队整体的改进进度,通过innersourcing让不在权限范围内的人访问不到该资源。开发者还可以把某个代码打上”仍在进行中“的标签来提醒其他成员这个代码没有完成,从而阻止未完成的代码合并到其他的代码中
总的来说,从代码的私有性来看,有时候公司并不希望员工获取到全部的代码,而Gitlab无疑是更好的选择,但是对于开源代码来说,GIthub依然是代码托管的首选
******注释******
git是一个分布式的版本控制器,是一种命令、一种工具,Gitlab和Github都是基于git实现的在线代码托管仓库,不同的是Github是面向互联网开放的,而Gitlab通常都是公司内部网络使用,两者都有网站页面
gitlab-ce是社区服,是免费的,gitlab-ee是企业版,是收费的
(5)Jenkins配合Gitlab持续集成系统的工作流程
-
开发者将新版本推送到Gitlab中
-
Gitlab会触发Jenkins的master主节点(Jenkinx是可以分主从节点的)进行一次建造
-
Jenkins主节点将这个建造任务分配给若干个注册的从节点中的一个,这个从节点会根据事先设置好的脚本进行建造,这个脚本可以做的事情有很多,例如编译、测试、生产测试报告等功能,这些原本需要手动完成的任务都可以交给Jenkins来完成
如果在建造过程中需要编译,一般会使用分布式编译器distcc来加快编译速度
二、部署持续集成环境
(1)实验环境
系统 | 主机名 | ip | 扮演角色 | 安装软件 |
---|---|---|---|---|
Centos7.4 | gitlab | 192.168.100.202 | Gtilab | gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm |
Centos7.4 | jenkins | 192.168.100.203 | Jenkins | jenkins-2.222.4-1.1.noarch.rpm |
Centos7.4 | apache | 192.168.100.204 | web | apache |
注意:Gitlab的内存给大一点,最好是4G,Jenkins给2G,不然后面会报错
(2)实验步骤
-搭建Gitlab(100.202)
******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname gitlab
[root@Centos7 ~]# su
[root@gitlab ~]# systemctl stop firewalld
[root@gitlab ~]# setenforce 0
setenforce: SELinux is disabled
[root@gitlab ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)安装gitlab依赖包
[root@gitlab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python
。。。。。。
完毕!
******(3)开启邮件服务,默认使用postfix发送邮件
[root@gitlab ~]# systemctl enable postfix
[root@gitlab ~]# systemctl start postfix
******(4)关闭防火墙,或者允许http通过,做基础配置的时候已经关了
[root@gitlab ~]# firewall-cmd --permanent --add-service=http #允许http通过
[root@gitlab ~]# systemctl reload firewalld #重载
******(5)安装gitlab
#安装gitlab需要rpm包,有两种方法下载rpm包
使用迅雷下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
使用YUM源下载:(YUM下载非常慢)
[root@gitlab ~]# vim /etc/yum.repos.d/gitlab.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
[root@gitlab ~]# yum install -y gitlab-ce #安装社区版的gitlab
。。。。。。
完毕!
#这里直接上传软件包进行安装gitlab
[root@gitlab ~]# ll
总用量 625204
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 640204790 6月 30 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# yum -y install gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
。。。。。。
完毕!
*. *.
*** ***
***** *****
.****** *******
******** ********
,,,,,,,,,***********,,,,,,,,,
,,,,,,,,,,,*********,,,,,,,,,,,
.,,,,,,,,,,,*******,,,,,,,,,,,,
,,,,,,,,,*****,,,,,,,,,.
,,,,,,,****,,,,,,
.,,,***,,,,
,*,.
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \
/ /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/\__/_____/\__,_/_.___/
******(6)配置gitlab访问地址
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
。。。。。。
13 external_url 'http://192.168.100.202' #修改url为自己的ip地址
。。。。。。
#保存退出
******(7)重置gitlab,每次修改完配置文件都需要重置,重置大约需要三分钟左右
[root@gitlab ~]# gitlab-ctl reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 509/1343 resources updated in 02 minutes 27 seconds
gitlab Reconfigured! #出现这个表示重置成功
******(8)查看端口,gitlab默认使用nginx作为web界面,要注意的是,如果在访问web界面时总是报502的话,需要清空防火墙规则或者关闭防火墙,并且内存要大于4G不然有时也会报502,每次重置完之后不要马上进行访问,稍微等一两分钟再访问
[root@gitlab ~]# netstat -anpt | grep 80
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2038/unicorn master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2103/nginx: master
tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 2056/sidekiq 5.2.7
tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 2103/nginx: master
tcp 0 0 127.0.0.1:8080 127.0.0.1:47272 TIME_WAIT -
tcp 0 0 127.0.0.1:8080 127.0.0.1:47264 TIME_WAIT -
tcp 0 0 127.0.0.1:8080 127.0.0.1:47274 TIME_WAIT -
tcp 0 0 127.0.0.1:44214 127.0.0.1:8060 ESTABLISHED 2526/prometheus
tcp 0 0 127.0.0.1:8060 127.0.0.1:44214 ESTABLISHED 2104/nginx: worker
tcp 0 0 127.0.0.1:52642 127.0.0.1:8082 ESTABLISHED 2526/prometheus
tcp 0 0 127.0.0.1:8080 127.0.0.1:47266 TIME_WAIT -
tcp 0 0 127.0.0.1:8082 127.0.0.1:52642 ESTABLISHED 2056/sidekiq 5.2.7
(9)登录gitlab
第一次登录gitlab需要为root用户修改密码,root用户是gitlab的超级管理员,这里输入新的密码:nihao123!
成功登录gitlab
******(10)汉化gitlab
# gitlab中文社区版的项目,v7-v8.8 是由 Larry Li发起的“GitLab 中文社区版项目”(https://gitlab.com/larryli/gitlab),从 v8.9之后,@xhang 开始继续该汉化项目(https://gitlab.com/xhang/gitlab)。
# 软件下载地址,这里使用是V12版本的gitlab所以需要下载v12的汉化包
# 下载地址:https://gitlab.com/xhang/gitlab/-/archive/12-0-stable/gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# ll #上传软件包
总用量 699968
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 76557595 6月 30 17:35 gitlab-12-0-stable-zh.tar.gz
-rw-r--r-- 1 root root 640204790 6月 30 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# tar xf gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# cat gitlab-12-0-stable-zh/VERSION #确认版本
12.0.3
******(11)开始汉化
[root@gitlab ~]# gitlab-ctl stop #先停止gitlab
ok: down: alertmanager: 0s, normally up
ok: down: gitaly: 1s, normally up
ok: down: gitlab-monitor: 0s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 1s, normally up
ok: down: node-exporter: 0s, normally up
ok: down: postgres-exporter: 1s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 1s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up
[root@gitlab ~]# unalias cp #删除cp的别名
[root@gitlab ~]# cp -rf gitlab-12-0-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/ #后面的报错不用管
cp: 无法以目录"gitlab-12-0-stable-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
cp: 无法以目录"gitlab-12-0-stable-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"
[root@gitlab ~]# gitlab-ctl start #开启gitlab,在开启后等一两分钟再访问gitlab否则会报错
ok: run: alertmanager: (pid 4094) 0s
ok: run: gitaly: (pid 4102) 1s
ok: run: gitlab-monitor: (pid 4123) 0s
ok: run: gitlab-workhorse: (pid 4127) 0s
ok: run: grafana: (pid 4134) 1s
ok: run: logrotate: (pid 4147) 0s
ok: run: nginx: (pid 4153) 1s
ok: run: node-exporter: (pid 4158) 0s
ok: run: postgres-exporter: (pid 4162) 1s
ok: run: postgresql: (pid 4243) 0s
ok: run: prometheus: (pid 4252) 0s
ok: run: redis: (pid 4261) 1s
ok: run: redis-exporter: (pid 4265) 0s
ok: run: sidekiq: (pid 4270) 1s
ok: run: unicorn: (pid 4276) 0s
访问web界面,成功汉化
-Gitlab的使用
- 基本命令
名称 | 作用 |
---|---|
gitlab-ctl stop | 关闭gitlab |
gitlab-ctl start | 开启gitlab |
gitlab-ctl restart | 重启gitlab |
gitlab-ctl reconfigure | 重置gitlab,在修改完配置文件后需要执行,不能乱用 |
- gitlab相关配置文件和目录
名称 | 作用 |
---|---|
/etc/gitlab/gitlab.rb | gitlab主配置文件,可以自定义一些邮件服务等 |
/var/log/gitlab/ | 日志目录,对应各服务的日志的目录 |
/var/opt/gitlab/ | 服务目录,对应各个服务的目录 |
/var/opt/gitlab/git-data | 仓库目录,记录项目仓库等提交信息 |
-关闭gitlab注册功能
默认情况下,用户可以自己去注册账号,这样显然是不安全的,所以可以关闭gitlab的账户注册功能
-配置gitlab邮件报警
运维人员最注重的一点就是告警邮件,所以gitlab也配备了邮件发送的功能,但是使用gitlab的默认设置可能收不到邮件,所以需要我们手动修改,在做邮件报警时需要加一块桥接网卡
官网各种邮箱配置实例:https://docs.gitlab.com/omnibus/settings/smtp.html
******(1)修改配置文件,这里配置的是qq的smtp
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
。。。。。。 #在58行添加,都是注释直接空一行写就行
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com" #指定smtp服务器
gitlab_rails['smtp_port'] = 465 #每个服务器都有对应的端口,qq的是465
gitlab_rails['smtp_user_name'] = "1248873545@qq.com" #邮箱
gitlab_rails['smtp_password'] = "tlefpqamwrhkhage" #smtp号
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '1248873545@qq.com' #发送邮件的邮箱
#保存退出
******(2)重置gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 16/669 resources updated in 01 minutes 07 seconds
gitlab Reconfigured!
******(3)登录控制台发送邮件
[root@gitlab ~]# gitlab-rails console
。。。。。。
irb(main):002:0> Notify.test_email('1248873545@qq.com', 'test', 'test').deliver_now #发送邮箱到1248873545@qq.com,标题为test,内容为test
Notify#test_email: processed outbound mail in 123.1ms
Sent mail to 1248873545@qq.com (2811.6ms)
Date: Wed, 30 Jun 2021 10:07:59 +0800
From: GitLab <1248873545@qq.com>
Reply-To: GitLab <noreply@192.168.100.202>
To: 1248873545@qq.com
Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>
Subject: test
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>test</p></body></html>
=> #<Mail::Message:70094578102080, Multipart: false, Headers: <Date: Wed, 30 Jun 2021 10:07:59 +0800>, <From: GitLab <1248873545@qq.com>>, <Reply-To: GitLab <noreply@192.168.100.202>>, <To: 1248873545@qq.com>, <Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>>, <Subject: test>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
邮件可以成功发送后,开始修改root用户的邮箱,因为root用户的默认邮箱为admin@example.com,修改邮箱后创建组会发送邮件警告
-创建一个新群组
- Private: 只有组成员才能看到
- Internal: 只要登录的用户就能看到
- Public: 所有人都能看到
-创建一个新账户
使用新账户登录gitlab
可以很明显看到,普通用户的权限是没有root多的
-把新创建的用户加入组
#Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
Guest(访客):可以创建issue、发表评论,不能读写版本库
Reporter(报告者):可以克隆代码,不能提交,QA(测试人员)、PM(主管或者产品经理)可以赋予这个权限
Developer(开发人员):可以克隆代码、开发、提交、push,RD(研发人员)可以赋予这个权限
Master(主程序员):可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner(所有者):可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
-创建一个新项目
可以在群组中创建项目,也可以创建私有的项目,创建完后的使用方法和github相同
这里之后都汉化了,下面生成ssh密钥
#因为是要配合jenkins,所有这里使用的密钥直接在jenkins主机上操作即可
[root@Centos7 ~]# hostnamectl set-hostname jenkins
[root@Centos7 ~]# su
[root@jenkins ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gh6chv+S4eK5Tnd8mWzbQNTmWdi4BLK9/H/VrA1Qenk root@Centos7.4-1
The key's randomart image is:
+---[RSA 2048]----+
| . . |
| + o + . |
| . o * oo . |
| o o o = +o o E|
| . * . S + o o.|
| +.o + + . +|
| ..+oo B . = |
| ..o+o o + . o .|
| o=o .. . . .. |
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub #查看公钥并且复制到gitlab的web界面中
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcUghkjbif7vFFzmUfeWaon08+VDF314si8Fa0xonE3dFbpfr1tzSLmldaulj8yBwXvvtS7XKJUuh54gqgQycor/T1apfyfPSLHtCoeZWYzbACufm9penKCA0USkYwTkOQU9HpOx17p85nBO6ydo6Xz0l8UBNqvoy7/tO7mIslcignj+r6mgskTxCoOk9ujwDSQ3QmfhLmc/7B4wGSWclvETZyRGyb8g3rye7+16fpPENpq1YaweoiNAytdb+IZBVjgdIT0k2PVggVdYxntoA0IulCYwolT1KcjJllcSm47IHtDL4J8AgPGO8ZXf7oJM+vMtZRiHlURjLlQzbcAnOh root@Centos7.4-1
使用jenkins主机复制一下仓库
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git #克隆,后面的URL直接在web界面复制就行
正克隆到 'test'...
The authenticity of host '192.168.100.202 (192.168.100.202)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.202' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
[root@jenkins ~]# ll
总用量 4
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
drwxr-xr-x 3 root root 32 6月 30 18:57 test
[root@jenkins ~]# cd test/
[root@jenkins test]# ll #成功克隆仓库
总用量 4
-rw-r--r-- 1 root root 16 6月 30 18:57 1.html
-搭建Jenkins(100.203)
- Jenkins下载地址
https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
- linux的wget下载地址:
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
******(1)先做基础配置
[root@jenkins ~]# systemctl stop firewalld
[root@jenkins ~]# setenforce 0
setenforce: SELinux is disabled
[root@jenkins ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)因为Jenkins是使用JAVA开发,所以需要安装JDK
[root@jenkins ~]# ls #上传jdk包
anaconda-ks.cfg jdk-8u91-linux-x64.tar.gz test
[root@jenkins ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# mv /usr/local/jdk1.8.0_91 /usr/local/java
[root@jenkins ~]# ls /usr/local/
bin etc games include java lib lib64 libexec sbin share src
[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_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
******(3)上传Jenkins软件包,安装、配置
[root@jenkins ~]# ll
总用量 241624
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x 3 root root 32 6月 30 18:57 test
[root@jenkins ~]# yum -y install jenkins-2.222.4-1.1.noarch.rpm #安装Jenkins
。。。。。。
完毕!
[root@jenkins ~]# vim /etc/sysconfig/jenkins #修改配置文件
。。。。。。
28 #
29 JENKINS_USER="root" #把jenkins的用户改成root,因为上传密钥到gitlab的用户是root
30
。。。。。。
#保存退出
[root@jenkins ~]# ln -s /usr/local/java/bin/java /usr/bin/ #添加java的软连接
[root@jenkins ~]# /etc/init.d/jenkins start #启动jenkins
Starting jenkins (via systemctl): [ 确定 ]
[root@jenkins ~]# netstat -anpt | grep 8080 #默认监听的端口是8080
tcp6 0 0 :::8080 :::* LISTEN 15122/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:关
-访问Jenkins并且安装相关插件
(1)解锁jenkins
使用浏览器访问http://192.168.100.203:8080即可,会出现解锁页面,并且提供了密码保存的路径,打开文件输入密码就行
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword #查看后,复制到web界面里
820ee2b087484685b4b04ebb5d834c34
#注意:由于jenkins需要联网下载插件,默认插件的网址是jenkins的官网(速度特别慢),因此需要给jenkins更换插件的下载源
#更换插件下载源步骤如下:
1、上图不要点继续、并且给Jenkins服务器断网
2、断网之后,再点继续
3、如下图,选择跳过插件安装
(2)登录Jenkins
-安装Jenkins插件
Jenkins的插件可以手动安装也可以联网安装
- 联网安装
Jenkins默认的插件源下载的特别慢,所以我们可以修改插件源
(1)给jenkins服务器联网,重新启动jenkins
[root@jenkins ~]# /etc/init.d/jenkins restart
(2)登录Jenkins
(3)选择Manage Jenkins----->Manage Plugins------>Advanced------->向下滑
将以下连接https://updates.jenkins.io/update-center.json替换为
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
(4)回到jenkins服务器,进行以下操作
[root@jenkins ~]# cd /var/lib/jenkins/updates/
[root@jenkins updates]# 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
到此为止,插件源修改完成
- 手动安装
如果联网安装插件失败或者是在无网络的环境下安装插件,可以选择手动安装,可以在web界面去安装也可以去linux系统中安装
web界面安装:
这个插件下载需要在有网的情况下,下载好了,再上传至服务器,直接点击选择文件就行
下载地址: http://updates.jenkins-ci.org/download/plugins/,下载完成之后,上传就行
linux命令行安装:
[root@jenkins ~]# ls #上传plugins.tar.gz插件包
anaconda-ks.cfg jdk-8u91-linux-x64.tar.gz jenkins-2.222.4-1.1.noarch.rpm plugins.tar.gz test
[root@jenkins ~]# rm -rf /var/lib/jenkins/plugins #删除原来的插件包
[root@jenkins ~]# tar xf plugins.tar.gz -C /var/lib/jenkins/ #直接解压到jenkins目录中
[root@jenkins ~]# systemctl restart jenkins #重启服务,不重启无法使插件生效
直接替换/var/lib/jenkins下的plugins插件包目录,然后重启,可以上传的最好是有中文的插件包,之后修改这个为zh_CN重启jenkins会变成中文
-Jenkins升级
******(1)查看jenkins的war包所在的目录
[root@jenkins ~]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war #这个就是war包所在目录
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
******(2)下载最新稳定的war包
#下载地址:wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/latest/jenkins.war
#这里直接上传了
[root@jenkins ~]# systemctl stop jenkins #先关闭服务
[root@jenkins ~]# cd /usr/lib/jenkins/
[root@jenkins jenkins]# mv jenkins.war jenkins.war.bak #把原来的war包备份
[root@jenkins jenkins]# ll #上传新的war包
总用量 133996
-rw-r--r-- 1 root root 70969355 6月 30 23:57 jenkins.war
-rw-r--r-- 1 root root 66239216 5月 28 2020 jenkins.war.bak
[root@jenkins jenkins]# systemctl start jenkins #启动服务
[root@jenkins jenkins]# netstat -anpt | grep 8080 #确认启动
tcp6 0 0 :::8080 :::* LISTEN 15538/java
登录web界面验证
可以很明显的看到ui变了,成功升级jenkins
-配置jenkins使用gitlab更新代码
需要用到下面的插件
#有的已经默认安装,可以在已安装的上面的搜索栏中搜索一下确认
Credentials (默认已经安装) #签名证书管理插件
Gitlab #安装后从gitlab获取代码
Git 和 Git Client (默认已安装)#用于jenkins在gitlab 中拉取源码
GitLab Hook #gitlab触发jenkins构建项目
#hook [hʊ ʊk] 钩子; plugin ['plʌ ʌgɪ ɪn] 插件
Gitlab Authentication # gitlab 和 jenkins 认证相关的插件
SSH Plugin #进程执行shell 脚本
Publish Over SSH #用于通过 ssh部署应用
没有可选插件可能是因为版本问题,可以先往下做
上面已经把jenkins主机root用户的公钥传到了gitlab上,并且同步gitlab的仓库也已经成功,下面只需要把jenkins主机root用户的私钥传到jenkins的web界面上,这样jenkins就可以直接免密拉取gtilab的仓库了
[root@jenkins ~]# cat .ssh/id_rsa #查看私钥并复制
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA3FIIZI24n+7xRc5lH3lmqJ9PPlQxd9eLIvBWtMaJxN3RW6X6
9bc0i5pXWrpY/MgcF777Uu1yiVLoeeIKoEMnKK/09WqX8nz0ix7QqHmVmM2wArn5
vaXpyggNFEpGME5DkFPR6Tsde6fOZwTusnaOl89JfFATar6Mu/7Tu5iLJXIoJ4/q
+poLJE8QqDpPbo8A0kN0Jn4S5nP+weMBklnJbxE2ckRsm/IN68nu/ten6TxDaatW
GsHqIjQMrXW/iGQVY4HSE9JNj1YIFXWMZ7aANCLpQmMKJU9SnIyZZXEpuOyB7Qy+
CfAIDxjvGV3+6CTPrzLWUYh5VEYy5UM23AJzoQIDAQABAoIBAQCcVtW/zNVLIDoz
Z89YM0SGuW149DOaL+h6pYNRimTuvty2JSTdQeDWg3IjXoKQ9csBirM62GXjTmLL
Qnx51s0t0RaJI9eo6cR6CCbWtlhScvrIJII0ckxg4a+uSzpdQtwsyV32G83DFoOf
lN9w4jIzRZOG1CfDIm4pZR2ITCnJKlRv+hL4gGDTEh3oFQHMJZwxA6qiwXqmRxJ+
jUNP9S2LHl2Zsz3QwTHCsdHUoJisLz348M9bjia5Kn7i/kJONdk3inxBTWhxX9sA
j/GDTO++H4bklRgtJuB+hL7wpYuL5T/dK0VShtWTZVQQZTycPNsmBEf6XYYx37K2
07ZRyCjBAoGBAPNBuWYP1RgIShVBaQsEXjWdP+4orN9cDvvueMKroCkg7QGv2m0v
SDmpKWkhLNurnd3QoqyW1Q1w0+iw1QOKmjmHxo95tu3ieNAQ5TOK8fAiEA996zpC
DiADVjo0qMrUncf1taWCytmhSu0kPDOVsniy8BMlJdzTlgL5QJ+G55NJAoGBAOfc
trZ9b9gI0bBG2Jx9khmY54RZReaJF2q21eR75YTB9myh9AWZ0a+7KukJoay7hk6b
2n3tKx05RV1xbXYM7QKQ2f6Xbvcc8gZbW6viWkrst3ic57stZ2F7Bdg6Q8gH4Wy8
vExvAutE8A7GMlHOjKfx6NByhj8I5jJoPWA84wWZAoGBAOn+AdokRqXsa17Q4btg
Q0MtdS6hX9EnW56JgQ45S0Hk0zb5MpIuljoo95WR/PV9usiBBcog+OYJ7z14xB64
96t5aM3glc90NyRl7CPNdva3vV05kckjezTeINayit848GFFgKqqCniXx1wfq+0v
BVNHRNoVtLsbqMRJgRkzCpVJAoGBAJDjCkYFInPUJvxJeShpC3f1ZY79nkGOH1Tv
Bb/ucCFCd3OwzGUHltGCWzEedKoU0Lukhqc0IkHzvNXEgItJTn3Q+HgwNwYyT0cL
pcBGBPhW7dtv6Rq9J6Hxl1hkKGECE6q4Uc5NfHx6KqyAy4b1VE3KTBqdxifzrq2H
F/tgcNjZAoGBAMoF+HmoroSp0obSTn/CHK15wF7aZBB6clA9d0Ezz63PAd2yLMe3
dMfTpRHVKcMiDrCeYVj/XNjwhA+GXexq4h1WgGBBHuiRwiFP67p5p4Jlad7t6qP9
pnh+oFpRclAmJEJwkj45u5J8oUFeQ7AztILU3qWFMpaYoYLYSdAbkdQR
-----END RSA PRIVATE KEY-----
-使用Jenkins创建新项目
点击保存
创建新项目完成
-将代码发布到web服务器
可以通过执行命令或脚本的方式进行代码发布,使用 root 用户在各个 web 服务器上发布代码。也可以建立一些普通用户如果www或apache 来发布。如果使用普通用户发布代码,要保持所有服务器上的用户id一致,这样没有权限的问题。这里直接使用 root 用户来发布。
******(1)为apache主机安装httpd
[root@Centos7 ~]# hostnamectl set-hostname apache
[root@Centos7 ~]# su
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# setenforce 0
setenforce: SELinux is disabled
[root@apache ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
[root@apache ~]# yum -y install httpd
。。。。。。
完毕!
[root@apache ~]# systemctl start httpd
先测试一下,成功访问
******(2)配置免密认证,所有需要jenkins自动发布代码的服务器都需要进行免密认证
[root@jenkins ~]# ssh-copy-id 192.168.100.204 #发送公钥
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be ins talled: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.100.204 (192.168.100.204)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.204's password: #输入204密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.100.204'"
and check to make sure that only the key(s) you wanted were added.
[root@jenkins ~]# ssh 192.168.100.204 #登录204
Last login: Thu Jul 1 00:38:03 2021
[root@apache ~]# exit #成功免密
登出
******(3)创建自动上传文件的脚本
[root@jenkins ~]# vim aaa.sh
#!/bin/bash
scp /var/lib/jenkins/workspace/aaa/* root@192.168.100.204:/var/www/html #这里需要看一下自己的仓库名称是什么
#保存退出
[root@jenkins ~]# chmod +x aaa.sh #添加可执行权限
[root@jenkins aaa]# pwd
/var/lib/jenkins/workspace/aaa
[root@jenkins aaa]# ll
总用量 4
-rw-r--r-- 1 root root 16 6月 30 16:32 1.html
[root@jenkins aaa]# cat 1.html
aaaaaaaaaaaaaaaa
(4)把脚本添加到jenkins
访问204的httpd测试结果
******先到204上,发现脚本的操作成功执行
[root@apache ~]# ll /var/www/html/
总用量 4
-rw-r--r-- 1 root root 16 7月 1 00:53 1.html
[root@apache ~]# cd /var/www/html/
[root@apache html]# mv 1.html index.html #这里修改了一下网页名称,不然访问不到,可以在gitlab上修改一下名称
成功访问!!!
可以在gitlab去修改文件名称和内容,再次进行测试
发现web页面变成了修改的内容!!
三、实战项目
(1)更新gitlab代码触发jenkins自动部署
实际场景: 在公司的测试环境当中,当开发人员向 gitlab 仓库提交代码后,gitlab 自动通知 jenkins进行构建项目、代码质量测试然后部署至测试环境,这里先暂时部署到测试环境。对于生产环境,后期使用手动部署代码。
需要安装的插件: (有的默认已经安装,可以在已安装的搜索栏搜索一下)
Gitlab Hook Plugin(之前已经安装过)
Build Authorization
Token Root 和 Build Token Trigger
-配置身份验证令牌
******在jenkins服务器上生成随机码
[root@jenkins ~]# openssl rand -hex 12
9525c873b906b013078337c1
#-hex 输出的结果为16进制数据,12表示指定生成的为随机的12个字符
-在jenkins上配置触发器
-在git项目的配置界面设置链接和token
登录创建项目的用户,因为我上面创建项目的用户是root,所以我直接登录root
如果不允许钩子和服务访问本地网络的话,在添加web钩子的时候会报错,下面添加web钩子
URL:http://192.168.100.203:8080/buildByToken/build?job=aaa&token=9525c873b906b013078337c1,这个URL后面的job需要和自己的项目名称相同,可以先到jenkins点击到项目中后查看当前的URL即可
-对web钩子进行测试
-更新gitlab中的项目代码
******在jenkins上操作
[root@jenkins ~]# ll
总用量 477292
-rwxr-xr-x 1 root root 84 6月 30 16:53 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 32 6月 30 18:57 test
[root@jenkins ~]# rm -rf test/ #删除原来的仓库
[root@jenkins ~]# ll
总用量 477292
-rwxr-xr-x 1 root root 84 6月 30 16:53 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git #重新克隆一下
正克隆到 'test'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 8 (delta 0), reused 0 (delta 0)
接收对象中: 100% (8/8), done.
[root@jenkins ~]# ls
aaa.sh anaconda-ks.cfg jdk-8u91-linux-x64.tar.gz jenkins-2.222.4-1.1.noarch.rpm plugins.tar.gz test
[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 14 7月 1 16:22 index.html
[root@jenkins test]# cat index.html
bbbbbbbbbbbbbb
[root@jenkins test]# echo "aaaaaaaaaaaaaaaaaa" > index.html #修改一下网页文件
[root@jenkins test]# cat index.html
aaaaaaaaaaaaaaaaaa
[root@jenkins test]# git add . #添加到暂存区
[root@jenkins test]# git commit -m "add index" #添加到本地仓库
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@jenkins.(none)')
[root@jenkins test]# git config --global user.name "root" #指定用户名
[root@jenkins test]# git config --global user.email "1248873545@qq.com" #指定邮箱
[root@jenkins test]# git commit -m "add index" #添加到本地仓库
[master 6974052] add index
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push origin master #推送到远程仓库的master分支
Counting objects: 5, done.
Writing objects: 100% (3/3), 237 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
c1d114b..6974052 master -> master
-访问web主机
这里只修改仓库的文件是因为上面的实验已经写过脚本了
成功!!!!
(2)实现Build Pipeline插件显示流程图
Bulid Pipeline插件作用:这个插件能够以流程图的形式展示各个工作的顺序,依赖关系等
-给aaa项目创建一个视图
完成!!!
(3)使用分支进行网站回滚
******在jenkins上操作
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git
正克隆到 'test'...
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 11 (delta 0), reused 0 (delta 0)
接收对象中: 100% (11/11), done.
[root@jenkins ~]# ll
总用量 477292
-rwxr-xr-x 1 root root 84 6月 30 16:53 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 36 7月 1 17:05 test
[root@jenkins ~]# cd test/
[root@jenkins test]# git branch #查看所有分支
* master
[root@jenkins test]# git branch bb #创建分支
[root@jenkins test]# git checkout bb #切换分支
切换到分支 'bb'
[root@jenkins test]# git branch
* bb
master
[root@jenkins test]# git merge master
Already up-to-date.
[root@jenkins test]# cat index.html
aaaaaaaaaaaaaaaaaa
[root@jenkins test]# echo "bbbbbbbbb" > index.html #修改文件内容
[root@jenkins test]# cat index.html
bbbbbbbbb
[root@jenkins test]# git add . #推送到暂存区
[root@jenkins test]# git commit -m "add new" #推送到本地仓库
[bb e4c8495] add new
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push -u origin bb #推送到远程仓库
Counting objects: 5, done.
Writing objects: 100% (3/3), 235 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for bb, visit:
remote: http://192.168.100.202/root/test/merge_requests/new?merge_request%5Bsource_branch%5D=bb
remote:
To git@192.168.100.202:root/test.git
6974052..e4c8495 bb -> bb
分支 bb 设置为跟踪来自 origin 的远程分支 bb。
这个时候在gtilab的web界面中可以看到增加了新的分支
******修改脚本
[root@jenkins ~]# vim aaa.sh
#!/bin/bash
cd /root
git clone -b bb git@192.168.100.202:root/test.git
scp /root/test/index.html root@192.168.100.204:/var/www/html/index.html
[root@jenkins ~]# chmod +x aaa.sh
测试,是否更换页面
(4)使用jenkins发布tomcat项目
-
此项目需要在Jenkins上安装JDK和Maven
-
Jenkins本身就是java开发,所以必须安装jdk,因为此项目基于maven架构,所以必须安装maven
-
Maven:就是将开发写的java代码,打包成war包,然后再将打包的war包部署到tomcat上,供客户端来访问
-
Project Object Model: 项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
-安装Maven
#下载Maven:wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
******(1)这里已经下载了,所以直接上传进行安装
[root@jenkins ~]# ll
总用量 485928
-rwxr-xr-x 1 root root 144 7月 1 17:14 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 8842660 7月 2 09:29 apache-maven-3.5.4-bin.tar.gz
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 36 7月 1 17:05 test
[root@jenkins ~]# tar xf apache-maven-3.5.4-bin.tar.gz
[root@jenkins ~]# mv apache-maven-3.5.4 maven
[root@jenkins ~]# ln -s maven/bin/mvn /usr/bin/mvn #优化命令执行路径
[root@jenkins ~]# vim /etc/profile #在末尾添加
。。。。。。
export MAVEN_HOME=/root/maven
export PATH=$PATH:$MAVEN_HOME/bin
#保存退出
[root@jenkins ~]# source /etc/profile
-创建Maven私服nexus
因为maven要下载jar包,而maven默认回去官网下载,官网下载太慢了,所以可以搭建nexus加快jar包的下载速度
配置仓库的两个选项:1.项目下的pom.xml配置,只会生效当前的项目
2.在maven配置全局,所有项目生效
******(1)上传nexus包进行安装
[root@jenkins ~]# ll
总用量 605956
-rwxr-xr-x 1 root root 144 7月 1 17:14 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 8842660 7月 2 09:29 apache-maven-3.5.4-bin.tar.gz
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x 6 root root 99 7月 2 09:29 maven
-rw-r--r-- 1 root root 122904706 7月 2 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 36 7月 1 17:05 test
[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 #开启nexus
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
#nexus默认监听的端口是8081,因为是java开发,所有启动比较慢
[root@jenkins ~]# netstat -anptu | grep 8081
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 1460/java
访问nexus
默认账号:admin,默认密码:admin123
修改为阿里云的URL:http://maven.aliyun.com/nexus/content/groups/public
配置私服
******修改配置文件
[root@jenkins ~]# cd maven/conf/
[root@jenkins conf]# vim settings.xml
。。。。。。 #在配置文件中间插入
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.100.203:8081/repository/maven-central/</url>
</mirror>
。。。。。。#这里同样从配置文件中间插入
<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>
。。。。。。#这里从197行的profiles开始修改
197 <profiles>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://192.168.100.203: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.100.203:8081/repository/maven-central/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
。。。。。。
#保存退出
-到jenkins的web界面上安装git和maven的插件
如果在可选插件中什么也看不到,可以在管理jenkins的界面点击下载新版本,下载最新的war包,升级jenkins,或者在网页中点击退回之前的版本
安装过程中必须有网,安装不成功可以手动到官网下,或者直接在linux的jenkins的目录中上传插件的目录和插件的jpi文件
-进入配置阶段
-新建jenkins任务
#脚本
[root@jenkins ~]# vim bbb.sh
#!/bin/bash
source /etc/profile
scp /var/lib/jenkins/workspace/tast/test1/target/test1.war root@192.168.100.204:/usr/local/tomcat/webapps/
ssh root@192.168.100.204 "/usr/local/tomcat/bin/shutdown.sh"
sleep 3
ssh root@192.168.100.204 "/usr/local/tomcat/bin/startup.sh"
[root@jenkins ~]# cd /var/lib/jenkins/workspace
[root@jenkins workspace]# rm -rf * #删除原来的
[root@jenkins workspace]# ll
总用量 0
[root@jenkins workspace]# git clone git@192.168.100.202:root/test.git #重新克隆
正克隆到 'test'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 14 (delta 0), reused 0 (delta 0)
接收对象中: 100% (14/14), done.
[root@jenkins workspace]# ll
总用量 0
drwxr-xr-x 3 root root 36 7月 2 18:19 test
[root@jenkins workspace]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 19 7月 2 18:19 index.html
[root@jenkins test]# rm -rf *
[root@jenkins test]# ll #传输项目到脚本指定的路径下
总用量 4
drwxr-xr-x 5 root root 97 7月 2 17:56 test1
-rw-r--r-- 1 root root 491 7月 2 17:56 time.java
[root@jenkins test]# git add test1 #添加暂存区
[root@jenkins test]# git add time.java
[root@jenkins test]# git commit -m "tomcat " #添加到本地仓库
[master 502f979] tomcat
20 files changed, 262 insertions(+)
create mode 100644 test1/.classpath
create mode 100644 test1/.project
create mode 100644 test1/.settings/.jsdtscope
create mode 100644 test1/.settings/org.eclipse.jdt.core.prefs
create mode 100644 test1/.settings/org.eclipse.m2e.core.prefs
create mode 100644 test1/.settings/org.eclipse.wst.common.component
create mode 100644 test1/.settings/org.eclipse.wst.common.project.facet.core.xml
create mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.container
create mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.name
create mode 100644 test1/.settings/org.eclipse.wst.validation.prefs
create mode 100644 test1/pom.xml
create mode 100644 test1/src/main/resources/com/Time.java
create mode 100644 test1/src/main/webapp/WEB-INF/web.xml
create mode 100644 test1/src/main/webapp/index.jsp
create mode 100644 test1/target/classes/com/Time.class
create mode 100644 test1/target/classes/com/Time.java
create mode 100644 test1/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF
create mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.properties
create mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.xml
create mode 100644 time.java
[root@jenkins test]# echo $?
0
[root@jenkins test]# git push -u origin master #推送到远程仓库
Counting objects: 38, done.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (37/37), 5.25 KiB | 0 bytes/s, done.
Total 37 (delta 1), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
6974052..502f979 master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
-在web主机上安装tomcat
******(1)先删除httpd
[root@apache ~]# yum -y remove httpd
。。。。。。
完毕!
******(2)安装tomcat
[root@apache ~]# ll #上传jdk和tomcat的源码包
总用量 186324
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 9417469 7月 3 02:08 apache-tomcat-8.5.16.tar.gz
-rw-r--r-- 1 root root 181367942 7月 3 02:02 jdk-8u91-linux-x64.tar.gz
[root@apache ~]# tar xf jdk-8u91-linux-x64.tar.gz
[root@apache ~]# mv jdk1.8.0_91/ /usr/local/java
[root@apache ~]# cat <<a>> /etc/profile
> export PATH=$PATH:/usr/local/java/bin:/usr/local/java
> a
[root@apache ~]# source /etc/profile
[root@apache ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
[root@apache ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@apache ~]# mv apache-tomcat-8.5.16 /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
Tomcat started.
[root@apache ~]# netstat -anpt | grep java
tcp6 0 0 :::8080 :::* LISTEN 1458/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1458/java
tcp6 0 0 :::8009 :::* LISTEN 1458/java
-在jenkins中进行构建
-报错的解决方案
#为web主机添加权限
[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/
[root@apache ~]# vim /usr/local/tomcat/bin/catalina.sh #直接在注释下添加
#!/bin/bash
JAVA_HOME="/usr/local/java"
JRE_HOME="/usr/local/java/jre"
。。。。。。
#保存退出
(5)Jenkins回滚
Jenkins回滚有两种方式,分别是通过gitlab仓库的commit_id来回滚和使用jenkins的版本序列号来回滚
-通过commit_id来回滚
- Gitlab可以通过提交的id号的前12位,就可以回到之前的状态
******(1)使用的是上面的apache项目,所以现在web主机上安装一下httpd
[root@apache ~]# yum -y install httpd
。。。。。。
完毕!
[root@apache ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@apache ~]# systemctl start httpd
(2)在做之前先安装一下gogs插件
注意:安装失败可以去手动下载,然后上传
(3)配置jenkins中apache的项目
case $status in
rollback)
echo "-----本次操作为回滚,版本号为$version-----"
git reset --hard $version
echo "-----回滚完成,打包中-----"
;;
*)
exit
esac
#发现上面的status和version,都作为变量被引入了,使用case语句,把rollback作为条件,达到目的效果
[root@jenkins ~]# vim aaa.sh #编写脚本
#!/bin/bash
cd /root
scp /var/lib/jenkins/workspace/aaa/index.html root@192.168.100.204:/var/www/html/index.html
#/var/lib/jenkins/workspace/这个目录为jenkins拉取gitlab库下来的库,后面的aaa就是项目目录,仓库文件会拉到相应的项目目录中
[root@jenkins ~]# rm -rf test/ #删除原来拉下来的gitlab库,重新拉取
[root@jenkins ~]# ll
总用量 605960
-rwxr-xr-x 1 root root 144 7月 1 17:14 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 8842660 7月 2 09:29 apache-maven-3.5.4-bin.tar.gz
-rwxr-xr-x 1 root root 274 7月 2 19:05 bbb.sh
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x 6 root root 99 7月 2 09:29 maven
-rw-r--r-- 1 root root 122904706 7月 2 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 20 7月 2 09:34 sonatype-work
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git #重新拉取仓库
正克隆到 'test'...
remote: Enumerating objects: 57, done.
remote: Counting objects: 100% (57/57), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 57 (delta 1), reused 0 (delta 0)
接收对象中: 100% (57/57), 6.79 KiB | 0 bytes/s, done.
处理 delta 中: 100% (1/1), done.
[root@jenkins ~]# cd test/
[root@jenkins test]# git rm -rf * #使用git rm -rf删除之前仓库中的所有文件
rm 'index.html'
rm 'test1/.classpath'
rm 'test1/.project'
rm 'test1/.settings/.jsdtscope'
rm 'test1/.settings/org.eclipse.jdt.core.prefs'
rm 'test1/.settings/org.eclipse.m2e.core.prefs'
rm 'test1/.settings/org.eclipse.wst.common.component'
rm 'test1/.settings/org.eclipse.wst.common.project.facet.core.xml'
rm 'test1/.settings/org.eclipse.wst.jsdt.ui.superType.container'
rm 'test1/.settings/org.eclipse.wst.jsdt.ui.superType.name'
rm 'test1/.settings/org.eclipse.wst.validation.prefs'
rm 'test1/pom.xml'
rm 'test1/src/main/resources/com/Time.java'
rm 'test1/src/main/webapp/WEB-INF/web.xml'
rm 'test1/src/main/webapp/index.jsp'
rm 'test1/target/classes/com/Time.class'
rm 'test1/target/classes/com/Time.java'
rm 'test1/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF'
rm 'test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.properties'
rm 'test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.xml'
rm 'time.java'
[root@jenkins test]# echo "aaaa1" > index.html #重新写一份文件
[root@jenkins test]# git add index.html #添加到暂存区
[root@jenkins test]# git commit -m "aaa1" #添加到本地仓库
[master eec82c4] aaa1
21 files changed, 1 insertion(+), 263 deletions(-)
delete mode 100644 test1/.classpath
delete mode 100644 test1/.project
delete mode 100644 test1/.settings/.jsdtscope
delete mode 100644 test1/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 test1/.settings/org.eclipse.m2e.core.prefs
delete mode 100644 test1/.settings/org.eclipse.wst.common.component
delete mode 100644 test1/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.container
delete mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.name
delete mode 100644 test1/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 test1/pom.xml
delete mode 100644 test1/src/main/resources/com/Time.java
delete mode 100644 test1/src/main/webapp/WEB-INF/web.xml
delete mode 100644 test1/src/main/webapp/index.jsp
delete mode 100644 test1/target/classes/com/Time.class
delete mode 100644 test1/target/classes/com/Time.java
delete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF
delete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.properties
delete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.xml
delete mode 100644 time.java
[root@jenkins test]# git push origin master #推送到远程仓库
Counting objects: 5, done.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
6783721..eec82c4 master -> master
在配置完成后,在构建项目时,会带参数
可以选择选项进行构建,点击构建
访问web主机,成功修改页面
******修改gitlab远程仓库的文件内容
[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 6 7月 4 14:46 index.html
[root@jenkins test]# echo "bbbbb1" > index.html #修改为bbbbb1
[root@jenkins test]# git add index.html
[root@jenkins test]# git commit -m "bbbb1"
[master b20929a] bbbb1
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
eec82c4..b20929a master -> master
再次进行构建
测试页面成功推送
查看仓库的commit_id号
右边的都是id号,可以直接复制
复制上一个仓库版本的id号
-通过项目的发布的版本号来回滚
通过发布时备份项目,会有一个版本号,通过版本号来进行回滚
修改一些jenkins项目的配置,在上面的使用commit_id回滚实验的基础上修改
case $status in
deploy)
echo "-----发布前进行打包备份-----"
echo "status:$status"
BACK_DIR=/var/lib/jenkins/workspace
path="${BACK_DIR}/bak"
if [ -d $path ];
then
echo "The files is already exists "
else
mkdir -p $path
fi
cd ${BACK_DIR}/${JOB_NAME}
#${JOB_NAME}=项目名称(test)
#${BUILD_NUMBER}=第几次构建
tar czf ${JOB_NAME}-${BUILD_NUMBER}.tar.gz *
mv ${JOB_NAME}-${BUILD_NUMBER}.tar.gz ${BACK_DIR}/bak
scp ${WORKSPACE}/* root@192.168.100.214:/var/www/html/index.html
echo "Completin!"
;;
rollback)
BACK_DIR=/var/lib/jenkins/workspace
cd ${BACK_DIR}/bak
tar xf ${JOB_NAME}-${version}.tar.gz
scp ${BACK_DIR}/bak/index.html root@192.168.100.214:/var/www/html/index.html
rm -rf ${JOB_NAME}
;;
*)
exit
;;
esac
修改仓库的文件内容
[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 7 7月 4 14:56 index.html
[root@jenkins test]# cat index.html
bbbbb1
[root@jenkins test]# echo "cccccc" > index.html
[root@jenkins test]# git add index.html
[root@jenkins test]# git commit -m "add ccc"
[master e89845c] add ccc
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 2 (delta 0)
To git@192.168.100.202:root/test.git
b20929a..e89845c master -> master
先进行构建
******(1)可以看到项目已经被打包备份了
[root@jenkins test]# cd /var/lib/jenkins/workspace/
[root@jenkins workspace]#
[root@jenkins workspace]# ll
总用量 0
drwxr-xr-x 3 root root 36 7月 5 14:20 aaa
drwxr-xr-x 2 root root 6 7月 5 14:20 aaa@tmp
drwxr-xr-x 2 root root 27 7月 5 14:20 bak
drwxr-xr-x 3 root root 36 7月 4 14:42 test
[root@jenkins workspace]# cd bak/
[root@jenkins bak]# ll
总用量 4
-rw-r--r-- 1 root root 128 7月 5 14:20 aaa-22.tar.gz #这个就是备份的文件
******(2)再次修改仓库文件内容
[root@jenkins bak]# cd
[root@jenkins ~]# cd test/
[root@jenkins test]# echo "dddddd" > index.html
[root@jenkins test]# git add index.html
[root@jenkins test]# git commit -m "add ddd"
[master 5b934c3] add ddd
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
e89845c..5b934c3 master -> master
再次进行构建
这次进行回滚,回滚上一个,上一个的项目序列号是22
通过版本号发布完成!
(6)Jenkins添加邮件报警
-设置管理员邮箱
-配置项目
#注释
①Disable Extended Email Publisher:勾选后,邮件就不发送,看自己的情况喽,如果你想调试某些东西,又不想发邮件出去就可以勾选这个。
②Project Recipient List:收件人地址;多个收件人邮件地址用逗号进行分割;想使用全局默认配置的话,可以使用$DEFAULT_RECIPIENTS。
③Project Reply-To List:允许回复人的地址;想使用系统设置中的默认值的话,可以使用$DEFAULT_REPLYTO;
④Content Type:邮件文档的类型,可以设置HTML等格式;
⑤Default Subject:默认主题,也就是邮件标题;同理可以使用$DEFAULT_SUBJECT
⑥Default Content:默认邮件内容;这里是关键;
⑦Attach Build Log:发送的邮件是否包含日志;
下面几个默认就好,最后一个Triggers非常关键;
假设最后一个不改的话,邮件是接收不到的,这个是官方留下的一个大坑,一定要自己再添加一个Recipient List。
#需要在“增加构建后操作步骤”添加的
E-mail Notification
Editable Email Notification
此时只需要构建项目时出错,就会发送邮件
收到邮件是这样的,其实就是构建时控制台的输出结果
(7)Jenkins远程管理部署节点
Jenkins远程管理的方式有三种:
- Shell ssh(免密)
- SSH Plugin (插件)
- ansible或saltstack
-Shell ssh的方法
-
Jenkins在项目构建时,其实就是使用了Execute Shell直接对远程主机操作,同步了代码到目标主机上,并且可以对远程主机进行操作
-
下面直接修改项目的配置来达到效果
这里先把脚本删除,然后直接写两行命令,修改204web主机的网页页面
直接进行构建即可,无需管选项,因为已经把脚本删除了
成功构建成功
页面成功修改,并且收到了邮件,这是因为上面做的邮件报警功能
-SSH plugin的方法
第二种方法是使用SSH的插件,SSH plugin over ssh
修改项目配置
在web主机上去掉jenkins主机的公钥
******(1)删除密钥
[root@apache ~]# cd .ssh/
[root@apache .ssh]# ll
总用量 4
-rw------- 1 root root 398 7月 1 00:42 authorized_keys
[root@apache .ssh]# rm -rf *
[root@apache .ssh]# ll
总用量 0
******(2)在jenkins主机测试
[root@jenkins ~]# ssh root@192.168.100.204
root@192.168.100.204's password: #需要输入密码就是删除密钥成功
在jenkins主机上点击构建,进行测试
利用SSH插件的方法实验成功!
-Jenkins配合Ansible的方法
******(1)在jenkins上安装ansible
[root@jenkins ~]# ll
总用量 605968
-rwxr-xr-x 1 root root 114 7月 4 14:50 aaa.sh
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
drwxr-xr-x 3 root root 4096 7月 5 15:39 ansible #上传ansible的yum库
-rw-r--r-- 1 root root 8842660 7月 2 09:29 apache-maven-3.5.4-bin.tar.gz
-rwxr-xr-x 1 root root 274 7月 2 19:05 bbb.sh
-rw-r--r-- 1 root root 6 7月 5 15:03 index.html
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x 6 root root 99 7月 2 09:29 maven
-rw-r--r-- 1 root root 122904706 7月 2 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r-- 1 root root 241319636 6月 30 23:49 plugins.tar.gz
drwxr-xr-x 3 root root 20 7月 2 09:34 sonatype-work
drwxr-xr-x 3 root root 36 7月 4 14:46 test
[root@jenkins ~]# vim /etc/yum.repos.d/centos.repo #修改yum文件
[aaa]
name=aaa
baseurl=file:///mnt
enabled=1
gpgcheck=0
[ansible]
name=ansible
baseurl=file:///root/ansible
enabled=1
gpgcheck=0
#保存退出
[root@jenkins ~]# yum -y install ansible
。。。。。。
完毕!
******(2)测试Ansible
[root@jenkins ~]# cd /etc/ansible/
[root@jenkins ansible]# > hosts
[root@jenkins ansible]# vim hosts
[web]
192.168.100.204
#保存退出
[root@jenkins ansible]# ssh-copy-id 192.168.100.204 #重新给web主机上传公钥
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.204's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.100.204'"
and check to make sure that only the key(s) you wanted were added.
[root@jenkins ansible]# ansible web -m ping #测试ping模块
192.168.100.204 | SUCCESS => {
"changed": false,
"ping": "pong"
}
******(3)新建一个测试目录和测试的剧本
[root@jenkins ansible]# cd
[root@jenkins ~]# mkdir -p /data/ansible-playbook
[root@jenkins ~]# vim /data/ansible-playbook/jenkins.yml
---
- hosts: web
remote_user: root
gather_facts: no
tasks:
- name: 创建一个目录
file: path=/root/abc state=directory
#保存退出
[root@jenkins ansible-playbook]# ansible-playbook -C jenkins.yml #测试剧本
PLAY [web] ******************************************************************************************************************************
TASK [创建一个目录] ***************************************************************************************************************************
changed: [192.168.100.204]
PLAY RECAP ******************************************************************************************************************************
192.168.100.204 : ok=1 changed=1 unreachable=0 failed=0
配置jenkins,安装Ansible、Ansible Tower两个插件,同样的下载失败就手动下载
新建任务进行测试
查看执行成功的控制台,可以看到和剧本的输出信息一模一样
#在web主机上验证效果
[root@apache ~]# ll
总用量 186328
drwxr-xr-x 2 root root 6 7月 6 00:01 abc #成功创建
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 9417469 7月 3 02:08 apache-tomcat-8.5.16.tar.gz
-rw-r--r-- 1 root root 6 7月 5 23:30 index.html
-rw-r--r-- 1 root root 181367942 7月 3 02:02 jdk-8u91-linux-x64.tar.gz
Jenkins配合Ansible成功!!!
(8)Jenkins集群
-
在业务量逐渐增大时,单台的jenkins进行自动化构建部署显然是不够灵活的,所以就引出的jenkins集群
-
jenkins集群并不是像web服务器、mysql集群那样做一些负载均衡和高可用,jenkins的集群只是去增加工作节点增加效率,并且jengkins的集群无需在额外的主机安装jenkins,只需要安装jdk即可,但是对于java项目来说,要使用集群功能就需要安装maven了
-
使用Jenkins集群需要安装的插件有:ssh、ssh agent、ssh build agents
-
添加节点之前需要先和Jenkins主机同步时间
-为节点主机和jenkins同步时间
增加一台主机作为Jenkins的节点:node1,ip:192.168.100.205,两块网卡,一块桥接网卡
******(1)在Jenkins安装ntpdate服务向阿里云同步时间
[root@jenkins ~]# yum -y install ntpdate
。。。。。。
完毕!
[root@jenkins ~]# ntpdate ntp1.aliyun.com
6 Jul 17:21:03 ntpdate[1582]: adjust time server 120.25.115.20 offset -0.000628 sec
[root@jenkins ~]# cat .ssh/id_rsa #先查看jenkins主机的私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA3FIIZI24n+7xRc5lH3lmqJ9PPlQxd9eLIvBWtMaJxN3RW6X6
9bc0i5pXWrpY/MgcF777Uu1yiVLoeeIKoEMnKK/09WqX8nz0ix7QqHmVmM2wArn5
vaXpyggNFEpGME5DkFPR6Tsde6fOZwTusnaOl89JfFATar6Mu/7Tu5iLJXIoJ4/q
+poLJE8QqDpPbo8A0kN0Jn4S5nP+weMBklnJbxE2ckRsm/IN68nu/ten6TxDaatW
GsHqIjQMrXW/iGQVY4HSE9JNj1YIFXWMZ7aANCLpQmMKJU9SnIyZZXEpuOyB7Qy+
CfAIDxjvGV3+6CTPrzLWUYh5VEYy5UM23AJzoQIDAQABAoIBAQCcVtW/zNVLIDoz
Z89YM0SGuW149DOaL+h6pYNRimTuvty2JSTdQeDWg3IjXoKQ9csBirM62GXjTmLL
Qnx51s0t0RaJI9eo6cR6CCbWtlhScvrIJII0ckxg4a+uSzpdQtwsyV32G83DFoOf
lN9w4jIzRZOG1CfDIm4pZR2ITCnJKlRv+hL4gGDTEh3oFQHMJZwxA6qiwXqmRxJ+
jUNP9S2LHl2Zsz3QwTHCsdHUoJisLz348M9bjia5Kn7i/kJONdk3inxBTWhxX9sA
j/GDTO++H4bklRgtJuB+hL7wpYuL5T/dK0VShtWTZVQQZTycPNsmBEf6XYYx37K2
07ZRyCjBAoGBAPNBuWYP1RgIShVBaQsEXjWdP+4orN9cDvvueMKroCkg7QGv2m0v
SDmpKWkhLNurnd3QoqyW1Q1w0+iw1QOKmjmHxo95tu3ieNAQ5TOK8fAiEA996zpC
DiADVjo0qMrUncf1taWCytmhSu0kPDOVsniy8BMlJdzTlgL5QJ+G55NJAoGBAOfc
trZ9b9gI0bBG2Jx9khmY54RZReaJF2q21eR75YTB9myh9AWZ0a+7KukJoay7hk6b
2n3tKx05RV1xbXYM7QKQ2f6Xbvcc8gZbW6viWkrst3ic57stZ2F7Bdg6Q8gH4Wy8
vExvAutE8A7GMlHOjKfx6NByhj8I5jJoPWA84wWZAoGBAOn+AdokRqXsa17Q4btg
Q0MtdS6hX9EnW56JgQ45S0Hk0zb5MpIuljoo95WR/PV9usiBBcog+OYJ7z14xB64
96t5aM3glc90NyRl7CPNdva3vV05kckjezTeINayit848GFFgKqqCniXx1wfq+0v
BVNHRNoVtLsbqMRJgRkzCpVJAoGBAJDjCkYFInPUJvxJeShpC3f1ZY79nkGOH1Tv
Bb/ucCFCd3OwzGUHltGCWzEedKoU0Lukhqc0IkHzvNXEgItJTn3Q+HgwNwYyT0cL
pcBGBPhW7dtv6Rq9J6Hxl1hkKGECE6q4Uc5NfHx6KqyAy4b1VE3KTBqdxifzrq2H
F/tgcNjZAoGBAMoF+HmoroSp0obSTn/CHK15wF7aZBB6clA9d0Ezz63PAd2yLMe3
dMfTpRHVKcMiDrCeYVj/XNjwhA+GXexq4h1WgGBBHuiRwiFP67p5p4Jlad7t6qP9
pnh+oFpRclAmJEJwkj45u5J8oUFeQ7AztILU3qWFMpaYoYLYSdAbkdQR
-----END RSA PRIVATE KEY-----
[root@jenkins ~]# ssh-copy-id 192.168.100.205 #传输公钥到node1主机
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.100.205 (192.168.100.205)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.205's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.100.205'"
and check to make sure that only the key(s) you wanted were added.
[root@jenkins local]# scp -r java root@192.168.100.205:/usr/local/ #传输java到node1
******(2)在node1主机安装ntpdate同样也向阿里云同步时间
[root@Centos7 ~]# hostnamectl set-hostname node1
[root@Centos7 ~]# su
[root@node1 ~]# yum -y install ntpdate
。。。。。。
完毕!
[root@node1 ~]# ntpdate ntp1.aliyun.com
6 Jul 17:20:44 ntpdate[1162]: adjust time server 120.25.115.20 offset -0.001442 sec
[root@node1 ~]# mkdir jenkins #创建节点目录
[root@node1 ~]# echo """
> 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 """ >> /etc/profile #填加环境变量
[root@node1 ~]# source /etc/profile #使环境变量生效
[root@node1 ~]# java -version #查看java版本
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
-配置jenkins
成功添加节点!,可以看到各节点的硬件地址
-分配任务到节点
可以把之前做的实验的配置先删除,留下git拉仓库文件就行
#在选择限制项目的运行节点时,可以使用正则来筛选,例如node* 等
#选择了限制项目的运行节点后,下面的构建操作等,脚本、剧本之类的都必须在指定的节点中存在才行
******编写node1节点中的aaa.sh脚本
[root@node1 ~]# vim aaa.sh
#!/bin/bash
scp /root/jenkins/workspace/aaa/index.html root@192.168.100.204:/var/www/html/index.html
#保存退出
[root@node1 ~]# chmod +x aaa.sh
[root@node1 ~]# ssh-keygen -t rsa #生成密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:mcAmNjk5OUzIQK4FvTJYZdTa4l3RtxWk3LOf1n0lyU4 root@node1
The key's randomart image is:
+---[RSA 2048]----+
|+= +=. . .o. |
|..=+ =. . ...o. |
|.o..%o+ . .ooo |
|=...oB...o .. + |
|.o . o .S E .|
| . . o o=|
| .o=|
| . .|
| |
+----[SHA256]-----+
[root@node1 ~]# ssh-copy-id 192.168.100.204 #传输公钥到web主机
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.204's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.100.204'"
and check to make sure that only the key(s) you wanted were added.
******查看仓库的文件内容
[root@jenkins ~]# rm -rf test/
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git
正克隆到 'test'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 67 (delta 1), reused 60 (delta 1)
接收对象中: 100% (67/67), 7.51 KiB | 0 bytes/s, done.
处理 delta 中: 100% (1/1), done.
[root@jenkins ~]# cd test/
[root@jenkins test]# cat index.html
dddddd
-测试
先看一下204之前的页面
(9)jenkins流水线
在流水线任务项目构建的过程中会通过Pipeline来呈现每个构建阶段的细节信息
-创建流水线任务
-配置流水线任务并且测试
pipeline {
agent any
stages {
stage("Hellp") {
steps {
echo "Hellp world"
}
}
}
}
#有点像剧本,但是是使用pipeline流水线专用的语法来进行构建,stages中可以包含多个stage,stage()中的字符就像是剧本中的name标识,而echo "Hellp world"就是每个name标识执行的命令
-
可以看到执行完成之后会自动生成阶段视图
-
查看控制台输出信息
-通过gitlab来存放pipeline文件
- 先在gitlab上创建存放pipeline的仓库
#在jenkins主机上克隆gitlab刚刚创建的仓库
[root@jenkins ~]# git config --global user.name "Administrator"
[root@jenkins ~]# git config --global user.email "1248873545@qq.com"
[root@jenkins ~]# git clone git@192.168.100.202:root/pipeline-test.git
正克隆到 'pipeline-test'...
warning: 您似乎克隆了一个空版本库。
[root@jenkins ~]# cd pipeline-test/
[root@jenkins pipeline-test]# git --bare init
初始化空的 Git 版本库于 /root/pipeline-test/
[root@jenkins pipeline-test]# vim jenkinsfile
pipeline {
agent any
stages {
stage("hello") {
steps {
echo "hello world"
}
}
}
}
#保存退出
[root@jenkins pipeline-test]# git add jenkinsfile #添加到暂存区
[root@jenkins pipeline-test]# git commit -m "pipeline" #添加到本地仓库
[master(根提交) da10bee] pipeline
1 file changed, 8 insertions(+)
create mode 100644 jenkinsfile
[root@jenkins pipeline-test]# git push -u origin master #推送到远程仓库
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/pipeline-test.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
- 为流水线项目进行配置
- 查看输出信息
- 使用Pipeline Syntax 生成git流水线脚本
有些linux命令在流水线的语法里是不支持的,可以使用流水线自带的工具进行翻译,自动生成相应的语法
-利用流水线发布从gitlab拉取项目进行发布
- 可以使用Pipeline Syntax 先生成要使用的语句
#生成的语法
git credentialsId: 'ae9ffc3a-85f4-49a1-8439-b602ce07f6ce', url: 'git@192.168.100.202:root/test.git'
sh label: '', script: 'scp /var/lib/jenkins/workspace/test/index.html root@192.168.100.204'
#编写jenkinsfile文件
[root@jenkins pipeline-test]# vim jenkinsfile #使用流水线拉下来的仓库还是会拉到workspace目录,目录名称还是项目名称
pipeline {
agent any
stages {
stage("git") {
steps {
git credentialsId: 'ae9ffc3a-85f4-49a1-8439-b602ce07f6ce', url: 'git@192.168.100.202:root/test.git'
}
}
stage("scp") {
steps { sh label: '', script: 'scp /var/lib/jenkins/workspace/pipeline-test/index.html root@192.168.100.204:/var/www/html/index.html'
}
}
}
}
#保存退出
[root@jenkins pipeline-test]# git add jenkinsfile
[root@jenkins pipeline-test]# git commit -m "pip1"
[master 4479c93] pip1
1 file changed, 17 insertions(+), 2 deletions(-)
[root@jenkins pipeline-test]# git push -u origin master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 456 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/pipeline-test.git
9a852c9..4479c93 master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
#重新编写gitlab库中的文件内容
[root@jenkins ~]# rm -rf test/
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git
正克隆到 'test'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 67 (delta 1), reused 60 (delta 1)
接收对象中: 100% (67/67), 7.51 KiB | 0 bytes/s, done.
处理 delta 中: 100% (1/1), done.
[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 7 7月 7 10:02 index.html
[root@jenkins test]# cat index.html
dddddd
[root@jenkins test]# echo "<h1>pipeline</h1>" > index.html
[root@jenkins test]# cat index.html
<h1>pipeline</h1>
[root@jenkins test]# git add index.html
[root@jenkins test]# git commit -m "add 1"
[master 2d6b532] add 1
1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins test]# git push -u origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 252 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:root/test.git
5b934c3..2d6b532 master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
- 构建项目
(10)部署Blue Ocean
等待安装完成即可,也可以手动下载,然后上传文件即可,手动上传需要传二十多个文件