一、jenkins简介
1、jenkins2、CI/CD是什么? 二、jenkins的部署
1、环境准备2、安装jenkins3、更新插件源 三、jenkins项目管理配置
1、项目创建2、配置周期性检查gitlab变更3、配置实时监控gitlab变更4、自动构建docker镜像并上传到本地仓库5、添加docker交付任务
一、jenkins简介 1、jenkinsJenkinsJenkins是一个用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 jenkins2、安装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安装完成
在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中分支保持一致
构建触发器:轮询,指定多长时间执行一次
构建中选择执行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
查看控制台输出,输出成功
设置完成
在menu–》admin–》设置—》网络–》外发请求–》勾选允许webhook和服务对本地的网络请求并保存
在jenkins的demo项目配置—构建触发器—build when…—高级—generate—获得token将其复制
gitlab的demo1项目的设置—webhook
点击addwebhook
在控制台输出中可以查看到改动操作
#编写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
新建一个名为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



