Jenkins 快速开始


Jenkins 快速开始

1.1 Jenkins 简介

前身是 Hudson,一款由 java 语言开发的自动化发布工具,目前企业中最普遍使用的项目发布工具,它有以下几个特点:

  • 开源免费
  • 多平台支持(windows/linux/macos)
  • 提供 Web 可视化配置管理页面
  • 安装配置简单
  • 插件资源丰富
  • 主/从分布式架构

Hudson 与 Jenkins 的小故事

Jenkins 的前身是 Hudson,采用 JAVA 编写的持续集成开源工具。Hudson 由 Sun 公司在 2004 年启动,第一个版本于 2005 年在 java.net 发布。2007 年开始 Hudson 逐渐取代 CruiseControl 和其他的开源构建工具的江湖地位。在 2008 年的 JavaOne 大会上在开发者解决方案中获得杜克选择大奖(Duke’s Choice Award)。

在2010年11月期间,因为 Oracle 对 Sun 的收购带来了 Hudson 的所有权问题。主要的项目贡献者和 Oracle 之间,尽管达成了很多协议,但有个关键问题就是商标名称 “Hudson”。甲骨文在2010年12月声明拥有该名称并申请商标的权利。 因此,2011年1月11日,有人要求投票将项目名称从 “Hudson” 改为 “Jenkins”。2011年1月29日,该建议得到社区投票的批准,创建了 Jenkins 项目。

2011年2月1日,甲骨文表示,他们打算继续开发 Hudson,并认为 Jenkins 只是一个分支,而不是重命名。因此,Jenkins 和 Hudson 继续作为两个独立的项目,每个都认为对方是自己的分支。到 2013 年 12 月,GitHub 上的 Jenkins 拥有567个项目成员和约1,100个公共仓库,与此相对的 Hudson 有32个项目成员和17个公共仓库。到现在两者的差异更多,应该说 Jenkins 已经全面超越了 Hudson。此外,大家可能是出于讨厌 Oracle 的情绪,作为 Java 开发者天然地应该支持和使用 Jenkins。

1.2 Jenkins 安装

Jenkins 有多种安装方式,例如:部署 war 包、brew(mac)、rpm、docker 等

1.2.1 rpm 部署

(1)openjdk 安装

首先,确保系统环境中已安装 JDK,这里根据官网选择使用 openjdk 11

$ yum -y install java-11-openjdk-devel
$ java -version
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)

(2)jenkins 安装

软件发布页中选择合适的版本(推荐从国内源下载)

执行以下命令进行安装

$ yum -y install https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.318-1.1.noarch.rpm

此时看下 Jenkins 包中文件都安装到了哪

$ rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins

(3)设置自启并配置

设置服务自启动

$ systemctl enable jenkins
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on

Jenkins 基础配置

$ grep -a1 "修改" /etc/sysconfig/jenkins
#JENKINS_USER="jenkins"
# 修改默认用户
JENKINS_USER="root"
--
#JENKINS_PORT="8080"
# 修改默认端口
JENKINS_PORT="9008"

(4)启动服务并初始化

启动服务

$ systemctl start jenkins
$ systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Sun 2021-10-31 22:10:34 CST; 3min 14s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 5976 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
    Tasks: 39
   Memory: 406.6M
   CGroup: /system.slice/jenkins.service
           └─5980 /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins...
Oct 31 22:10:33 sz-aliyun-ecs-1 systemd[1]: Starting LSB: Jenkins Automation Server...
Oct 31 22:10:34 sz-aliyun-ecs-1 jenkins[5976]: Starting Jenkins [  OK  ]
Oct 31 22:10:34 sz-aliyun-ecs-1 systemd[1]: Started LSB: Jenkins Automation Server.

访问 WebUI

获取密码

$ cat /var/lib/jenkins/secrets/initialAdminPassword
26a028bxxxxx2cf56a

按需安装,没啥好说的

为了快速通过,这里暂时先什么插件都不装,等配置好国内的插件源再说

接下来就是设置密码、站点 Base URL,就不截图了…

OK,安装完成后界面是这样的~

(5)配置国内插件源

路径:Managed Jenkins → Manage Plugins → Advanced → Update Site

默认官方:https://updates.jenkins.io/update-center.json

清华镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

(6)安装常用插件

包括但不限于以下插件

  • git
  • pipeline
  • ansible
  • docker
  • Role-based Authorization Strategy
  • Localization: Chinese (Simplified)
  • HTTP Request
  • Pipeline Maven Integration
  • Pipeline NPM Integration
  • Pipeline: Shared Groovy Libraries through HTTP retrieval
  • Pipeline: Declarative Agent API
  • Timestamper
  • Build Timestamp
  • Blue Ocean 相关
  • LDAP、LDAP Email
  • Ant、Gradle、Maven、NPM 等
  • Periodic Backup

1.3 Jenkins 用户管理

1.3.1 内置用户数据库

路径:Managed Jenkins → Manage Users → Create User

(1)创建用户

用户名称建议使用小写字母,大小写混用的话有时会遇到坑

执行创建

使用 dayo 用户登录

(2)修改用户

路径:用户列表页 → 用户名 → Configure

(3)删除用户

路径:用户列表页 → 用户名 → Delete

1.3.2 LDAP

todo

1.4 Jenkins 权限管理

(1)插件安装

Jenkins 默认的授权策略是 登录的用户可以做任何事情,这肯定不行,为了安全考虑,我们需要实现一定程度的权限控制,Role-based Authorization Strategy 插件就是用来帮助我们实现用户权限管理,如果之前没安装,这里装下即可

配置启用该插件进行权限管理

配置开启后,管理中心里安全的区域中会多一个功能块 Manage and Assign Roles

点击进来,我们可以看到以下内容

首先先看 Manage Roles 界面

(2)角色管理

上图中共包含三类角色管理

Global roles

基于 “全局角色” 授权,Global Roles 适用于 Jenkins 中的所有项目,它会覆盖Item Roles” 中的冲突配置。例如:当用户绑定的 “Global Roles” 包含 “Job Read” 权限时,无论 “Item Roles” 中指定的内容如何,该角色都可以读取所有作业

下面列下大致的权限:

  • 全部:所有对象管理、读取权限
  • 凭据:创建、删除、管理域、更新、浏览权限
  • 代理:构建、配置、连接、创建、删除、断开连接等权限
  • 作业:构建、取消、配置、创建、删除、发现、读取、移动、工作目录权限
  • 运行:删除、回放、更新
  • 视图:配置、创建、删除、读取

通常业界实践,我们会将整个平台角色分为:管理员、二级管理员、只读用户、普通用户

  • 管理员:具有所有 Jenkins 权限,即绑定 admin 角色
  • 二级管理员:拥有特定产品线的作业完全控制权限,通过 Item roles 通配符匹配(productName-.*
  • 只读用户:只分配作业读取权限,绑定 readonly 角色
  • 普通用户:只分配特定作业读取、构建权限,绑定 全局角色 readonly + 作业角色 + productName-.*

如下所示:

Item roles

基于 “项目” 授权,项目作业的权限,可以使用正则表达式对同类作业匹配,例如:我的流水线项目名称都是按照 产品线- 开头的,那么 Pattern 可以这么写 产品线-.*,如图所示:

点击 Add 创建完 Role 后,配置其权限

Node Roles

基于 “节点” 授权角色,代理节点的权限也是可以按照 Item Roles 通过正则表达式配置,不过一般我们都会在流水线指定好相关的 agent 名称或者标签不会进行权限的控制,当然如果你需要对代理节点的配置进行权限控制,也是可以在这里实现的

(3)角色绑定

点击 Assign Roles 、添加被管理用户、勾选对应角色

具体就不演示了,比较简单…

(4)故障处理

1. Access Denied

如果不给用户分配 Global Roles中的 全部 Read 则会出现下图情况

有时安装插件也会导致如下情况,下图是我在安装 Blue Ocean 相关插件重启后遇到的问题

如果出现权限授权问题,导致无法登陆 Jenkins,此时修改 Jenkins 的 config.xml 文件,重启服务匿名登录,重新配置 Jenkins 用户、安全相关配置

<useSecurity>true</useSecurity>   # 替换为false

(5)二次封装(废弃)

Role-based Authorization Strategy 提供的 API 坑有点多,暂时放弃

虽然 Role-based Authorization Strategy 满足我们的需求,但是当 Jenkins 用户数量达到一个量级时(100+),会出现各方面的问题,诸如:页面加载缓慢、用户记录堆叠导致误操作等等

我们除了可以通过 管理中心 进行权限管理,还可以基于插件所提供的接口进行二次封装

role-strategy-plugin 提供了以下接口:

接口 描述
/role-strategy/strategy/addRole 添加角色
/role-strategy/strategy/getRole 获取角色信息
/role-strategy/strategy/removeRoles 删除角色
/role-strategy/strategy/assignRole 绑定角色
/role-strategy/strategy/deleteSid 撤销用户所有角色
/role-strategy/strategy/unassignRole 解绑角色
/role-strategy/strategy/getAllRoles 获取所有用户及权限
/role-strategy/strategy/getMatchingJobs 获取正则表达式匹配到的作业
添加角色

请求地址:localhost:8080/role-strategy/strategy/addRole

参数列表:

  • type (globalRoles, projectRoles)
  • roleName:角色名称,参数值为 str
  • permissionIds:角色所包含的权限,参数值为 list(item 为权限类)
  • overwrite:是否覆盖,参数值为 bool
  • pattern:正则表达式,参数值为 str

示例:curl -X POST localhost:8080/role-strategy/strategy/addRole –data “type=globalRoles&roleName=ADM&permissionIds=hudson.model.Item.Discover,hudson.model.Item.ExtendedRead&overwrite=true”

执行命令

$ curl -X POST -u LotusChing:LotusChing localhost:9008/role-strategy/strategy/addRole --data "type=globalRoles&roleName=ADM&permissionIds=hudson.model.Item.Discover,hudson.model.Item.ExtendedRead&overwrite=true" 

不知道为什么一直返回 403

获取角色权限

请求地址:localhost:8080/role-strategy/strategy/getRole

参数列表:

  • type:globalRoles, projectRoles, slaveRoles)
  • roleName

示例:

$ curl -s -XGET -u LotusChing:LotusChing 'http://localhost:9008/role-strategy/strategy/getRole?type=globalRoles&roleName=admin'| python -m json.tool
{
    "permissionIds": {
        "com.cloudbees.plugins.credentials.CredentialsProvider.Create": true,
        "com.cloudbees.plugins.credentials.CredentialsProvider.Delete": true,
        "com.cloudbees.plugins.credentials.CredentialsProvider.ManageDomains": true,
        "com.cloudbees.plugins.credentials.CredentialsProvider.Update": true,
        "com.cloudbees.plugins.credentials.CredentialsProvider.View": true,
        "hudson.model.Computer.Build": true,
        "hudson.model.Computer.Configure": true,
        "hudson.model.Computer.Connect": true,
        "hudson.model.Computer.Create": true,
        "hudson.model.Computer.Delete": true,
        "hudson.model.Computer.Disconnect": true,
        "hudson.model.Computer.Provision": true,
        "hudson.model.Hudson.Administer": true,
        "hudson.model.Hudson.Read": true,
        "hudson.model.Item.Build": true,
        "hudson.model.Item.Cancel": true,
        "hudson.model.Item.Configure": true,
        "hudson.model.Item.Create": true,
        "hudson.model.Item.Delete": true,
        "hudson.model.Item.Discover": true,
        "hudson.model.Item.Move": true,
        "hudson.model.Item.Read": true,
        "hudson.model.Item.Workspace": true,
        "hudson.model.Run.Delete": true,
        "hudson.model.Run.Replay": true,
        "hudson.model.Run.Update": true,
        "hudson.model.View.Configure": true,
        "hudson.model.View.Create": true,
        "hudson.model.View.Delete": true,
        "hudson.model.View.Read": true,
        "hudson.scm.SCM.Tag": true,
        "org.jenkins.plugins.lockableresources.LockableResourcesManager.Reserve": true,
        "org.jenkins.plugins.lockableresources.LockableResourcesManager.Unlock": true,
        "org.jenkins.plugins.lockableresources.LockableResourcesManager.View": true
    },
    "sids": [
        "LotusChing"
    ]
}

1.5 Jenkins 凭证管理

凭据(Credentials)是 Jenkins 中非常重要的一个概念,必须要熟练掌握,它最主要的作用就是为我们解决 明文配置密码 问题,建议流水线过程中凡是涉及到用户账号(如 Gitlab、k8s)、Token、证书等认证数据,全部采用凭证进行存储处理

路径:Manage Jenkins → Manage Credentials

创建凭据

默认情况下,凭据类型主要有四种(部分插件或再次基础上进行扩展):

  • 用户名/密码:存储用户名密码,例如:阿里云镜像仓库用户名及密码、GitHub 用户名及密码
  • Secret file
  • Secret text:存储一段私密字符串,例如:token
  • Certificate:存储证书,例如:双向认证时客户端请求携带的证书

用户名 admin 凭据ID:jenkins-admin-user

使用凭据

在 pipeline 作业中我们可以开启参数化构建,这样在开始构建时要求用户必须传入对应的凭证

参数化构建

当然,我们还可以直接在流水线里使用对应的凭证,如下所示:

def HttpReq(reqType,reqUrl,reqBody){
    def apiServer = "http://localhost:8080/role-strategy/strategy"
   # 在进行 http 请求时使用凭证 ID:jenkins-admin-user  保存的用户名、密码
   result = httpRequest authentication: 'jenkins-admin-user',
            httpMode: reqType, 
            contentType: "APPLICATION_JSON",
            consoleLogResponseBody: true,
            ignoreSslErrors: true, 
            requestBody: reqBody,
            url: "${apiServer}/${reqUrl}"
            //quiet: true
    return result
}

Gitee 凭据创建及使用

(1)创建密钥对

一路回车,不对密钥进行加密

$ ssh-keygen

(2)配置公钥

Gitee -> 用户管理 -> 添加公钥

(3)测试配置

尝试获取远程仓库最新版本

$ git ls-remote -h git@gitee.com:<username>/<repo>.git

(4)创建凭证

Private Key 栏添加私钥文件的内容,直接拷贝进来就行

(5)验证凭证

  • 方式一:可以在 Global Pipeline Library 配置使用 Git 仓库,然后使用创建好的凭证看能否获取到最新的版本,如果 Default version 栏下返回当前版本好则表示一切配置完成,如果返回类似 permission deny 字样,则说明还是哪有问题,如下所示:

1.6 Jenkins 分布式架构

(1)大致架构

Jenkins 采用 master/agent(slave) 架构,无论是 master 还是 agent 都属于 node,每个 agent node 上都会运行特定数量的 executor,架构图如下

  • jenkins master:负责提供界面、处理 HTTP 请求及管理构建环境的 node
  • jenkins agent(slave):负责构建执行的 node(进程)
  • executor:执行器,是真正执行构建的单元,在一个 agent node 上可以运行多个 executor,执行器可以理解为一个单独的进程(事实上是线程)

(2)添加 agent

默认情况下,所有 Jenkins 项目都是在 Jenkins master 的 executor 执行的,如果 Jenkins master 上只有两个 executor,那么最多只有两个项目能同时执行构建,其他项目都必须要排队

当然,我们可以增加 executor 提高并行执行的上限,但单机性能是有限的,可用性也是一个问题,解决两个问题的办法就是 “分布式构建”,下面我们看下如何配置添加 agent

Jenkins Agent 可用性问题可以通过多副本解决,但 Jenkins Master 处理起来还是费些手脚的(主要是配置、存储问题)

(2.1)配置固定端口

Master 与 Agent 间使用 JNLP(Java 网络启动协议)进行通信,JNLP 是一种允许客户端启动托管在远程 Web 服务器上的应用程序的协议,而 Java WebStart(JWS)可以被理解为 JNLP 协议的一个客户端

我们接下来看下如何通过 JNLP 协议增加 agent,Jenkins 支持固定端口或随机端口,随机端口不利于自动化,所以选择开放固定端口,下图是 Jenkins Master 配置固定的与 Slave 通信端口的过程

然后,添加 Jenkins Slave 节点,管理中心 → Manage Nodes and Clouds → New Node

填写节点配置

这里主要几个比较重要配置项

  • Labels:agent 标签,用来对节点分组,标记之间用空格分隔 linux dev jdk8使用文档

  • Usage:agent 使用策略

    • Use this node as much as possible:尽可能使用此 agent
    • Only build jobs with label expressions matching this node:只有当构建任务符合本agent的标签时,才使用此 agent
  • Launch method:agent 运行方式

    • Launch slave agents on Unix machines via SSH:通过 SSH 连接 node,依赖 SSH Slaves pluginSSH Credentials Plugin 可以集中管理 SSH Credentials
    • Launch slave agents via Java Web Start:通过 Java Web Start 连接节点
    • Launch agent by connecting it to the controller:通过 agent 主动连接 jenkins master jnlp 端口
    • Let Jenkins control this Windows slave as a Windows service:让 Jenkins 节点添加到 Windows 服务中
  • Availability:agent 可用性配置

    • Keep this agent online as much as possible:尽可能保持 agent 在线【推荐】
    • Use container only once:使用一次性的容器
    • Bring this agent online when in demand, and take offline when idle:有需要时保持在线,空闲特定时间后自动离线
    • Bring this agent online according to a schedule:根据 cron 规则设置 agent 上线规则

(2.2)配置节点

由于我们选择是通过 agent 客户端管理,所以 Slave 节点需要稍做配置

下载 agent jar 抱

$ mkdir /opt/jenkins && cd /opt/jenkins
$ wget http://47.115.121.119:9008/jnlpJars/agent.jar

启动 agent

$ java -jar agent.jar -jnlpUrl http://47.115.121.119:9008/computer/build%2Dserver%2Daliyun%2Decs%2D01/jenkins-agent.jnlp -secret 8a6656981
a6851ec140130259f51f6abef13944663fcd68c4b32131549606808 -workDir "/opt/jenkins"
Nov 01, 2021 2:42:50 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /opt/jenkins/remoting as a remoting work directory
Nov 01, 2021 2:42:50 PM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to /opt/jenkins/remoting
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main createEngine
INFO: Setting up agent: build-server-aliyun-ecs-01
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener <init>
INFO: Jenkins agent is running in headless mode.
Nov 01, 2021 2:42:50 PM hudson.remoting.Engine startEngine
INFO: Using Remoting version: 4.11
Nov 01, 2021 2:42:50 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /opt/jenkins/remoting as a remoting work directory
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Locating server among [http://47.115.121.119:9008/]
Nov 01, 2021 2:42:50 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
# 注意看这段 Agent port 即我们此前在 管理中心 | 安全配置 | Agents 中配置的固定端口
INFO: Agent discovery successful
  Agent address: 47.115.121.119
  Agent port:    9182
  Identity:      73:27:c4:be:cc:2e:99:47:b6:ac:8c:79:c8:56:22:77
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Handshaking
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to 47.115.121.119:9182
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Nov 01, 2021 2:42:50 PM org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader run
INFO: Waiting for ProtocolStack to start.
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: 73:27:c4:be:cc:2e:99:47:b6:ac:8c:79:c8:56:22:77
Nov 01, 2021 2:42:50 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected

此时回头来看 WebUI,不出意外的话 Slave 节点已经处于正常状态

不过,刚才那条命令是前台运行,一旦关闭终端,程序会自动退出,所以我们调整一下

$ cat start.sh
#!/bin/bash
nohup java -jar agent.jar -jnlpUrl http://47.115.121.119:9008/computer/build%2Dserver%2Daliyun%2Decs%2D01/jenkins-agent.jnlp -secret 8a6656981a6851ec140130259f51f6abef13944663fcd68c4b32131549606808 -workDir "/opt/jenkins" > agent.log 2>&1 &

赋予执行权限

$ chmod +x start.sh

通过脚本启动 agent

$ ./start.sh
$ tail -f agent.log
Nov 01, 2021 2:54:45 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to 47.115.121.119:9182
Nov 01, 2021 2:54:45 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Nov 01, 2021 2:54:45 PM org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader run
INFO: Waiting for ProtocolStack to start.
Nov 01, 2021 2:54:45 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: 73:27:c4:be:cc:2e:99:47:b6:ac:8c:79:c8:56:22:77
Nov 01, 2021 2:54:45 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected

(2.3)分布式构建 + 并行构建

  • 分布式构建:通过 agent { labels "tag" } 实现负载分摊,降低单点压力,提高构建速度

  • 并行构建:通过 parallel 指令实现多个阶段 stage 并行运行,提高构建速度

示例代码

@Library('shareLibraryDemo')
// 基于 utils 实例化一个 util_tools 对象
def util_tools = new org.devops.utils()
pipeline {
    agent any
    options {
        timestamps()
    }
    stages {
        stage('代码拉取') {
            steps {
                script {
                	util_tools.PrintColorMsg("拉取最新代码.", "green") 
                }
            }
        }
        stage('代码集成') {
            // 多个步骤并行运行执行构建
            parallel {
                stage('编译打包') {
                    // 指定在包含特定标签的 agent node 运行,以此实现分布式构建
                    agent {
                        label "built-in"
                    }
                    steps {
                        script {
                            util_tools.PrintColorMsg("【Parallel-A】我在编译打包最新代码.", "blue") 
                        }
                    }
                }
                stage('代码扫描') {
                    // 指定在包含特定标签的 agent node 运行,以此实现分布式构建
                    agent {
                        label "build-server-aliyun-ecs-01"
                    }
                    steps {
                        script {
                            util_tools.PrintColorMsg("【Parallel-B】我在扫描最新代码.", "blue") 
                        }
                    }
                }
                stage('集成测试') {
                    agent {
                        label "build-server-aliyun-ecs-01"
                    }
                    steps {
                        script {
                            util_tools.PrintColorMsg("【Parallel-C】我在测试最新代码.", "blue") 
                        }
                    }
                }
            }
        }
        stage('应用部署') {
            steps {
                script {
                	util_tools.PrintColorMsg("部署更新应用.", "red") 
                }
            }
        }
    }
}

1.7 Jenkins 项目管理

当作业较多时,我们会按照产品线、团队等维度创建文件夹,基于文件夹对 作业 进行分组,以此提高查找、使用效率

文件夹管理

其他的信息暂时不用填,写个名称即可

创建 文件夹 后,我们可以将此前的 作业 移动过来

OK,查看最终效果

视图管理

新建视图

选择列表视图

配置视图,要么挨个勾选(不推荐),要么使用正则表达式匹配作业(推荐),这里为了方便,使用第一种

查看效果

<plugin>    <!--plugins要写在build标签下,不然无法识别 -->
    <artifactId>maven-compiler-plugin</artifactId>   
    <version>3.1</version>    <!--maven-compiler-plugin版本写一个中央仓库有的版本,保存后它会自动下载 -->
    <configuration>   
        <source>10</source>    <!--我的jdk是10.0.1的,写成10.0.1不好用,所以就写成10了 -->
        <target>10</target>   
    </configuration>   
</plugin> 

文章作者: Da
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Da !
  目录