jenkins

时间:2024-01-26 17:05:13

Jenkins

Jenkins用户手册网址:https://jenkins.io/zh/doc/

Jenkins的API获取网址:搭建的master的jenkins的web管理页面URL地址后面再接/user/admin/api/

 

jenkins是什么?

        Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。Jenkins是支持常见的Master-Slave架构的持续集成项目。在jenkins中,Master节点可以用来负责Slave节点的管理、用户提交的Job的配置 以及把Job分发到不同Slave节点上进行运行的调度和管理。Jenkins也提供了REST API的方式供用户或者其它系统来调用jenkins。API有XML API、JSON API以及python API三种不同的表现类型。

      Jenkins上的job任务就会开始“自动编译打包->自动部署->单元测试/代码扫描->自动测试”。

python-jenkins安装

 

Python API相关的帮助信息获取网址:https://python-jenkins.readthedocs.io/en/latest/api.html

Python API参考在线文档:https://python-jenkins.readthedocs.io/en/latest/api.html#jenkins.Jenkins

CI/CD是什么?

         CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。

 

        CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。

 

        Jenkins是一个强大的CI工具,虽然本身使用Java开发,但也能用来做其他语言开发的项目CI。下面讲解如何使用Jenkins创建一个构建任务。 登录Jenkins, 点击左侧的新建,创建新的构建任务。

 

Jenkins.war方式安装

不管在什么操作系统下,我个人首选使用tomcat8中间件作为发布jenkins.war源码发布方式安装搭建jenkins持续集成环境。虽然Jenkins针对每种操作系统有直接安装包,但是其都是必须安装到其服务器上的web发布中间件的发布路径里才可以正常访问,都得依托于web服务器中间件。比如:tomcat的发布web的路径就是在webapps文件夹目录下。

安装Jenkins之前必须保证环境已安装djk和web服务器中间件(tomcat)。

注:安装的tomcat必须要拥有root超级管理员权限,间接的保证jenkins也拥有root权限。如果直接安装Jenkins版本的,建议在root账户下进行安装,因为后期在使用的时候,很多地方牵扯账户权限问题,后患无穷。比如说centos操作系统里直接通过yum安装jenkins的默认权限都是jenkins用户的,有时候牵扯到构建打出来的tag包需要复制到应用服务发布的环境的时候,存在用户权限的问题,所以建议在root账户下载/usr/local目录下使用tomcat中间件去发布jenkins.war包的方式。

Jenkins2.164.1 release以上发布版本在运行时至少需要Java 8及以上版本的支持,即JDK1.8及以上

Ubuntu下安装Jenkins

安装jdk和tomcat请见【linux知识】-【Ubuntu桌面版操作系统】目录下查阅。

第一种简单安装就是将jenkins.war放到/var/lib/tomcat8/webapps目录下发布即可。

去Jenkins官方网站下载war包:http://jenkins.io/zh/download/

 

cd /var/lib/tomcat8

sudo mkdir .jenkins

sudo chown tomcat8:nogroup .jenkins

最后必须重新启动tomcat8服务

service tomcat8 restart

----------------------------------------------------------------------------------------------------------

第二种安装方法就是直接在Ubuntu里通过软件仓库去安装:

这里我们使用Jenkins的官方提供的软件仓库,要使用官方的软件仓库之前必须将软件仓库的秘钥添加到本地

#添加官方软件仓库的秘钥到本地的apt秘钥中
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

将官方提供的软件仓库地址加入到本地的apt软件源中,本地用于存放软件源的文件在/etc/apt/sources.list

#将地址添加进本地的软件源列表
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

更新我们本地的软件源缓存,然后直接安装jenkins

$ sudo apt-get update
$ sudo apt-get install jenkins
启动jenkins

让我们用 systemctl启动Jenkins:

sudo systemctl start jenkins   或者 sudo /etc/init.d/jenkins [start|restart|stop]

由于systemctl不显示输出,您可以使用其status命令来验证Jenkins是否已成功启动:

sudo systemctl status jenkins

如果一切顺利,输出的开头应该显示服务处于活动状态并配置为在启动时启动:

● jenkins.service - LSB: Start Jenkins at boot time

   Loaded: loaded (/etc/init.d/jenkins; generated)

   Active: active (exited) since Mon 2018-07-09 17:22:08 UTC; 6min ago

     Docs: man:systemd-sysv-generator(8)

    Tasks: 0 (limit: 1153)

   CGroup: /system.slice/jenkins.service

现在Jenkins正在运行,让我们调整防火墙规则,以便我们可以从Web浏览器访问它以完成初始设置。

打开防火墙

默认情况下,Jenkins在端口8080上运行,所以让我们使用ufw命令打开该端口:

sudo ufw allow 8080

检查ufw的状态以确认新规则:

sudo ufw status

您将看到流量被允许从任何地方移植到端口8080:

Status: active

To                         Action      From--                         ------      ----

OpenSSH                    ALLOW       Anywhere8080                       ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)8080 (v6)                  ALLOW       Anywhere (v6)

注意:如果防火墙处于非活动状态,则以下命令将允许OpenSSH并启用防火墙:

sudo ufw allow OpenSSH

sudo ufw enable

安装Jenkins并配置防火墙后,我们可以完成初始设置。

注:如果是自己测试使用,可以直接把本机的防火墙禁用即可。

Jenkins配置

打开我们的浏览器输入jenkins的服务器地址,在这里我的是192.168.1.17
http://192.168.1.17:8080
但是有时候这个端口就会被万恶的tomcat占用我们不得不修改jenkins的端口(此时如果你打开的是jenkins此步骤可以省略)
修改jenkins端口

$ sudo vim /etc/default/jenkins
#修改如下内容
HTTP_PORT=8085
#重启jenkins服务
$ sudo /etc/init.d/jenkins restart

首次进入jenkins如要输入密码,密码位置:/var/lib/jenkins/secrets/initialAdminPassword

在终端窗口中,使用cat命令显示密码:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

从终端复制32个字符的字母数字密码并将其粘贴到管理员密码字段中,然后单击继续。

 

插件安装

下一个屏幕显示安装建议插件或选择特定插件的选项:

点击“Install suggested plugins”,即安装推荐的插件:
开始安装插件,安装插件比较慢,要多等一会儿

 

 

 

 

创建管理员账户

安装完成后,系统将提示您设置第一个管理用户。可以跳过此步骤并以admin身份继续使用我们上面使用的初始密码,但我们会花一点时间来创建用户。

注意:默认的Jenkins服务器未加密,因此使用此表单提交的数据不受保护。当您准备好使用此安装时,请按照指南(如何在Ubuntu 18.04上使用Nginx反向代理配置Jenkins SSL:https://cloud.tencent.com/developer/article/1346251?from=10680)

这将保护用户凭据和有关通过Web界面传输的构建的信息。

 

您将看到“ 实例配置”页面,该页面将要求您确认Jenkins实例的首选URL。确认服务器的域名或服务器的IP地址:

确认相应信息后,单击“ 保存并完成”。您将看到一个确认页面,确认“Jenkins准备就绪!” :

单击使用Jenkins开始访问主Jenkins仪表板:

 

没有权限的问题

在Ubuntu下,当执行apt-get install方式安装Jenkins的时候,会自动创建jenkins用户,这是一个没有用户目录的账号。
可想而知jenkins用户肯定是没有什么权限的,所以我们要想办法让jenkins用shuoer账户运行

将shuoer用户添加到jenkins用户组中,让shuoer用户拥有管理jenkins的权限

$ sudo gpasswd -a shuoer jenkins
现在root可以管理jenkins了,我们需要配置jenkins的配置文件让jenkins用shuoer身份运行,配置文件在/etc/default/jenkins
JENKINS_USER=shuoer
JENKINS_GROUP=shuoer

ok,重启jenkins

$ sudo /etc/init.d/jenkins restart
由于jenkins的工作目录在/var/lib/jenkins我们查看下它的所属用户和所属组
这里显然是不对的,由于我们把jenkins的默认运行用户改成了shuoer,接着改
$ sudo chown -R shuoer:shuoer /var/lib/jenkins

再重启jenkins

$ sudo /etc/init.d/jenkins restart

ok,没毛病了,开始构建

构建远程服务器

以上都是构建本地,也可以认为是dev环境,假如需要构建test环境怎么办?(假设test服务器在阿里云)
可以借助ssh的强大功能,ssh不仅能登陆远程主机,还可以在不登陆远程主机的情况下让远程主机执行命令,借助这个特性我们可以做很多的事情!比如自动化!等等!
ssh 远程主机用户名@主机地址 "需要执行的命令"(前提是必须要做到免密登录哦)

使用ssh免密登录

配置密钥只需要简单几步:

1、首先准备两台主机,我这使用的是本地的,本机和虚拟机,本机上要安装ssh环境(推荐gitbash)

本机win7,ip:192.168.1.215

虚拟机centos7,ip:192.168.1.196

2、本机上执行命令:ssh-keygen -t rsa,一直回车

会在当前用户目录下创建文件夹 .ssh,

 

3、将公钥文件上传到虚拟机上:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.196

连接上虚拟机后会提示你输入密码

注:ssh-copy-id -i   上传命令

  ~/.ssh/id_rsa.pub  本地电脑上公钥文件路径

  root@192.168.1.196  虚拟机上centos7用户名(root)和主机ip(192.168.1.196)

 

4、根据提示验证。输入ssh root@192.168.1.196,不用输入密码就可登录成功。

 

举个例子:

#这样就可以在不登陆的情况下把远程主机的磁盘使用情况给我们输出出来
ssh shuoer@19.168.1.17 "df -h" 

执行多行命令呢?

ssh shuoer@192.168.1.17 "pwd; df -h; /home/shuoer/shell.sh"

让远程主机执行本地的shell脚本呢?

#前提是你本地得有这个shell.sh脚本
ssh shuoer@192.168.1.17 < shell.sh 

ok,我们新建一个构建远程服务器的任务