zoukankan      html  css  js  c++  java
  • jenkins使用

    Build great things at any scale.

    快速上手

    1. 安装jenkins
    2. 使用jenkins

    起源

    一个项目比较完整的生命周期该是怎样的?

    由开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用阶段

    而现代化的测试阶段并不是从coding结束后开始,而是和coding同步进行的,今天上午coding完成一个功能,下午就要投入测试

    如何测试呢,也就是将开发者完成的代码,拉取到服务器A(一般是linux)上,按照开发者的部署文档搭建各种依赖服务(可能是mysql,redis,kafka等等),然后运行代码编译后的文件或者是运行脚本

    如果我们测试得出开发者今天完成的新功能存在问题,我们需要提出bug,然后开发者解决这个bug,解决完之后呢?

    如果开发者在bug解决文档中没有说明是依赖服务出现了问题导致的这个bug,那么A机器上的依赖服务我们是不用重新搭建的,无非就是启动和停止.

    变化的往往都是开发者的功能的代码部分.对于java coder,一般是将开发者在git的指定分支上的代码pull下来之后编译打包,然后替换掉A机器上的编译后的包,重启服务,继续测试

    每当需求发生变化,功能需要改进,bug等等问题的时候,代码就会发成变化,而将这种变化需要我们在测试机器上得以体现,可能就是替换代码包之类的,这个过程重复而且繁杂,也容易出现部署失误,这种需求背景下产生了自动化持续构建的概念.

    而jenkins正是贯彻和发扬了这一理念的持续构建工具

    The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.

    领先的开源自动化服务,jenkins中提供了众多的插件以支持使用自动化的方式构建和发布任何工程.

    本文作者同大家一起开始步入jenkins的镜像世界,一步一步,深入jenkins,从入门到精通,从使用到理解掌握

    为什么选择jenkins

    既然都是为了实现自动化持续构建,难道就jenkins这一个选择吗

    通常我会使用百度指数,在涉足一个新的领域的时候帮助我了解这个领域哪些将会是趋势,哪些只是残留

    百度指数只能反映国内的一部分情况,以后会加入google指数来反映国外的情况.

    hudson/jenkins

    hudson是jenkins的前称

    jenkins 2012-2019百度搜索指数趋势图

    hudson的趋势数量级在百,忽略不计

    TeamCity
    TeamCity是jet大脑的出品,百度搜索指数还未收录

    Travis

    Travis CI是最老的托管解决方案之一

    其他

    其他有如gitlab ci,bamboo由于存在关键词意义重叠的情况,目前还没有想到比较好的解决方案,这次不加入比较.

    结论

    从上面的趋势图中无论是基数还是趋势,jenkins的学习性价比对比travis要高许多.

    当你选择了一种语言,意味着你还选择了一组技术、一个社区

    从二次开发的角度来看,jenkins开源,而且使用的语言是java,使用的框架为spring,两者分别为国内语言社区和框架社区中的顶级社区,发展的特别的好.

    使用

    我们将使用jenkins完成三个最为重要和基础的功能

    1. 拉取远程git库代码到本地
    2. 使用编译工具本地编译拉取到的代码
    3. 将编译的结果部署到指定的机器上

    拉取远程git库代码到本地

    主界面是这样的

    为了规整,我们可以先创建一个文件夹(目录)

    点击new任务,出现

    点击文件夹,然后在输入框中输入文件夹的名字,后点击ok后进入了文件夹属性配置界面

    不管这个界面,点击左上方的jenkins图标回到jenkins主页

    发现此时多了一个文件夹

    点击进入

    点左上方的New item
    和之前的new 任务页面类似

    点击构建一个自由风格的软件项目
    在输入框输入这个自动化任务的名称

    点ok之后进入配置界面

    在这个配置界面下拉到Source Code Management,点击选中git

    在Repository URL中输入需要maven构建的代码的仓库地址

    Branch Specifier中输入需要构建的分支的名称,/master表示构建分支名为master,/你的分支的名字

    接下来需要认证这个仓库,点击Credentials右边的add

    出现了下拉,一个是jenkins,一个是我们的文件夹名称(githubTasks)
    我们选择文件夹名称

    在弹出的窗口中类型选择为Username with password
    然后输入你的登录到git仓库的用户名和密码

    然后点击添加,在Credentials的无 下拉,有我们刚刚添加的账户

    点击最下方的Save,完成这个自动化构建任务的第一步,拉取远程git库的代码到本地(jenkins所在服务器,docker的话就是docker的容器内部)

    我们可以看到是否拉取成功,回到这个界面

    点击进入

    坐下方的Build History里面有一个 #1
    点击进入

    点击左侧栏的Console Output进入

    注意这个位置是导航栏,这里我们可以随意跳转到主界面,文件夹界面或者是任务界面
    jenkins是主界面,githubTasks是文件夹
    compileGithub是任务界面

    我们点击compileGithub进入任务界面
    点击workSpace

    进入到了这个界面,里面可以看到我们的拉取的代码

    可以看到这个界面的标题节点master上的工作空间,在之后的将代码编译后的成品发布到任意指定机器上的那部份,我会对节点,加以解释,现在这个节点master值得就是jenkins所在的这台机器.

    上面的工作完成了将代码从远程git仓库拉取到本地,接下来需要在本地编译这些代码

    引申

    如果我经常需要拉取不同的分支的代码,也就是分支这个字符串,是经常需要改变的,难道我每次都要修改任务配置中的Branch Specifier吗?

    让我们返回到jenkins主页,这儿需要加入一个git参数动态化的插件

    主页中点击系统设置,点击插件管理
    然后点击Available
    filter 中输入:git parameter

    筛选出来的插件中勾选 Git Parameter
    点击install without restart之后

    等到Git Parameter 图标为 Success即ok

    点击Go Back to the top page,回到首页

    点击导航栏任务compileGithubCode,没有的话先进入文件夹githubTasks,然后从这里点击compileGithubCode进入任务
    点击左侧的Configure
    进入到了任务的配置界面

    找到并勾选参数化构建过程

    下拉选择Git Parameter

    在name中为这个分支字符串变量起个名字,以后用$获取

    Parameter Type下拉选择branch

    点击左下角save

    这时候我们发现任务左侧边栏的开始构建没有了,取而代之的是Build With Parameters

    点击Build With Parameters转到界面

    这个列表会罗列出该git仓库的所有分支,我们选择点击选择一个,然后点Build就好了

    使用编译工具本地编译拉取到的代码

    得到了远程库的代码,现在要在本地编译这些代码

    java coder的话,使用maven编译打包

    这个时候就要添加maven这一全局工具了

    注意: 接下来是自动的在jenkins机器上安装了一个maven,但是如果你原本项目的maven编译依赖着.setting.xml中配置的maven私服或者是proxy代理的话,还需要别的操作,最粗暴不过进入到jenkins所在机器(这里是docker的容器内部),找到并配置maven的setting.xml

    导航栏点击jenkins进入到主界面

    点击左侧系统管理进入到了

    点击全局工具配置,然后下拉到

    点击add maven
    在name中输入你给它起得名字,这里起了名字maven36来标识他是3.6.0版本

    点击左下角的Save

    然后回到了主界面,点击jenkins,点击文件夹githubTasks,点击任务compileGithubCode

    点击左侧Configure

    其实可以注意到,这里也有导航栏

    我们点击Build
    然后点击add build step

    选择 执行顶层Maven目标

    出来的界面中
    maven version 中下拉选择我们上一步在系统设置的全局工具配置中起得maven名称
    Goals部分大部分都是clean install,clean package之类的maven编译命令

    点击左下方save,ok

    回到任务compileGithub界面,点击左侧立即构建

    看到了左下方build中标志着任务正在进行中的闪烁的图标

    点击这个#3,进入到日志界面

    我们在系统设置的全局工具配置中配置了如何下载maven等,但是实际上它是类似于单例模式,在第一次运行的时候初始化,以后都能使用

    由于没有配置中央仓库为国内maven镜像库,而且是maven第一次构建,所以我这里构建的特别慢,花了将近15min

    构建完成后的日志

    构建完成之后我们进入任务界面compileGithubCode

    点击workspace
    进入到jar产生的target目录,发现成功编译得到了jar文件

    但是以后比如别的人想从网页上下载这个编译好的jar,能不能直接从页面上下载下来,当然可以,点击这个jar就会下载下来

    但是我们要明白这个任务的目的是什么,其实就是得到这个编译后的成果,过程怎么样是没人关心的,也就是这个任务应该对外完美暴露它的成功,也就是这个jar,不仅要方便大家从页面上下载这个jar,还有后面的任务可能会从这个任务上拿取jar

    需要添加构建后操作,回到这个任务的配置页面,找到Post-build Actions,下拉选择归档成品

    在Files to archive中填写需要暴露的jar的位置

    位置是可以从任务的工作空间中看到的

    然后我们回到任务主页,点击开始Build with parameter,选择分支,build

    build成功后,我们进入该任务的主页

    发现多了一个Last Successful Artifacts,这样就可以很方便的从页面上下载这个jar,而不用担心忘了编译后的成果在什么文件夹位置的情况.

    注意: 这一步是必备的,不然下面的发布的任务会无法从这个任务中自动化的获取jar

    至此完成了本地编译从远程库pull下来的代码的阶段.

    将编译的结果部署到指定的机器上

    接下来我们需要理解jenkins中节点的概念

    jenkins安装在一台机器,所有的jobs都在这台机器上运行,如果超过太多jobs去运行,会形成等待,节点存在就是解决这个问题提高效率,安装jenkins的机器称为master机,而其它机器就属于master的分支,成为slave;而要利用其它机器用执行jenkins的jobs,则需要一些配置,形成两台机器互通,当然下面的例子你用本机当做slave也是可以的

    从机节点的建立意味着这台从机就是master的一个复刻,master能执行的任务它都能干(master的向从机发送命令这一功能除外)

    也就是完整的发布过程是这样的,master机器访问从机B,向B发送 拉取代码到本地 的命令,master机器做的仅仅是发送命令,然后干别的,等到B将远程代码pull到了B的本地

    本地编译代码的过程也是如此

    而现在我们就是需要从机得到代码,编译,然后在本地执行启动服务的脚,如果是tomcat应用的话(外置),可能是将编译后的war放入webapps下,然后启动tomcat的startup.sh

    那我们先完成第一步,建立从机节点,说白了,就是我作为master,怎么访问从机,用户名加密码也好,ssh认证也好

    建立从机节点

    为了方便用户管理,我们最好不要使用使得master访问从机的root用户,比如这里,我们使用用户jenkins用户

    连接到一台从机(root用户)

    groupadd jenkins
    useradd jenkins -g jenkins
    passwd jenkins
    

    接下来需要输入jenkins用户的密码,要求比较严格,密码要求为至少8位的非简单字符串

    密码定位kinsjen0

    然后我们切换到jenkins用户

    su - jenkins
    pwd
    

    jenkins的~目录在/home/jenkins

    因为jenkins是用java写的后台,需要注意这台从机机器需要有java环境

    which java
    

    得到的路径地址会在后面配置节点信息的时候用到

    接下来我们进入jenkins主页,点击左侧系统管理,然后下拉找到节点管理,点击之后是这样的

    注意到已经有了一个节点master,就是我们安装jenkins的机器,我们点击左边的New Node

    在输入框中输入我们给这个节点机器起得名字
    并勾选固定节点

    切记这里的节点名不能包含中文字符,不然之后的操作会无法识别这个节点,如果已经发现了问题,可以在节点的设置中修改名称.

    点击ok后展开页面

    Remote root directory中输入你的从机的用户的~地址
    也就是我们的从机的jenkins用户的~,/home/jenkins

    然后下拉Usage,切换到 只允许绑定到这台机器的job,Host输入这台节点的ip

    注意,要确保在master机器上能够ping通这个ip

    然后下拉Host Key Verification Strategy,选择Manually trusted key Verification Strategy

    随后点击Credentials右侧的add,点击下拉出现的jenkins,出现界面

    在username中输入节点机器的用户名jenkins,在password中输入这个用户的密码,然后点击添加

    随后在Credentials的下拉中选择我们刚刚添加的用户密码信息

    点击Launch method右下方的Advanced,这里唯一要做的是填写javapath,也就是我们在节点机器上新建用户的时候说道的which java得到的java路径

    注意: 如果ssh端口暴露的是36000,记得这里修改port的22为36000,不然启动日志会报错

    点击左下方Save完成节点的配置.此时跳转到了节点管理界面.

    可以看到此时的节点处于未启动状态,因为启动需要一段时间,主机会将服务的相关代码copy到从机的/home/jenkins下

    可以点击节点 测试机器1jenkins用户,进入后的界面点击启动;也可以稍等一会儿,它会自动去启动,启动成功后可以看到这个节点管理界面发生了变化,这样表示成功建立了节点

    至此完成了从机节点的配置.

    提示: 可以登录到从机机器上,切到jenkins用户,切换到~目录下,ls后可以看到名为remoting.jar和remoting文件夹

    在节点上部署服务

    接下来让我们收货最终的成果,在节点机器上发布应用

    这时候我们需要什么?

    我们需要在从机机器上运行我们的代码编译完成的jar

    那么第一步就是取得我们的jar

    如何取得我们的代码的jar,我们已经在任务compileGithub中得到了远程代码,并编译了它,现在我们需要它的编译结果

    有这么一个插件需要我们添加,来帮助我们在一个新的任务中拉取另一个任务的编译结果

    回到jenkins首页,左侧系统管理,之后点插件管理,filter中输入:Copy Arti

    勾选筛选出来的插件Copy Artifact

    点击install without restart

    Copy Artifact变为success之后

    点击Go Back to the top page,完成插件的添加.

    回到jenkins主页,进入githubTasks文件夹,点击左侧New Item,输入任务名称,比如deployMyCode,然后选择构建一个自由风格的软件项目,点OK

    勾选Restrict where this project can be run,Label Expression中输入我们之前新建的节点的名字,输入了MachineTest1就已经有了提示,选中它

    这样就相当于是会让这个机器执行发布任务

    接下来我们获取之前的任务构建的jar

    然后在Project name中输入我们之前的拉取代码并本地编译的任务名称 compileGitHubCode,

    Artifacts to copy中输入vertx-api/target/*.jar,这个就是我们的任务compileGitHubCode执行完后在工作空间中能找到的jar的位置.

    提示: 这个在前面提到了编译代码厚的保存构建生成物操作

    Target directory中输入packages

    之后我们创建一个shell

    注意顺序,这个添加的shell应该在Copy artifacts from another project的下面

    按道理我们应该在这个shell脚本中执行我们获得的jar,完成类似这样的发布任务的,但是为了熟悉一下这个脚本的执行环境,我们先运行一个简单的脚本

    #!/bin/bash
    
    deploy_testMachine() {
        touch test.log
    }
    deploy_testMachine
    
    

    然后点击左下方的Save,回到了任务的主页面,我们点击左侧栏的立即构建

    点击左下方的#5

    然后点击左侧的Console Output

    可以从日志中发现一些端倪

    Building remotely on MachineTest1UserJenkins in workspace /home/jenkins/workspace/githubTasks/deployMyCode
    

    也就是我们经常说的任务的工作空间实际是:

    /home/jenkins也就是我们的节点用户

    /workspace是我们的所有的工作空间的最上级

    /githubTasks我们之前的文件夹

    /deployMyCode是我们的这次任务

    切入到/home/jenkins/workspace/githubTasks/deployMyCode

    ls
    packages  test.log
    
    cd packages
    ls
    vertx-api
    
    cd vertx-api
    ls
    target
    
    cd target
    ls
    vertx-api-1.0.0.jar
    
    

    这样我们就明白了,这个脚本的执行目录在/home/jenkins/workspace/githubTasks/deployMyCode下,也就是我们的脚本实际上是在这个目录下被执行的

    之后我们回到这个任务的配置界面,将我们的脚本修改为

    #!/bin/bash
    
    deploy_testMachine() {
        java -jar ./packages/*.jar
    }
    deploy_testMachine
    

    然后回到任务主页,立即构建,即可完成类似服务的发布这种

    如果你需要每次删除上次残留在节点中的旧的代码,需要进入到任务的配置,在Build Environment下勾选Delete workspace before build starts即可

    至此完成从编译产物到产物发布的过程

  • 相关阅读:
    module 和 component 的区别
    API、SDK、DLL有什么用?
    app基本控件
    PaaS是什么?
    js回调函数(callback)(转载)
    多语言 SEO
    axure rp 8.0
    整天看用户埋点数据,知道数据是咋来的吗?
    发现恶意ip大量访问 可使用命令进行封禁
    阿里云服务器迁移更改IP,导致网站挂掉
  • 原文地址:https://www.cnblogs.com/selton/p/10338775.html
Copyright © 2011-2022 走看看