Jenkins的使用
系列文章
- Jenkins使用
- Jenkins插件使用
- Jenkins具体代码
简介
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java
程序。
链接
使用
安装
从官网下载最新的LST版本,下载完进行安装。
选择启动程序的安装路径
选择登入身份
选择需要的端口
选择相应的JDK根路径
选择默认选项
安装完成
- 使用Window的Jenkins服务,在后台自动运行,服务的数据路径就在
C:\ProgramData\Jenkins\.jenkins
里面- 情况1,安装后自动启动Jenkins服务。
- 情况2,未启动Jenkins的服务,需要查看启动失败的log,就是在启动程序的安装路径下的
jenkins.err.log
,查看后修复相应的bug,在手动启动下Jenkins的服务即可。
- 使用命令行启动Jenkins,服务的数据路径就在
C:\Users\登入账号\.jenkins
里面。
修改Jenkins服务的数据路径1
- 先停止Window的Jenkins服务,打开启动程序的安装路径下的
jenkins.xml
,里面会有%ProgramData%
路径,这个指向的就是C:\ProgramData
路径(可能使用Jenkins的版本不同,这个环境变量可能不同,可能会是%LocalAppData%
,这个指向的就是C:\Users\登入账号
路径),将该环境变量更改到你想要的目标文件夹,就可以修改Jenkins服务的数据路径。如果已经生成了Jenkins服务数据,就直接剪切到更改的目标文件夹就行。 - 以下是我个人的设置:
设置登入身份
- 需要与WindowServer则需要对Jenkins服务更改用户:
-
控制面板搜索服务 -> 点击查看本地服务 -> 在右侧找到Jenkins,右键属性 -> 登入 -> 此账号 -> 选择一个账号 -> 重启服务
设置签证
- 在Jenkins使用远程登入或者SSH/FTP进行传输,需要秘钥或账号密码登入,可以进行设置:
-
Manager Jenkins -> Manager Credentials -> 全局 -> 添加凭证 -> 根据类型选择相应的类型填写
设置agent
-
尽量使用master去做管理,使用agent去做打包。进行设置:
-
Manager Jenkins -> Manager Nodes and Cluds -> 新建结点 -> 输入自己设置的名字,设置Permanent Agent -> 填入远程工作路径(后续打包出来的工作文件夹) -> 填入标签(标识结点的Key) -> 设置启动方式 -> 设置结点属性
设置启动方式:
Window
- 一般使用
Launch agent by connecting it to the master
,- 设置完页面如果有个
Launch
的按钮,点击下载.jnlp的文件(如果无法打开,需要指定启动程序Java Web Start Launcher
,位于%JAVA_HOME%/bin/javaws.exe
),下载后双击.jnlp文件就可以连接master了(在双击不能正常启动时,可以通过cmd命令运行:javaws -wait slave-agent.jnlp
)。千万不用点击打开的JenkinsAgent的File的Install as a server,虽然可以在后台运行,并且可以开机启动,但会修改子节点的用户文件,导致sh调用git命令会读取不到.ssh文件秘钥 - 设置完页面出现
Java Web Start is not available for the JVM version running Jenkins
,应该是JDK的版本不对。可以使用给出的命令行进行启动,先点击agent.jar
下载下来,使用命令行启动。需要开启启动,可以使用Window运行计划之类的。 - 开机启动,在启动文件夹下(运行输入
shell:startup
即可打开)新建bat文件,写下命令行java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dsun.io.unicode.encoding=UTF-8 -jar agetn.jar -jnlpUrl http://localhost:xxxx/jenkins-agent.jnlp -secret xxx -workDir "D:\xxxx"
,具体以节点上的命令行为准,在开机时就可以自动开启。
- 设置完页面如果有个
Mac
- 一般使用
Launch agent via SSH
, 填入启动目标机器的ip和启动用户凭证, 设置完就会自动连接。如果连接不了,应该是Mac没有设置远程登入的权限,点击设置->共享->开启远程登入->设置允许访问为所有用户(Jenkins是会自己生成一个客人用户,但指定时并为找到,所以设置为所有用户)。这样就是可以连接了。
- 一般使用
设置系统属性
- 查看系统属性:
master:Manager Jenkins -> System Information
agent:Manager Jenkins ->Manager Nodes and Cluds->选择需要查看的agent->系统信息
Jenkins时使用JAVA, 那编码也会使用默认设置的编码,那可能会导致读取中文文本,会出现乱码,则需要设置启动时的编码设置:文本内的编码设置
file.encoding=UTF-8
, IO上的编码设置sun.io.unicode.encoding=UTF-8
。可以直接设置为系统环境变量,也可以在启动程序的安装路径下的jenkins.xml
启动war时进行设置,以下是我个人在master中的设置:
如果使用agent,应该也要在启动代理的jar时进行设置。以下是我个人启动agent的命令行:
使用Java命令要在模块前面加 D , Window使用PowerShell要在调用模块加引号,使用CMD就不需要引号
使用Shell
- 设置Shell命令执行程序,方便多平台agent的兼容 。
- 在Window平台下,我使用的是Git上自带的sh.exe工具,路径一般在
git根目录/bin
和git根目录/usr/bin
里面,将该路径放入系统的环境变量中(非Jenkins的全局环境变量,设置好像没有效果),设置完记得重启下Jenkins,这个方法对于master和agent都适用。 - 在Mac平台下,自带命令工具,master和agent都不需要设置。
- 在Window平台下,我使用的是Git上自带的sh.exe工具,路径一般在
使用Git等工具
- 需要master先设置工具路径:
-
Manager Jenkins -> Global Tool Configuration -> 设置需要工具的启动的路径
- agent在不同电脑上要重新设置工具路径:
-
Manager Jenkins -> Manager Nodes and Cluds -> 选择agnet -> 配置从结点 -> Tool Locations -> 设置需要工具的启动的路径
- 如果agent上没有显示工具的名称,则是没有在master上先配置。
插件使用2
- 使用内容可能过多,便拆开来写,点击链接可以进行跳转
构建
-
新建Item ->选择需要的项目模板
- 构建完就可以进行写入相应的命令或者脚本进行搭建简单的集成构建工具了。
执行命令行
构建时选择Freestype project
或者构建一个多配置项目
就可以直接使用命令行进行构建了。
- 设置启动参数,点击
This project is parameterized
就是以在启动构建时配置参数了 - 设置构建的Agent
- 构建命令,在
构建
选择Execute shell/Execute Window batch command
就可以执行命令行了
- 构建后的操作,例如ftp上传或者构建另外一个项目,可以在
构建后操作进行
选择,构建另外一个项目,则改项目的参数是不会传入下一个项目的,需要另外下载插件支持
执行Pipeline3
构建时选择Pipline
或者多分支流水线
就可以直接使用命令行进行构建了。
- Pipeline的定义被写在一个文本文件中,该文件可以被提交到项目的源代码的控制仓库。 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。
- Pipeline使用的是Groovy4,将整个构建流程用脚本或者是声明进行定义。
- 声明式Pipeline
pipeline { agent any stages { stage('Build') { steps { // } } stage('Test') { steps { // } } stage('Deploy') { steps { // } } } }
- 脚本式Pipeline
node { stage('Build') { // } stage('Test') { // } stage('Deploy') { // } }
- 界面上的所有配置都可以使用Pipeline进行声明
- 构建参数,定义在 pipeline 之前,定义完会在第一次构建后显示构建参数,在pipeline块中使用为:
${params.变量名}
,以下面示例为例即为${params.CHOICE}
properties([ parameters([ //下拉选择 choice( choices: ['1','2'], description: '选择1和2', name: CHOICE ) ]) ]) pipeline { ... }
- 环境变量5,定义在pipeline里面
- 设置环境变量,有三种方法:1.在environment {}中声明
变量名=变量值
;2.在script {}块中env.变量名=变量值
进行设置;3.使用withEnv(["变量名=变量值"])
进行设置 - 使用环境变量,只有一种:
${env.变量名}
- 覆盖环境变量,有两种方法:1.在script {}块中
env.变量名=变量值
进行覆盖,但只能覆盖在script {}中设置的变量,使用environment {}声明的变量无法覆盖;2.使用withEnv(["变量名=变量值"])
进行覆盖,可以覆盖任何形式声明的变量
pipeline { agent any //在最外面设置环境变量 environment { FOO = "bar" NAME = "Joe" } stages { stage("Env Variables") { //在stage里面设置环境变量 environment { NAME = "Alan" // overrides pipeline level NAME env variable BUILD_NUMBER = "2" // overrides the default BUILD_NUMBER } steps { echo "FOO = ${env.FOO}" // prints "FOO = bar" echo "NAME = ${env.NAME}" // prints "NAME = Alan" echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 2" script { //在script里面设置环境变量 env.SOMETHING = "1" // creates env.SOMETHING variable } } } stage("Override Variables") { steps { script { //env.XXX 可以覆盖在script中声明的变量,但无法覆盖在environment{}块中声明的变量 env.FOO = "IT DOES NOT WORK!" // it can't override env.FOO declared at the pipeline (or stage) level env.SOMETHING = "2" // it can override env variable created imperatively } echo "FOO = ${env.FOO}" // prints "FOO = bar" echo "SOMETHING = ${env.SOMETHING}" // prints "SOMETHING = 2" //在steps 里面使用withEnv设置环境变量,如果已经定义了变量可以覆盖任何声明的变量 withEnv(["FOO=foobar"]) { // it can override any env variable echo "FOO = ${env.FOO}" // prints "FOO = foobar" } withEnv(["BUILD_NUMBER=1"]) { echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 1" } } } } }
- 设置环境变量,有三种方法:1.在environment {}中声明
- 其他,剩下的一些声明可以从
流水线语法
中获取,或者是插件的文档中获取。 - 使用
Pipeline script from SCM
,就是将流水线的脚本放到git管理,会在执行的时候将远程库都会拉取一遍,运行指定的Pipeline script。其他的和使用Pipeline script
完全一致
- 构建参数,定义在 pipeline 之前,定义完会在第一次构建后显示构建参数,在pipeline块中使用为:
具体打包代码
Docker的使用
- 暂无使用