Jenkins的制品管理

制品是什么?

也叫产出物或工件。制品是软件开发过程中产生的多种有形副产品之一。广义的制品包括用例、UML图、设计文档等。而狭义的制品就可以简单地理解为二进制包。虽然有些代码是不需要编译就可以执行的,但是我们还是习惯于将这些可执行文件的集合称为二进制包。

制品管理仓库

最简单的制品管理仓库就是将制品统一放在一个系统目录结构下。但是很少有人这样做,更多的做法是使用现成的制品库。

制品管理涉及两件事情:一是如何将制品放到制品库中;二是如何从制品库中取出制品。

目前现成的制品库有:Nexus、Artifactory。(nexus经常被用来搭建maven私有仓库)

docker安装Nexus

查找镜像

$ docker search nexus

下载镜像

$ docker pull sonatype/nexus3

启动容器

docker run -d --name nexus3 \
--restart=always \
-p 8081:8081 \
-p 8082:8082 \
-p 8083:8083 \
-p 8084:8084 \
-p 8085:8085 \
-v /opt/nexus-data:/nexus-data \
sonatype/nexus3

archiveArtifacts制品管理

archiveArtifacts步骤能对制品进行归档,然后你就可以从Jenkins页面上下载制品了,如图

Jenkinsfile内容如下:

archiveArtifacts的参数

• artifacts(必填):字符串类型,需要归档的文件路径,使用的是Ant风格路径表达式。

• fingerprint(可选):布尔类型,是否对归档的文件进行签名。

• excludes(可选):字符串类型,需要排除的文件路径,使用的也是Ant风格路径表达式。

• caseSensitive(可选):布尔类型,对路径大小写是否敏感。

• onlyIfSuccessful(可选):布尔类型,只在构建成功时进行归档。

archiveArtifacts步骤并不只用于归档JAR包,事实上,它能归档所有类型的制品。

管理Java栈制品

  1. 使用maven发布制品到nexus中

    Maven Deploy插件能将JAR包及POM文件发布到Nexus中

    使用Deploy插件发布需要以下几个步骤。

    (1)配置发布地址。在Maven项目的POM文件中加入:

    Deploy插件会根据Maven项目中定义的version值决定是使用nexus-snapshot仓库还是nexus-release仓库。当version值是以-SNAPSHOT后缀结尾时,则发布到nexus-snapshot仓库。

    (2)配置访问Nexus的用户名和密码。在Nexus中,我们配置了只有授权的用户名和密码才能发布制品。这时需要在Maven的settings.xml中加入配置:

  2. 使用Nexus插件发布制品

    安装Nexus Platform插件

    (1)进入Manage Jenkins→Configure System→Sonatype Nexus页,设置Nexus 3.x的服务器地址,如图

    • 在“Credentials”选项处,增加了一个具有发布制品到Nexus中的权限的用户名和密码凭证。

    • Server ID字段的值,在Jenkinsfile中会引用。

    设置完成后,单击“Test connection”按钮测试设置是否正确。

    (2)在Jenkinsfile中加入nexusPublisher步骤。

    ​ nexusPublisher的参数介绍:

    ​ • nexusInstanceId:在Jenkins中配置Nexus 3.x时的Server ID。

    ​ • nexusRepositoryId:发布到Nexus服务器的哪个仓库。

    ​ • mavenCoordinate:Maven包的坐标,packaging值与Maven中的packaging值一致,可以是jar、war、pom、hpi等。

    ​ • mavenAssetList:要发布的文件,如果是pom.xml,则extension必须填“xml”。

    此插件的缺点:

    ​ • 每个Maven项目都可能不同,必须为每个Maven项目写nexusPublisher方法。

    ​ • 对于多模块的Maven项目,nexusPublisher的参数写起来十分啰唆。

使用Nexus管理Docker镜像

  1. Nexus:创建Docker私有仓库

    进入Nexus的仓库列表页:Administration→Repository→Repositories,单击“docker(hosted)”

    指定Docker私有仓库提供HTTP服务的端口为8595。私有仓库的地址为:http://<ip>:8595。

  2. 创建Docker私有仓库凭证

    将镜像推送到Docker私有仓库是需要用户名和密码的。我们不能将密码明文写在Jenkinsfile中,所以需要创建一个“Username with password”凭证。

  3. 构建并发布Docker镜像

    当私有仓库创建好后,我们就可以构建Docker镜像并发布到仓库中了。假设Dockerfile与Jenkinsfile在同一个目录下,我们看一下Jenkinsfile的内容。

    ​ withDockerRegistry步骤做的事情实际上就是先执行命令:docker login-u admin-p********http://192.168.0.101:8595。其间,所生成的config.json文件会存储在工作空间中。然后再执行闭包内的命令。

    将镜像推送到Nexus中后,在Nexus中可以看到如图

    注:由于是私有的非安全(HTTP)的仓库,所以需要配置Docker的daemon.json。

Nexus raw制品管理

​ raw仓库可以被理解为一个文件系统,我们可以在该仓库中创建目录。

  1. 创建raw仓库

    进入Administration→Repository→Repositories页

    单击“raw(hosted)”,进入raw仓库创建页。

    输入仓库名称“raw-example”,单击“Create repository”按钮,确认后创建成功。该仓库的地址是:<你的Nexus地址>/repository/raw-example/。

  2. 上传制品,获取制品

使用HTTP客户端就可以将制品上传到raw仓库中。我们使用Linux curl命令。

(1)在Jenkins上添加“Username with password”凭证,如图所示。



(2)在Jenkinsfile中加入上传制品的步骤。

curl命令的格式为:

如果目录不存在,nexus将会自动创建

  1. 在Jenkins pipeline中获取原始制品时,我们同样使用curl命令。

从其他pipeline中拷贝制品

  1. 安装Copy Artifact插件

  2. 代码:从core项目中拿到最后一次构建成功的制品。



copyArtifacts步骤的参数详解:

​ • projectname(必填):字符串类型,Jenkins job或pipeline名称。

​ • selector:BuildSelector类型,从另一个pipeline中拷贝制品的选择器,默认拷贝最后一个制品。

​ • parameters:字符串类型,使用逗号分隔的键值对字符串(name1=value1,name2=value2),用于过滤从哪些构建中拷贝制品。

​ • filter:字符串类型,Ant风格路径表达式,用于过滤需要拷贝的文件。

​ • excludes:字符串类型,Ant风格路径表达式,用于排除不需要拷贝的文件。

​ • target:字符串类型,拷贝制品的目标路径,默认为当前pipeline的工作目录。

​ • optional:布尔类型,如果为true,则拷贝失败,但不影响本次构建结果。

​ • fingerprintArtifacts:布尔类型,是否对制品进行签名,默认值为true。

​ • resultVariableSuffix:上例中,无法得知我们到底拿的是core项目的哪次构建的制品。CopyArtifact 插件的设计是将其构建次数放到一个环境变量中。这个环境变量名就是在COPYARTIFACT BUILD NUMBER 后拼上resultVariableSuffix,比如resultVariableSuf fix值为corejob,那么就在pipeline中通过变量COPYARTIFACT BUILD NUMBER corejob拿到源pipeline的构建次数了。

​ 几种常用的获取选择器:

• lastSuccessful:最后一次构建成功的制品。方法签名为lastSuccessful(boolean stable)。stable为true表示只取构建成功的制品,为false表示只要构建结果比UNSTABLE好就行。

• specific:指定某一次构建的制品。方法签名为specific(String buildNumber)。buildNum ber表示指定取第n次构建的制品。

• lastCompleted:最后一次完成构建的制品,不论构建的最终状态如何。方法签名为lastCompleted()。

• latestSavedBuild:最后一次被标记为keep forever的构建的制品。方法签名为latestSavedBu ild()。

版本号管理

语义化版本格式为:主版本号.次版本号.修订号。版本号递增规则如下:

• 主版本号:当作了不兼容的API修改时。

• 次版本号:当作了向下兼容的功能性新增时。

• 修订号:当作了向下兼容的问题修正时。

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。以下是常用的修饰词。

• alpha:内部版本。

• beta:测试版本。

• rc:即将作为正式版本发布。

• lts:长期维护。

方便生成版本号的Version Number插件

VersionNumber步骤支持以下参数。

• versionNumberString:字符串类型,版本号格式,用于生成版本号。只能使用单引号,以防格式中的占位符被转义。版本号格式支持多种占位符,稍后介绍。

• versionPrefix:字符串类型,版本号的前缀。

• projectStartDate:字符串类型,项目开始时间,格式为yyyy-MM-dd,用于计算项目开始后的月数和年数。

• worstResultForIncrement:字符串类型,如果本次构建状态比上一次构建状态更糟糕,则BUILDS_TODAY、BUILDS_THIS_WEEK、BUILDS_THIS_MONTH、BUILDS_THIS_YEAR占位符的值不会增加。worstResultForIncrement可以设置的值有SUCCESS、UNSTABLE、FAILURE、ABORTED、NOT_BUILT(默认)。此参数较少使用。versionNumberString参数使用占位符生成版本号。部分占位符本身支持参数化。接下来分别介绍它们。

• BUILD DATE FORMATTED:格式化的构建日期,支持参数化,如${BUILD DATEFORMATTED,"yyyy-MM-dd"}。

• BUILD DAY:构建日期,支持X和XX参数。比如是12月2日,${BUILD DAY}将返回2,${BUILD DAY,X}将返回2,${BUILD DAY,XX}将返回03。

• BUILD WEEK:今年构建的星期数,支持X和XX参数。

• BUILD MONTH:今年构建的月数,支持X和XX参数。

• BUILD YEAR:今年构建的年份。

比如构建的时间为2018-12-02,那么BUILD_DAY的值为2,BUILD_WEEK的值为49,BUILD_MONTH的值为12,BUILD_YEAR的值为2018。

接下来是一组和构建数相关的占位符:BUILDS TODAY、BUILDS THIS WEEK、BUILDS THISMONTH、BUILDS THIS YEAR,它们分别表示当天、本星期、本月、本年完成的构建数。

BUILDS ALL TIME表示自从项目开始后完成的总构建数。MONTHS SINCE PROJECT START和YEARS SINCE PROJECT START分别表示自项目开始日期起已过去的日历月数和年数。

Jenkins的制品管理的更多相关文章

  1. Jenkins制品管理

    目录 一.简介 二.Jenkins管理制品 三.Nexus maven上传 jenkins上传 管理Docker镜像 管理raw 四.拷贝制品 五.版本号 Version Number 一.简介 制品 ...

  2. [原]Jenkins(十三)---jenkins用户权限管理

    * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5337874.html 两种策略的比较

  3. 【Devops】【docker】【CI/CD】jenkins源码管理,添加SSH地址后报错+Jenkins构建报错:Please make sure you have the correct access rights and the repository exists.

    jenkins源码管理,添加SSH地址后报错: Could not read from remote repository. Please make sure you have the correct ...

  4. Gitlab+Jenkins学习之路(九)之Jenkins的远程管理和集群

    一.Jenkins的远程管理 Jenkins的远程管理方式包含: Shell ssh SSH Plugin ansible.saltstack (1)Shell ssh在项目构建时,jenkins使用 ...

  5. Jenkins的凭证管理

    Jenkins的凭证管理 什么是凭证? 凭证(cridential)是Jenkins进行受限操作时的凭据.比如使用SSH登录远程机器时,用户名和密码或SSH key就是凭证.而这些凭证不可能以明文写在 ...

  6. 聊聊DevOps制品管理-不止是存储制品这么简单

    什么是制品? 制品是指由源码编译打包生成的二进制文件,不同的开发语言对应着不同格式的二进制文件:这些二进制文件通常用于运行在服务器上或者作为编译依赖,"制品的管理"是配置管理的重要 ...

  7. Jenkins的插件管理(安装和更新插件)

    使用Jenkins的编译部署项目需要依赖各种插件 下面安装Jenkins的各种插件: 1.登录Jenkins进入以下界面: 2.点击 系统管理 : 3.点击 管理插件 : 4.点击 可选插件 选择你需 ...

  8. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

  9. [CI]jenkins安装&插件管理&java-helloworld之旅

    持续集成概述 没有持续集成时的情况 持续集成最佳实战 维护一个单一的代码库 使构建自动化 执行测试是构建的一部分 集成日志及历史记录 使用统一的依赖包管理库 每天至少集成一次 jenkins实现持续集 ...

随机推荐

  1. Typescript - 联合类型

    原文:TypeScript基本知识点整理 零.序言 联合类型表示一个变量值可以是几种类型之一,我们可以使用 “|” 来分割每个类型: 联合类型的变量在被赋值时,会根据类型推断的规则推断出一个类型: 如 ...

  2. setContext or setCharacterEncoding

    request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值response.setContentType("text/html;char ...

  3. Spring常用注解(讲解的通俗易懂,很透彻)

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  4. java 字符串转日期格式

    /** * 字符串转日期格式 * */ public static Date date(String date_str) { try { Calendar zcal = Calendar.getIns ...

  5. zookeeper ACL(access control lists)权限控制

    基本作用:        针对节点可以设置 相关读写等权限,目的为了保障数据安全性        权限permissions可以制定不同的权限范围以及角色 一:ACL构成         zk的acl ...

  6. Python知识点总结及其介绍链接

    Python 弱引用(不会增加引用计数的引用,可以用来做对象缓存,避免循环引用导致内存无法回收):http://python.jobbole.com/85431/ from future import ...

  7. 你每天跑这么多自动化用例,能发现BUG吗?

    阿里QA导读:为什么要度量测试有效性?这么多的CASE,花了大量时间和资源去运行,真能发现bug吗?CI做到90%的行覆盖率了,能发现问题吗?测试用例越来越多,删一些,会不会就发现不了问题了?怎么找出 ...

  8. Pygame相关

    pygame是主要构筑在SDL库基础上的一组Python模块的集合,它使我们能够用Python语言来创建功能完整的游戏和多媒体程序.pygame是高度括平台可移植的,在任何SDL支持的平台上都可以运行 ...

  9. Introduction Of Gradient Descent

    不是一个机器学习算法 是一种基于搜索的优化方法 作用:最小化一个损失函数 梯度上升法:最大化一个效用函数 import matplotlib.pyplot as plt import numpy as ...

  10. SetTimeout()多次运行函数后越来越快的问题

    问题原因很简单,但是由于代码逻辑问题,一直没有考虑到: 网上有个帖子说的很明白:原帖入口 假如你在0时刻点击了一下按钮,那么500ms时数字会跳一下,1000ms会再跳一下,依次类推,1500,200 ...