文章目录

  • 一、Jenkinx+Gitlab持续集成环境概述
    • (1)什么是CI/CD
    • (2)Jenkins概述
    • (3)Gitlab概述
    • (4)Gitlab和Github的区别
    • (5)Jenkins配合Gitlab持续集成系统的工作流程
  • 二、部署持续集成环境
    • (1)实验环境
    • (2)实验步骤
      • -搭建Gitlab(100.202)
        • -Gitlab的使用
        • -关闭gitlab注册功能
        • -配置gitlab邮件报警
        • -创建一个新群组
        • -创建一个新账户
        • -把新创建的用户加入组
        • -创建一个新项目
      • -搭建Jenkins(100.203)
        • -访问Jenkins并且安装相关插件
        • -安装Jenkins插件
        • -Jenkins升级
        • -配置jenkins使用gitlab更新代码
        • -使用Jenkins创建新项目
      • -将代码发布到web服务器
  • 三、实战项目
    • (1)更新gitlab代码触发jenkins自动部署
      • -配置身份验证令牌
      • -在jenkins上配置触发器
      • -在git项目的配置界面设置链接和token
      • -对web钩子进行测试
      • -更新gitlab中的项目代码
      • -访问web主机
    • (2)实现Build Pipeline插件显示流程图
      • -给aaa项目创建一个视图
    • (3)使用分支进行网站回滚
    • (4)使用jenkins发布tomcat项目
      • -安装Maven
      • -创建Maven私服nexus
      • -到jenkins的web界面上安装git和maven的插件
      • -进入配置阶段
      • -新建jenkins任务
      • -在web主机上安装tomcat
      • -在jenkins中进行构建
      • -报错的解决方案
    • (5)Jenkins回滚
      • -通过commit_id来回滚
      • -通过项目的发布的版本号来回滚
    • (6)Jenkins添加邮件报警
      • -设置管理员邮箱
      • -配置项目
    • (7)Jenkins远程管理部署节点
      • -Shell ssh的方法
      • -SSH plugin的方法
      • -Jenkins配合Ansible的方法
    • (8)Jenkins集群
      • -为节点主机和jenkins同步时间
      • -配置jenkins
      • -分配任务到节点
      • -测试
    • (9)jenkins流水线
      • -创建流水线任务
      • -配置流水线任务并且测试
      • -通过gitlab来存放pipeline文件
      • - 使用Pipeline Syntax 生成git流水线脚本
      • -利用流水线发布从gitlab拉取项目进行发布
    • (10)部署Blue Ocean

本文章达到了一万六千字,有点多,但是比较全

一、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做出来的,并且二者都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化的、云存储的场所

  • 不同点
  1. GitHub如果要使用私有仓库,超过四个是需要付费的,而Gitlab可以在上面创建私人的免费仓库,因为公司可以自己部署Gitlab
  2. Gitlab让开发团队对他们的代码仓库拥有更多的控制,相对于Github,有着不少特色,例如:可以免费设置仓库权限、运行用户选择分享一个项目的源代码、运行用户设置项目的获取权限,进一步的提升了安全性,还可以设置获取到团队整体的改进进度,通过innersourcing让不在权限范围内的人访问不到该资源。开发者还可以把某个代码打上”仍在进行中“的标签来提醒其他成员这个代码没有完成,从而阻止未完成的代码合并到其他的代码中

总的来说,从代码的私有性来看,有时候公司并不希望员工获取到全部的代码,而Gitlab无疑是更好的选择,但是对于开源代码来说,GIthub依然是代码托管的首选

******注释******
git是一个分布式的版本控制器,是一种命令、一种工具,Gitlab和Github都是基于git实现的在线代码托管仓库,不同的是Github是面向互联网开放的,而Gitlab通常都是公司内部网络使用,两者都有网站页面
gitlab-ce是社区服,是免费的,gitlab-ee是企业版,是收费的

(5)Jenkins配合Gitlab持续集成系统的工作流程

  1. 开发者将新版本推送到Gitlab中

  2. Gitlab会触发Jenkins的master主节点(Jenkinx是可以分主从节点的)进行一次建造

  3. 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 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 640204790 630 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 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root  76557595 630 17:35 gitlab-12-0-stable-zh.tar.gz
-rw-r--r--  1 root root 640204790 630 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 112 18:27 anaconda-ks.cfg
drwxr-xr-x  3 root root   32 630 18:57 test
[root@jenkins ~]# cd test/
[root@jenkins test]# ll    #成功克隆仓库
总用量 4
-rw-r--r-- 1 root root 16 630 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 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x  3 root root        32 630 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的用户是root30
。。。。。。
#保存退出
[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 630 23:57 jenkins.war
-rw-r--r-- 1 root root 66239216 528 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: 1Now 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 630 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 71 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 630 16:53 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        32 630 18:57 test
[root@jenkins ~]# rm -rf test/  #删除原来的仓库
[root@jenkins ~]# ll
总用量 477292
-rwxr-xr-x  1 root root        84 630 16:53 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r--  1 root root 241319636 630 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 71 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.Rungit 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 index1 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.gitc1d114b..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 630 16:53 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        36 71 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
* bbmaster
[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 new1 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.git6974052..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 71 17:14 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root   8842660 72 09:29 apache-maven-3.5.4-bin.tar.gz
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        36 71 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 71 17:14 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root   8842660 72 09:29 apache-maven-3.5.4-bin.tar.gz
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x  6 root root        99 72 09:29 maven
-rw-r--r--  1 root root 122904706 72 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        36 71 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/bashsource /etc/profilescp /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 3ssh 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 72 18:19 test
[root@jenkins workspace]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 19 72 18:19 index.html
[root@jenkins test]# rm -rf *
[root@jenkins test]# ll  #传输项目到脚本指定的路径下
总用量 4
drwxr-xr-x 5 root root  97 72 17:56 test1
-rw-r--r-- 1 root root 491 72 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] tomcat20 files changed, 262 insertions(+)create mode 100644 test1/.classpathcreate mode 100644 test1/.projectcreate mode 100644 test1/.settings/.jsdtscopecreate mode 100644 test1/.settings/org.eclipse.jdt.core.prefscreate mode 100644 test1/.settings/org.eclipse.m2e.core.prefscreate mode 100644 test1/.settings/org.eclipse.wst.common.componentcreate mode 100644 test1/.settings/org.eclipse.wst.common.project.facet.core.xmlcreate mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.containercreate mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.namecreate mode 100644 test1/.settings/org.eclipse.wst.validation.prefscreate mode 100644 test1/pom.xmlcreate mode 100644 test1/src/main/resources/com/Time.javacreate mode 100644 test1/src/main/webapp/WEB-INF/web.xmlcreate mode 100644 test1/src/main/webapp/index.jspcreate mode 100644 test1/target/classes/com/Time.classcreate mode 100644 test1/target/classes/com/Time.javacreate mode 100644 test1/target/m2e-wtp/web-resources/META-INF/MANIFEST.MFcreate mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.propertiescreate mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.xmlcreate 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.git6974052..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 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root   9417469 73 02:08 apache-tomcat-8.5.16.tar.gz
-rw-r--r--  1 root root 181367942 73 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  inrollback)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 71 17:14 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root   8842660 72 09:29 apache-maven-3.5.4-bin.tar.gz
-rwxr-xr-x  1 root root       274 72 19:05 bbb.sh
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x  6 root root        99 72 09:29 maven
-rw-r--r--  1 root root 122904706 72 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        20 72 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] aaa121 files changed, 1 insertion(+), 263 deletions(-)delete mode 100644 test1/.classpathdelete mode 100644 test1/.projectdelete mode 100644 test1/.settings/.jsdtscopedelete mode 100644 test1/.settings/org.eclipse.jdt.core.prefsdelete mode 100644 test1/.settings/org.eclipse.m2e.core.prefsdelete mode 100644 test1/.settings/org.eclipse.wst.common.componentdelete mode 100644 test1/.settings/org.eclipse.wst.common.project.facet.core.xmldelete mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.containerdelete mode 100644 test1/.settings/org.eclipse.wst.jsdt.ui.superType.namedelete mode 100644 test1/.settings/org.eclipse.wst.validation.prefsdelete mode 100644 test1/pom.xmldelete mode 100644 test1/src/main/resources/com/Time.javadelete mode 100644 test1/src/main/webapp/WEB-INF/web.xmldelete mode 100644 test1/src/main/webapp/index.jspdelete mode 100644 test1/target/classes/com/Time.classdelete mode 100644 test1/target/classes/com/Time.javadelete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/MANIFEST.MFdelete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.propertiesdelete mode 100644 test1/target/m2e-wtp/web-resources/META-INF/maven/www.linuxfan.cn.new/test1/pom.xmldelete 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.git6783721..eec82c4  master -> master

在配置完成后,在构建项目时,会带参数

可以选择选项进行构建,点击构建

访问web主机,成功修改页面

******修改gitlab远程仓库的文件内容
[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 6 74 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] bbbb11 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.giteec82c4..b20929a  master -> master

再次进行构建

测试页面成功推送

查看仓库的commit_id号

右边的都是id号,可以直接复制

复制上一个仓库版本的id号



-通过项目的发布的版本号来回滚

通过发布时备份项目,会有一个版本号,通过版本号来进行回滚

修改一些jenkins项目的配置,在上面的使用commit_id回滚实验的基础上修改


case $status  indeploy)echo "-----发布前进行打包备份-----"
echo "status:$status"
BACK_DIR=/var/lib/jenkins/workspacepath="${BACK_DIR}/bak"   if [ -d $path ];thenecho "The files is already  exists "elsemkdir -p  $pathfi
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.htmlecho "Completin!"
;;
rollback)
BACK_DIR=/var/lib/jenkins/workspace
cd ${BACK_DIR}/bak
tar xf ${JOB_NAME}-${version}.tar.gzscp ${BACK_DIR}/bak/index.html root@192.168.100.214:/var/www/html/index.htmlrm -rf ${JOB_NAME}
;;*)exit;;
esac

修改仓库的文件内容

[root@jenkins ~]# cd test/
[root@jenkins test]# ll
总用量 4
-rw-r--r-- 1 root root 7 74 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 ccc1 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.gitb20929a..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 75 14:20 aaa
drwxr-xr-x 2 root root  6 75 14:20 aaa@tmp
drwxr-xr-x 2 root root 27 75 14:20 bak
drwxr-xr-x 3 root root 36 74 14:42 test
[root@jenkins workspace]# cd bak/
[root@jenkins bak]# ll
总用量 4
-rw-r--r-- 1 root root 128 75 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 ddd1 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.gite89845c..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远程管理的方式有三种:

  1. Shell ssh(免密)
  2. SSH Plugin (插件)
  3. 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 71 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 74 14:50 aaa.sh
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
drwxr-xr-x  3 root root      4096 75 15:39 ansible    #上传ansible的yum库
-rw-r--r--  1 root root   8842660 72 09:29 apache-maven-3.5.4-bin.tar.gz
-rwxr-xr-x  1 root root       274 72 19:05 bbb.sh
-rw-r--r--  1 root root         6 75 15:03 index.html
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x  6 root root        99 72 09:29 maven
-rw-r--r--  1 root root 122904706 72 09:34 nexus-3.13.0-01-unix.tar.gz
-rw-r--r--  1 root root 241319636 630 23:49 plugins.tar.gz
drwxr-xr-x  3 root root        20 72 09:34 sonatype-work
drwxr-xr-x  3 root root        36 74 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: 1Now 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: webremote_user: rootgather_facts: notasks:- 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 76 00:01 abc   #成功创建
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root   9417469 73 02:08 apache-tomcat-8.5.16.tar.gz
-rw-r--r--  1 root root         6 75 23:30 index.html
-rw-r--r--  1 root root 181367942 73 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.com6 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: 1Now 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.com6 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: 1Now 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 anystages {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 anystages {stage("hello") {steps {echo "hello world"}}}
}
#保存退出
[root@jenkins pipeline-test]# git add jenkinsfile    #添加到暂存区
[root@jenkins pipeline-test]# git commit -m "pipeline"  #添加到本地仓库
[master(根提交) da10bee] pipeline1 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 anystages {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] pip11 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.git9a852c9..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 77 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 11 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.git5b934c3..2d6b532  master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
  • 构建项目



(10)部署Blue Ocean


等待安装完成即可,也可以手动下载,然后上传文件即可,手动上传需要传二十多个文件

CI/CD之Jenkins+Gitlab相关推荐

  1. 手把手教学借助CI做代码格式审查、编译审查 | CI/CD搭建流程 — GitLab篇

    本文分享自中移OneOS微信公众号< CI/CD搭建流程 - GitLab篇>,作者 Kisann. 让GitLab CI/CD做什么 嵌入式软件开发领域高频使用的开发语言是C语言,在大型 ...

  2. kubernetes之CI/CD工具jenkins第二篇,helm的使用

    1. kubernetes之CI/CD第二篇-jenkins结合helm部署应用: 1. 概述:    在前期的博文中我已经初步介绍过kubernetes环境下的CI/CD的使用.主要是jenkins ...

  3. ci/cd heroku_在GitLab上设置CI / CD以在Heroku上部署Python Flask应用程序

    ci/cd heroku Recently I came across a challenge to deploy a Python Flask web application to Heroku. ...

  4. 为 Kubernetes 提供 CI/CD 服务 Jenkins X

    Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins 和 Kubernetes 实现,旨在解决微服务体系架构下的云原生应用的持续交付的问题,简化整个云原生应用的开发.运行和部 ...

  5. CI/CD Python+Jenkins+Sonar qube+GitLab

    使用测试的jenkins.gitlab.测试服务器.测试sonar qube 完成流程创建 1.本地安装git 2.新建git项目 3.push项目到git 4.配置SonarQube Scanner ...

  6. 还在用Jenkins?试试Gitlab的CI/CD功能吧,贼带劲!

    前言 Docker和Spring Boot是非常流行的组合,我们将利用GitLab CI的优势,并在应用程序服务器上自动构建,推送和运行Docker镜像. GitLab CI Gitlab CI/CD ...

  7. Jenkins和GitLab CI/CD:CI/CD工具之战

    持续集成(CI)和持续交付(CD)在过去十年左右时间里取得了长足的进步.DevOps测试的兴起引发了针对CI/CD工具的强烈需求.现有的解决方案一直在与时俱进,无数的新产品或新版本正在进入质量检查领域 ...

  8. 晨光科力普基于GitLab CI/CD持续集成服务的应用

    科力普省心购是晨光文具集团在2019年初为了拓展综合办公物资采购业务成立的B2B电商平台.随着云时代容器技术的火热发展,Docker.Kubernetes等容器化技术越来越受到研发团队的喜爱.因此,省 ...

  9. gitlab ci cd流程

    一.系统资源 Operating System – CentOS 8.0 IP: 172.16.1.252CPU: 2.50GHz * 1 CoreMemory: 1GStorage: 40GHost ...

最新文章

  1. 程序员正在消失!90%的人都不知道,写不出好代码,是输在了这点上!
  2. HCTL-2020正交码读写芯片
  3. 新人新气象,给自己加油!
  4. c++primer 第五版 p205 22题详细解释
  5. IMail邮件服务-1
  6. 第1本书:CCIE Practical Studies, Volume I-第13天
  7. python培训价目表-python培训班费用在多少?
  8. Endurance for Mac(电池续航管理提升工具)
  9. 抖音高贵气质的签名_笑言 | 非主流时期的QQ签名和杜蕾斯文案有的一拼。
  10. 直播APP源码搭建简易直播平台及个人开发直播系统的难点
  11. ps制作计算机考试证件照,如何通过PS制作一寸证件照(超详细流程)?
  12. java math 三角函数_Java中的三角函数
  13. Origin画图技巧之柱状图优化
  14. javaweb之统计网站访问量小案例
  15. 华为工作十年离职感想
  16. [编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)
  17. php配置设置时区,php如何设置时区
  18. “天涯博客”“江西福利彩票网”等网站被挂马
  19. Spring Security 配置白名单访问后,仍然报错403
  20. miui无法降级安装app_小米MIUI放大招!拒绝降级,小米Max3不能降级

热门文章

  1. php性能极限,利用autobench测试web服务器极限并发数
  2. 情绪调节的自适应_自我情绪调节的几种方法
  3. 我和仙女们不可不说的故事-II
  4. 一百零二、Hive——hive设置元数据支持中文显示
  5. 光学AG喷涂镀膜的机械设计
  6. 贵州茅台600519
  7. thymeleaf:字符串Strings常见的使用方法
  8. MySQL必知必会-23MySQL全球化和本地化
  9. pyecharts绘制堆叠柱状图
  10. 你真的了解服务器托管收费标准吗?