目录
- 一、jenkins简介
-
- 1、jenkins
- 2、CI/CD是什么?
- 二、jenkins的部署
-
- 1、环境准备
- 2、安装jenkins
- 3.更新插件源
- 三、jenkins项目管理配置
-
- 1、项目创建
- 2.定期配置检查gitlab变更
- 3、配置实时监控gitlab变更
- 4、自动构建docker镜像上传到当地仓库
- 5、添加docker交付任务
一、jenkins简介
1、jenkins
JenkinsJenkins是一个用Java开源持续集成工具的编写。跟踪版本控制系统, 并在发生变化时启动和监控系统建设。可在Tomcat等流行的servlet运行在容器中,也可以独立运行。通常与版本管理工具(SCM)、结合使用施工工具。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
- jenkins的优势 (1)在开发环境的早期阶段很容易跟踪错误 (2)提供大量插件支持 (3)能够迭代和改进代码 (4)如果迭代失败,将在集成阶段缓存 (5)更改每个代码,生成自动生成报告 (6)可以通过简单的步骤自动完成maven发布项目
2、CI/CD是什么?
- CI CI(Continuous integration,连续集成)连续集成是指经常将代码集成到主干上(一天多次)。连续集成的目的是让产品快速迭代,保持高质量。在强调开发人员提交新代码后,立即进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原始代码是否能确集成。自动化测试必须在代码集成到主干之前进行,只要测试用例失败,就不能集成。
- 优点 (1)提高开发效率 (2)能快速发现和定位bugs (3)发布更新更快
- CD
- 持续交付 CD(Continuous Delivery, 连续交付)是在连续集成的基础上,将集成代码部署到更接近真实运行环境(类生产环境)的地方,即如果通过代码进入生产阶段,经常将新版本交给质量团队或用户进行评审。连续交付可以看作是连续集成的下一步,它强调软件可以随时交付,无论如何更新。在持续集成的基础上,将集成代码部署到更接近真实运行的环境中。
- 持续部署 持续部署(continuous deployment)是连续交付的下一步,是指代码在评审后自动部署到生产环境中。 可持续部署的目标是代码可以随时部署到生产环境中。可持续部署的前提是测试、构建、部署等步骤。 下图是连续部署和连续交付的区别,即代码检测完成后,连续部署自动部署到生产环境阶段。
二、jenkins的部署
1、环境准备
关闭火墙和selinux的拥有rhel7软件仓库的虚拟机
server1 gitlab仓库(在我的博客git检查如何在使用工具时部署工具) server6 jenkins
2、安装jenkins
jenkins下载地址:
#清华镜像源,选择自己需要的jenkins版本,我在这里下载jenkins-2.319-1.1.noarch.rpm https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
jdk官网下载地址(需注册账号并登录):
https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html
依赖包daemonize下载地址:
http://rpmfind.net/linux/RPM/epel/7/x86_64/Packages/d/daemonize-1.7.7-1.el7.x86_64.html
[root@server6 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.319-1.1.noarch.rpm --no-check-certificate [root@server6 ~]# ls anaconda-ks.cfg jdk11-archive-downloads.html daemonize-1.7.7-1.el7.x86_64.rpm jenkins-2.319-1.1.noarch.rpm jdk-11.0.11_linux-x64_bin.rpm original-ks.cfg
#先安装jdk再安装deamon依靠最终安装jenkins [root@server6 ~]# rpm -ivh jdk-11.0.11_linux-x64_bin.rpm [root@server6 ~]# rpm -ivh daemonize-1.7.7-1.el7.x86_64.rpm [root@server6 ~]# yum install -y jenkins-2.319-1.1.noarch.rpm. #开启jenkins服务 [root@server6 ~]# systemctl start jenkins [root@server6 ~]# systemctl status jenkins.service #查看端口,jenkins使用的8080端口处于开放状态 [root@server6 ~]# netstat -antlp tcp6 0 0 :::8080 :::* LISTEN 17940/java
浏览器访问ip:端口号
#查看jenkins密码将其复制并粘贴到浏览器中的密码框点击继续按钮
[root@server6 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
2916f9b1fb7b430f8b149239c8b080a8
浏览器访问ip:端口号:http://192.168.230.137:8080等待一段时间后进入如下页面 粘贴密码并点击继续按钮
登陆成功点击安装推荐的插件,等待安装完成 安装完成后进入如下登陆页面,先使用右下角的admin登陆 点击保存完成,开始使用jenkins
* 修改登陆密码 点击右上角的admin用户–》设置–》password—》修改并保存
重新登陆jenkins jenkins安装完成
3、更新插件源
在jenkins管理中找到插件管理
[root@server6 ~]# mkdir /var/lib/jenkins/update-center-rootCAs
[root@server6 ~]# wget https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/rootCA/update-center.crt -O /var/lib/jenkins/update-center-rootCAs/update-center.crt
[root@server6 ~]# chown jenkins.jenkins -R /var/lib/jenkins/update-center-rootCAs
查找测试那个源的虚度更快,我这里是华为的源更快,所以将华为的url填入升级站点并提交(插件管理的的高级选项)
[root@server6 ~]# curl -sSL https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/speed-test.sh | bash
Jenkins mirror update center speed test
[Mirror Site]
ustc : https://mirrors.ustc.edu.cn/jenkins/
bit : https://mirrors.bit.edu.cn/jenkins/
tsinghua : https://mirrors.tuna.tsinghua.edu.cn/jenkins/
tencent : https://mirrors.cloud.tencent.com/jenkins/
aliyun : https://mirrors.aliyun.com/jenkins/
huawei : https://mirrors.huaweicloud.com/jenkins/
[Test]
Test File : updates/current/plugin-versions.json
Site Name IPv4 address File Size Download Time Download Speed
ustc 202.141.160.110 12M 0.3s 37.9MB/s
bit 114.247.56.117 12M 2.8s 4.32MB/s
tsinghua 101.6.15.130
tencent 1.82.234.185 12M 8.5s 1.41MB/s
aliyun 219.144.101.239 12M 26s 471KB/s
huawei 124.70.125.167 12M 0.3s 39.0MB/s
查看jenkins的镜像源文件,显示已经更改为华为云
[root@server6 ~]# cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
三、jenkins项目管理配置
1、项目创建
点击新建item,项目名称为project_01,freestyle project,确定 安装gitlab插件,等待安装完成
#安装git
[root@server6 ~]# yum install git -y
#创建密钥
[root@server6 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:jUmCobjZOWwYm44WxPjOsOn95Um7dt+i01oWflZGgUw root@server6
The key's randomart image is:
+---[RSA 2048]----+
| . oE.. |
|o. . o o .|
|+o. . . . . |
|.@ . o + . |
|B.B S .. o |
|oB.. . . o |
|+oo o .+ o |
|o . +.oooo+ |
| . ....=oo=... |
+----[SHA256]-----+
[root@server6 .ssh]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClySE+kPqhu7zx50VVsCzTMAXxj8wgF7jYJljjZhhnlv4Cqzw/v2Rrr5Qtjv21ntppEeTOz6xZmwdF4NdaTwtUf9/izRcBorqK8+yEdEd9ZbcVVdzWFA2E9lmsRu3TuFe0kGmDEwuSHGWQt6fM0n8DJq9eV+u0Q4wnRAf6vf3ClwwPq9oL1dHb5aufiRjrr4Z4reZQC+1GMdsjvXrH/UtjWUTgkbbCktcSrQjVGsNgEmZPWakOdMd3rn4aV6IWqI9G2hmbgZ3LSHcQ3d8G0fhcqCvwt/K6kIHAIqPBm4fE2RyAruLIapTuLo/VEJACvaLzM6YBVS4KywRh/zpk+aTH root@server6
[root@server6 .ssh]# cat /root/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEApckhPpD6obu88edFVbAs0zAF8Y/MIBe42CZY42YYZ5b+Aqs8
P79ka6+ULY79tZ7aaRHkzs+sWZsHReDXWk8LVH/f4s0XAaK6ivPshHRHfWW3FVXc
1hQNhPZZrEbt07hXtJBpgxMLkhxlkLenzNJ/AyavXlfrtEOMJ0QH+r39wpcMD6va
C9XR2+Wrn4kY66+GeK3mUAvtRjHbI716x/1LY1lE4JG2wpLXEq0I1RrDYBJmT1mp
DnTHd65+GleiFqiPRtoZm4Gdy0h3EN3fBtH4XKgr8LfyupCBwCKjwZuHxNkcgK7i
yGqU7i6P1RCQAr2i8zOmAVUuCssEYf86ZPmkxwIDAQABAoIBADBGnVOmzBUEokSe
3+XP432r4k8xXHOL9Nucbw3o0Pp5UYZdbrHxfcCN5ExP8zlMBLXL7CD9AGcnabrD
enJlyhrVEdDtf+GODVwhI6J+acLuN54S3rfIJxes1PgBv4eDiqad1tvAVAI8GqdF
k6tlMG8ueKq0V4KqmMlmWhx97sMW2NNZqj9JMLYiOouE4rq22qqcwG9nVSliYX63
GZgcqCdJRKm/qwiaD8NCtHM78//jDVGSoMpAtjF1YtULqjMram6eVSiaWLISjeOF
+JlkymYNqhjFMgJuuoiB55pw8VCBw20DCAgKh5o0heI4uSpbVAr1UwiO4RgcPx4O
Nk1v1QECgYEA2hPZnzDkjNCb+a7JW0xZ967NXytB4ZL0egZ3es3kesBZhUyjlNds
Gq7R3qxbl8lByHXmF6jf+ciXSKWBAwdcJMk6SAeJHKcIofRJOGIMcTZc0N0Zn4LH
bHEcVoPita2d7PR3ZF+Pz2liimqeZdmN32zg+EC++Rcjr+oWdNhaI2cCgYEAwp1n
e9JdY77JVlLXsgmpg2S9jlTsU0UIiq8pBUyzBetdKrECFST6u1pTXIR+5hrTOsoN
bQ8QsVLb6dICClY2SaACLQZST0nEGUhQPGkIOhznSFFHyrfbJyIbfrVsrxYroD6z
zeOI8tl3gmanq2FpvEARItyEQ1h1RyFlQJc396ECgYEAr4qe+MeQkdEyXK/Xocg5
+2gYJO1bIMr8RGWEM7QcoLrI1MY2Pw+RE4F5qnavW+VDMKvGxXDIqfZP4Mhoqxl3
kJzybxyxwACssEFF1z8FqPQLjo0LnRzWjnIWT4XmLjxNDXpTyNYrmtfH3IeqbW3M
B/dKuErV7wgzT91sqi2lkS0CgYBo7oXFdX91MIFOUgyKqjsD5WVvQMrLewVIAXmU
qe482tK5GgeNbwrhyan40Fe7qesKX7ctfln5wjtgryL6f9F1kRibPjVTGuro1tys
NdWBv+PUUj7rRoabawB4KUoYfVO4axZ3hJ9qkWamoML23Oct4T1cFpoZ1bAmUhNN
6Dr9AQKBgHLxB+zdkUwij0MxSwjKuyl5b/xe1cBaOHYtglMzN8QYWW0pyEK7B3Lp
4LsZcsxfhQ+RgxGsfgGbtEoza/193/xhZgoZ47bKZiueZPPF2GtUBThBXeCv3WRF
ZUmDDnutIGMFXUP1hK3/PZ7VmmV/nqRQBSwU8sHnXQIihzE6MJuV
-----END RSA PRIVATE KEY-----
将公钥上传到gitlab 私钥上传到jenkins 配置demo项目,在源码管理里选择git,输入gitlab的ssh克隆地址,点击添加
选择jenkins,在添加评剧类型里选择SSH Username with private key,描述gitlab ssh key,用户root 选择enter directly,将私有密钥写入key点击添加 Credentials选择root,指定分支与gitlab中分支保持一致
2、配置周期性检查gitlab变更
构建触发器:轮询,指定多长时间执行一次 构建中选择执行shell,写入要执行的命令,点击保存
#切换到jenkins的工作目录,可以查看到仓库中的文件
[root@server6 jenkins]# cd
[root@server6 ~]# cd /var/lib/jenkins/workspace/
[root@server6 workspace]# ls
demo1 demo@tmp
[root@server6 workspace]# cd demo1
[root@server6 demo1]# ls
README.md
[root@server6 demo1]# cat README.md
# demo
[root@server1 demo1]# vim index.html(仅为测试用,内容自己写入就好)
[root@server1 demo1]# git add index.html
[root@server1 demo1]# git commit -m "add index.html"
*** 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@server1.(none)')
[root@server1 demo1]# git config --global user.email "qwe@westos.org"
[root@server1 demo1]# git config --global user.name "qwe"
[root@server1 demo1]# git commit -m "add index.html"
[root@server1 demo1]# git push -u origin main
查看控制台输出,输出成功 设置完成
3、配置实时监控gitlab变更
在menu–》admin–》设置—》网络–》外发请求–》勾选允许webhook和服务对本地的网络请求并保存 在jenkins的demo项目配置—构建触发器—build when…—高级—generate—获得token将其复制 gitlab的demo1项目的设置—webhook 点击addwebhook 在控制台输出中可以查看到改动操作
4、自动构建docker镜像并上传到本地仓库
#编写Dockerfile文件并上传到gitlab
[root@server1 demo1]# vim Dockerfile
[root@server1 demo1]# git add Dockerfile
[root@server1 demo1]# git commit -m "add Dockerfile"
[root@server1 demo1]# git push -u origin main
查看jenkins同样输出成功 jenkins实时同步也能查看到Dockerfile文件 给jenkins所在的主机上安装docker
[root@server6 yum.repos.d]# vim docker.repo
[root@server6 yum.repos.d]# cat docker.repo
[docker]
name=docker
baseurl=http://192.168.230.139/docker/20
gpgcheck=0
[root@server6 yum.repos.d]# yum install docker-ce -y
#将harbor仓库所在主机的docker文件发送给jenkins主机
[root@server4 ~]# cd /etc/sysctl.d/
[root@server4 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server4 sysctl.d]# scp docker.conf server6:/etc/sysctl.d/
[root@server6 yum.repos.d]# cd /etc/sysctl.d/
#修改内核参数并重载
[root@server6 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server6 sysctl.d]# cat docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server6 sysctl.d]# sysctl --system
#将harbor主机上的ca证书也共享给jenkins所在主机
[root@server4 sysctl.d]# cd /etc/docker/
[root@server4 docker]# ls
certs.d key.json
[root@server4 docker]# scp -r certs.d/ server6:/etc/docker/
root@server6's password:
redhat-entitlement-authority.crt 100% 2626 2.1MB/s 00:00
ca.crt 100% 2143 2.5MB/s 00:00
[root@server6 sysctl.d]# cd /etc/docker/
[root@server6 docker]# ls
certs.d
#配置镜像加速器
[root@server6 docker]# vim deamon.json
[root@server6 docker]# cat deamon.json
{
"registry-mirrors": ["https://reg.westos.org"]
}
[root@server6 docker]# systemctl restart docker.service
[root@server6 docker]# ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Mar 22 02:03 /var/run/docker.sock
[root@server6 docker]# chmod 777 /var/run/docker.sock
[root@server6 docker]# vim /etc/hosts
[root@server6 docker]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.230.139 qwe
192.168.230.144 server1
192.168.230.146 server6
192.168.230.147 server4 reg.westos.org
在harbor仓库中上传nginx镜像 jenkins安装docker bulid and publish插件 在demo1项目的配置构建中选择docker build and publish 仓库名称为library/demo1,标签动态获取,使用docker套接字,设定仓库地址,添加jenkins平局提供者 填入如图所示内容 立即构建项目 成功构建,可以查看到控制台输出 在harbor仓库中可以看到library/demo1
5、添加docker交付任务
新建一个名为docker的任务,选择构建自由风格 遇到的问题: 构建时报错显示docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=busybox”: dial unix /var/run/docker.sock: connect: permission denied. 原因是jenkins用户所在组不是docker,查看docker组的id修改jenkins用户的组,重启jenkins服务再次构建成功
[root@server1 demo1]# vim Dockerfile
[root@server1 demo1]# cat Dockerfile
FROM busybox
[root@server1 demo1]# git commit -a -m "update Dockerfile"
[root@server1 demo1]# git push -u origin main