云客户?
开始免费>
升级MyJFrog >
云有什么新鲜事>





概述

管道作业通过创建定义构建步骤的脚本,简化了使用Jenkins构建持续交付工作流的过程。如不熟悉詹金斯管道,请参阅管道教程或者是从管道开始文档。

詹金斯Artifactory插件支持Artifactory操作管道api。您还可以选择下载依赖项,上传工件,并从管道脚本向Artifactory发布构建信息。

本页描述如何在Artifactory中使用声明式管道语法。声明式语法可从Jenkins Artifactory Plugin的3.0.0版本获得。


还支持脚本语法。点击这里阅读更多信息

例子

詹金斯管道的例子可以帮助您开始在Artifactory创建管道工作。


页面内容


创建Artifactory服务器实例

有两种方法告诉管道脚本使用哪个Artifactory服务器。您可以将服务器详细信息定义为管道脚本的一部分,或者将服务器详细信息定义为管理|配置系统

如果您选择在管道中定义Artifactory服务器,请将以下内容添加到脚本中:

rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', //如果你使用的是用户名和密码:username: 'user', password: 'password', //如果你使用的是凭证id: credentialsId: ' ccrreeddenenttiiaall ', //如果Jenkins被配置为使用http代理,你可以在使用这个Artifactory服务器时绕过代理:bypassProxy: true, //配置连接超时时间(以秒为单位)。//默认值(如果没有配置)是300秒:timeout: 300)


您也可以使用Jenkins凭证ID来代替用户名和密码:

id属性(Artifactory-1)是此服务器的唯一标识符,允许我们在稍后的脚本中引用此服务器。如果您喜欢在中定义服务器管理|配置系统,您不需要添加rtServerit定义如上所示。您可以使用服务器配置的引用服务器ID


上传和下载文件

要下载这些文件,请在管道脚本中添加以下闭包:

rtDownload (serverId: 'Artifactory-1', spec: " '{"files": [{"pattern": "bazinga-repo/froggy-files/", "target": "bazinga/"}]} " ', //可选-将下载的文件与以下自定义构建名和构建号关联,//作为构建依赖项。//如果没有设置,文件将与默认的生成名和生成号关联(即// Jenkins作业名和编号)。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)

在上面的示例中,从Artifactory服务器下载文件Artifactory-1服务器ID。

上面的闭包还包括一个File Spec,它指定了应该下载哪些文件。中的所有ZIP文件bazinga-repo froggy-files /Artifactory路径应该下载到bazingaJenkins代理文件系统上的目录。

上传文件非常类似。以下示例上传所有ZIP文件,其中包括不好的在他们的名字进入froggy-files文件夹中bazinga-repoArtifactory库。

rtUpload (serverId: 'Artifactory-1', spec: " '{"files": [{"pattern": "bazinga/*froggy*.zip", "target": "bazinga-repo/froggy-files/"}]} " ', //可选-将上传的文件与以下自定义构建名和构建号关联,//作为构建工件。//如果没有设置,文件将与默认的生成名和生成号关联(即// Jenkins作业名和编号)。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)

您可以在单独的文件中管理文件规范,而不是将其作为rtUpload而且rtDownload闭包。这允许在源代码控件中管理File规范,可能与项目源代码一起。下面是访问文件规范的方法rtUpload配置方法类似rtDownload关闭

rtUpload (serverId: 'Artifactory-1', specPath: 'path/to/spec/relative/to/workspace/spec。//可选-将上传的文件与以下自定义版本名和版本号关联。//如果没有设置,文件将与默认的生成名和生成号关联(即// Jenkins作业名和编号)。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)

您可以了解如何使用文件规范下载和上传文件在这里

如果希望在没有文件上传或下载的情况下导致构建失败,请将failNoOp属性添加到rtUploadrtDownload闭包如下:

rtUpload (serverId: 'Artifactory-1', specPath: 'path/to/spec/relative/to/workspace/spec。, failNoOp: true, //可选-将上传的文件与以下自定义构建名和构建号关联。//如果没有设置,文件将与默认的生成名和生成号关联(即// Jenkins作业名和编号)。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)

在Artifactory中设置和删除文件属性

当使用rtUpload闭包将文件上传到Artifactory时,您可以选择设置文件的属性。这些属性稍后可用于过滤和下载这些文件。

在某些情况下,您可能想要在Artifactory中已经存在的文件上设置属性。实现这一点的方法非常类似于定义要下载或上传哪些文件的方法:一个FileSpec用于筛选应该设置属性的筛选器。要设置的属性发送到文件规范之外。下面是一个例子。

rtSetProps (serverId: 'Artifactory-1', specPath: 'path/to/spec/relative/to/workspace/spec。', props: 'p1=v1;p2=v2', failNoOp: true)

在上面的例子中:

  1. serverId属性用于引用预配置的Artifactory服务器实例,如创建Artifactory服务器实例一节中所述。
  2. specPath属性包含到文件规范的路径,该文件规范的结构与用于下载文件的文件规范类似。
  3. 道具属性定义我们要设置的属性。在上面的例子中,我们设置了两个属性——p1和p2,分别为v1和v2值。
  4. failNoOp属性是可选的。如果未设置属性,将其设置为true将导致作业失败。

您还可以选择在rtSetProps闭包中直接指定文件规格,如下所示。

rtSetProps (serverId: 'Artifactory-1', props: 'p1=v1;p2=v2', spec: " '{"files": [{"pattern": "my-froggy-local-repo", "props": "filter-by-this-prop=yes"}]} ")

rtDeleteProps闭包用于从Artifactory中的文件中删除属性。语法与rtSetProps闭包非常相似。唯一的区别是,在rtDeleteProps中,我们只指定要删除的属性的名称。名称以逗号分隔。不应该指定属性值。这里有一个例子:

rtDeleteProps (serverId: 'Artifactory-1', specPath: 'path/to/spec/relative/to/workspace/spec。', props: 'p1,p2,p3', failNoOp: true)

类似于rtSetProps闭包,File Spec可以隐式定义在闭包内部,如下所示:

rtDeleteProps (serverId: 'Artifactory-1', props: 'p1,p2,p3', spec: " '{"files": [{"pattern": "my-froggy-local-repo", "props": "filter-by-this-prop=yes"}]} ")



向Artifactory发布Build-Info

如果您还不熟悉构建信息实体,请阅读相关内容在这里

下载的文件rtDownload闭包将自动注册为当前构建的依赖项,而由rtUpload闭包被注册为构建工件。依赖项和工件在本地被记录,并可以稍后作为构建信息发布到Artifactory。

下面是如何将build-info发布到Artifactory的方法:

rtPublishBuildInfo (serverId: 'Artifactory-1', //下面的buildName和buildNumber是可选的如果不设置它们,则使用Jenkins作业名称//作为构建名称。构建号也一样。//如果你选择通过添加以下buildName和// buildNumber属性来设置自定义构建名称和构建编号,你应该确保之前的构建步骤(例如rtDownload //和rtIpload)具有相同的buildName和buildNumber设置。如果没有,那么这些步骤将不会//包含在build-info中。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)


如果您设置了如上所示的自定义版本名称和编号,请确保在rtUploadrtDownload闭包如下所示。如果不这样做,Artifactory将无法将这些文件与构建关联起来,因此它们的文件将不会显示在Artifactory中。

rtDownload (serverId: 'Artifactory-1', // Build -info的Build名称和Build编号:buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的一个项目相关联时,设置项目键如下。你还可以自定义build-info模块的名称:module: 'my-custom-build-info-module-name', specPath: 'path/to/spec/relative/to/workspace/spec。json”)rtUpload( serverId: 'Artifactory-1', // Build name and build number for the build-info: buildName: 'holyFrog', buildNumber: '42', // Optional - Only if this build is associated with a project in Artifactory, set the project key as follows. project: 'my-project-key', // You also have the option of customising the build-info module name: module: 'my-custom-build-info-module-name', specPath: 'path/to/spec/relative/to/workspace/spec.json' )

获取环境变量

要将Build-Info对象设置为在下载和上传文件时自动捕获环境变量,请向脚本中添加以下内容。

重要的是要把rtBuildInfo在与此构建相关的任何步骤(例如,rtDownload和rtUpload)之前关闭,以便它的配置功能(例如,环境变量集合)将作为这些步骤的一部分被调用。

rtBuildInfo (captureEnv: true, //可选-生成名称和生成号。如果未设置,则使用Jenkins作业的构建名称和构建号。buildName: 'my-build', buildNumber: '20', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)

默认情况下,包含“password”、“psw”、“secret”、“token”或“key”(不区分大小写)的环境变量名称将被排除,不会发布到Artifactory。

你可以添加更多包含/排除模式的通配符如下:

rtBuildInfo (captureEnv: true, includeEnvPatterns: ['*abc*', '*bcd*'], excludeEnvPatterns: ['*private*', 'internal-*'], //可选-构建名称和构建号。如果未设置,则使用Jenkins作业的构建名称和构建号。buildName: 'my-build', buildNumber: '20' //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)


触发构建保留

在向Artifactory发布构建信息时,可以触发构建保留rtPublishBuildInfo关闭。方法来设置构建保留,因此应该在发布构建之前完成rtBuildInfo闭包,如下所示。命令之前,请确保在脚本中放置以下配置rtPublishBuildInfo关闭。

rtBuildInfo(//可选- Artifactory中保留的最大构建。maxBuilds: 1, //可选-在Artifactory中保存构建的最长天数。maxDays: 2, //可选-在Artifactory中保存的版本号列表。doNotDiscardBuilds:['3'], //可选(默认为false) -删除构建时也删除构建构件。deleteBuildArtifacts: true, //可选-生成名称和生成号。如果未设置,则使用Jenkins作业的构建名称和构建号。buildName: 'my-build', buildNumber: '20', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下所示。项目:“my-project-key”)



收集构建问题

构建信息可以包括作为构建的一部分处理的问题。问题列表由Jenkins从git提交消息中自动收集。这要求项目开发人员使用一致的提交消息格式,其中包括问题ID和问题摘要,例如:
HAP-1364 -将制表符替换为空格
然后可以在Artifactory中的Builds UI中查看问题列表,以及问题跟踪系统中的问题链接。
收集问题所需的信息是通过JSON配置提供的。该配置可以作为文件或JSON字符串提供。
下面是一个问题集合配置示例。

{“版本”:1、“问题”:{“trackerName”:“JIRA”,“正则表达式”:“(. + - [0 - 9]+)\ \ s - \ \ s(+)”,“keyGroupIndex”:1、“summaryGroupIndex”:2,“trackerUrl”:“http://my-jira.com/issues”,“总”:“真正的”,“aggregationStatus”:“发布”}}

配置文件属性:

属性名 描述
版本 模式版本用于内部使用。不改变!
trackerName 问题跟踪系统的名称(类型)。例如,JIRA。该属性可以取任何值。
trackerUrl 问题跟踪URL。此值用于构建到Artifactory构建UI中的问题的直接链接。
keyGroupIndex

用于检索问题密钥的正则表达式中的捕获组索引。在上面的例子中,将索引设置为“1”将得到检索hap - 1364从这个提交消息:

HAP-1364 -将制表符替换为空格

summaryGroupIndex

正则表达式中用于检索问题摘要的捕获组索引。在上面的例子中,将索引设置为“2”将得到检索这个提交消息的示例问题:

HAP-1364 -将制表符替换为空格

如果希望所有构建都包含以前构建的问题,则设置为true。

aggregationStatus

如果aggregate被设置为true,该属性指示应该在多长时间内聚合问题。在上面的示例中,问题将从以前的构建中聚合,直到找到具有RELEASE状态的构建。方法提升生成时设置生成状态jfrog rt build-promote命令。
正则表达式

用于匹配git提交消息的正则表达式。表达式应该包含两个捕获组—用于问题键(ID)和问题摘要。在上面的例子中,正则表达式匹配提交消息,示例如下:

HAP-1364 -将制表符替换为空格

下面介绍如何在管道脚本中设置问题集合。

rtcollectissue (serverId: 'Artifactory-1', config: " {"version": 1, "issues": {"trackerName": "JIRA", "regexp": "(.+-[0-9]+)\\s-\\s(.+)", "keyGroupIndex": 1, "summaryGroupIndex": 2, "trackerUrl": "http://my-jira.com/issues", "aggregate": "true", "aggregationStatus": "RELEASED"}} " ',)

在上面的例子中,问题配置被嵌入到rtcollectissue闭包中。您还可以选择提供一个包含问题配置的文件。你可以这样做:

rtcollectissue (serverId: 'Artifactory-1', configPath: '/path/to/config.)json”)

如果您想将问题信息添加到特定的生成信息中,您还可以提供生成名称和生成号,如下所示:

rtcolleccomponents (serverId: 'Artifactory-1', configPath: '/path/to/config' buildName: 'my-build', buildNumber: '20', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下。项目:“my-project-key”)

为了帮助您开始,我们建议使用Github的例子



聚合构建

发布到Artifactory的构建信息可以包含多个表示不同构建步骤的模块。正如本节前面所示,您只需要将相同的buildName和buildNumber传递给所有需要它的步骤(rtUpload例如)。

但是,如果您的构建过程运行在多台机器上,或者它分布在不同的时间段,会发生什么情况呢?如何将所有的构建步骤聚合到一个构建信息中?

当您的构建过程在多台机器上运行或者它分布在不同的时间段时,您可以选择为构建过程的每个部分创建和发布单独的构建信息,然后将所有这些发布的构建聚合到一个构建信息中。最终的结果是一个引用其他以前发布的构建信息的构建信息。

在下面的例子中,我们的管道脚本向Artifactory发布了两个build-info实例:

rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'my-app-linux', buildNumber: '1')

此时,我们在Artifactory中存储了两个构建信息。现在让我们创建最终的build-info,它引用前两个:

rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-linux', appendBuildNumber: '1', //下面的buildName和buildNumber是可选的。如果不设置它们,则使用Jenkins作业名称//作为构建名称。构建号也一样。//如果你选择通过添加以下buildName和// buildNumber属性来设置自定义构建名称和构建编号,你应该确保之前的构建步骤(例如rtDownload //和rtIpload)具有相同的buildName和buildNumber设置。如果没有,那么这些步骤将不会//包含在build-info中。buildName: 'final', buildNumber: '1') rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-windows', appendBuildNumber: '1', buildName: 'final', buildNumber: '1') //发布聚合的构建信息到Artifactory。rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'final', buildNumber: '1')

如果Artifactory中发布的构建与项目相关联,您应该将项目键添加到rtBuildAppend而且rtPublishBuildInfo步骤如下。

rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-linux', appendBuildNumber: '1', buildName: 'final', buildNumber: '1',项目:'my-project-key') rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-windows', appendBuildNumber: '1', buildName: 'final', buildNumber: '1',项目:'my-project-key') //发布聚合的构建信息到Artifactory。rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'final', buildNumber: '1',项目:'my-project-key')

使用Xray进行构建提升和构建扫描目前不支持聚合构建。

在Artifactory中推广构建

中定义提升参数,可以在Artifactory的存储库之间提升构建rtPromote例如:关闭

rtPromote(//必选参数buildName: 'MK', buildNumber: '48', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下。project: 'my-project-key', //来自Jenkins配置的Artifactory服务器ID,或来自管道脚本中的配置serverId: 'Artifactory-1', // Artifactory中目标存储库的名称targetRepo: 'libs-release-local', //可选参数//在Artifactory注释的构建历史选项卡中显示的评论和状态:'这是升级评论',状态:'已发布',//指定构建工件的源存储库。sourceRepo: 'libs-snapshot-local', //指示除了工件之外是否提升构建依赖项。错误的默认。includeDependencies: true, //指示在移动或复制一个文件失败的情况下,升级过程是否失败。默认为False failFast: true, //是否拷贝文件。Move是默认值。复制:真)



允许对已发布的版本进行交互式推广

在Artifactory中推广构建部分描述了您的Pipeline脚本如何在Artifactory中促进构建。但是,在某些情况下,您希望在构建完成之后执行构建升级。您可以配置您的Pipeline作业,以公开它发布到Artifactory的部分或所有构建,以便它们稍后可以使用GUI进行交互提升。下面是互动推广的样子:


当构建完成时,可以通过单击构建运行旁边的升级图标来访问升级窗口。若要为已发布的版本启用交互式推广,请添加rtAddInteractivePromotion如下所示。

rtAddInteractivePromotion(//必选参数//来自Jenkins配置的Artifactory服务器ID,或来自管道脚本配置的Artifactory服务器ID serverId: 'Artifactory-1', buildName: 'MK', buildNumber: '48', //仅当此构建与Artifactory中的项目相关联时,设置项目键如下。//可选参数如果设置,升级窗口将显示此标签而不是版本名称和编号。displayName: 'Promote me ', // Artifactory中目标存储库的名称targetRepo: 'libs-release-local // Artifactory注释中构建历史标签中要显示的注释和状态:'这是推广注释',Status: '已发布',//指定构建工件的源存储库。sourceRepo: 'libs-snapshot-local', //指示除了工件之外是否提升构建依赖项。错误的默认。includeDependencies: true, //指示在移动或复制一个文件失败的情况下,升级过程是否失败。默认为False failFast: true, //是否拷贝文件。Move是默认值。复制:真)

你可以添加多个rtAddInteractivePromotion闭包,以便在升级窗口中包含多个构建。


Maven使用Artifactory进行构建

Maven构建可以解决依赖性、部署工件并向Artifactory发布构建信息。

Maven的兼容性

  • 支持的最小Maven版本是3.3.9
  • 部署到工件是由部署和安装阶段触发的。


要从您的Pipeline脚本中使用Artifactory运行Maven构建,您首先需要创建一个Artifactory服务器实例,如
创建Artifactory服务器实例部分。

下一步是定义rtMavenResolver闭包,它定义依赖项解析细节rtMavenDeployer闭包,它定义了构件部署细节。这里有一个例子:

rtMavenResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', releaseRepo: 'libs-release', snapshotRepo: 'libs-snapshot') rtMavenDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', releaseRepo: 'libs-release-local', snapshotRepo: 'libs-snapshot-local', //默认情况下,使用3个线程上传工件到Artifactory。你可以通过设置:threads: 6, //附加自定义属性到发布的工件:properties: ['key1=value1', 'key2=value2'])

正如您在上面的示例中所看到的,解析器和部署器应该有一个惟一的ID,以便在脚本后面引用它们。此外,它们还包括一个Artifactory服务器ID以及发布和快照maven存储库的名称。

现在我们可以运行maven构建,引用我们定义的解析器和部署器:

rtMavenRun (// Jenkins配置中的工具名称。如果您希望构建使用Maven Wrapper,则设置为true。useWrapper: true, pom: ' Maven -example/pom.xml', goals: 'clean install', // Maven选项。opts: '- xms1024m - xmx4096m ', resolverId: 'resolver-unique-id', deployerId: ' deployver -unique-id', //如果这里没有设置生成名称和生成编号,将使用当前的作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的项目相关联时,设置项目键如下。项目:“my-project-key”)

与在rtMavenRun闭包中设置工具不同,您可以使用MAVEN_HOME环境变量设置Maven安装目录的路径,如下所示:

environment {MAVEN_HOME = '/tools/apache-maven-3.3.9'}

如果您希望Maven使用与您的构建代理的默认JDK不同的JDK,则没有问题。
只需将JAVA_HOME环境变量设置为所需的JDK路径(bin目录上面的目录的路径,其中包括java可执行文件)。

environment {JAVA_HOME = '/full/path/to/JDK'}


您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。


Gradle用Artifactory构建

Gradle构建可以解决依赖关系,部署工件并向Artifactory发布构建信息。

Gradle兼容性

Gradle支持的最低版本是4.10

要从您的Pipeline脚本中使用Artifactory运行Gradle构建,您首先需要创建一个Artifactory服务器实例,如创建Artifactory服务器实例部分。

下一步是定义rtGradleResolver闭包,它定义依赖项解析细节rtGradleDeployer闭包,它定义了构件部署细节。这里有一个例子:

rtGradleResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'jcenter-remote') rtGradleDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'libs-snapshot-local', //可选-默认情况下,使用3个线程上传工件到Artifactory。你可以通过设置:threads: 6, //可选-附加自定义属性到发布的工件:properties: ['key1=value1', 'key2=value2'], //可选- Gradle允许通过定义发布作为Gradle构建脚本的一部分来自定义部署的工件列表。// Gradle出版物用于将工件分组。您可以选择定义Jenkins应该使用的已定义出版物中的哪一个。只有按这些出版物分组的工件才会部署到Artifactory。//如果不定义发布,则使用默认发布,其中包含java项目生成的工件列表。//下面是定义发布列表的方法。["mavenJava", "ivyJava"] //如果你想从gradle脚本中定义的所有出版物中部署工件,你可以设置"ALL_PUBLICATIONS"字符串如下// publications: ["ALL_PUBLICATIONS"])

正如您在上面的示例中所看到的,解析器和部署器应该有一个惟一的ID,以便在脚本后面引用它们。此外,它们还包括一个Artifactory服务器ID以及发布和快照maven存储库的名称。

如果您正在使用gradle构建一个生成maven工件的项目,您还可以选择将两个部署存储库定义为rtGradleDeployer闭包——一个存储库将用于快照工件,另一个存储库用于发布工件。以下是你如何定义它:

rtGradleDeployer (id: 'deploy -unique-id', serverId: 'Artifactory-1', releaseRepo: 'lib -release', snapshotRepo: 'lib -snapshot')


现在我们可以运行Gradle构建,引用我们定义的解析器和部署器:

rtGradleRun(//如果Artifactory Plugin已经在构建脚本中定义,则设置为true。usesPlugin: true, // Jenkins配置中的工具名称。如果你想要构建使用Gradle Wrapper,则设置为true。useWrapper: true, rootDir: 'gradle-examples/gradle-example/', buildFile: '构建。gradle', tasks: 'clean artifactoryPublish', resolverId: 'resolver-unique-id', deployerId: 'deployer-unique-id', //如果这里没有设置生成名称和生成编号,将使用当前的作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的项目相关联时,设置项目键如下。项目:“my-project-key”)

如果你想让Gradle使用一个不同于你的构建代理默认的JDK,没有问题。
只需将JAVA_HOME环境变量设置为所需的JDK路径(bin目录上面的目录的路径,其中包括java可执行文件)。
你可以这样做:

environment {JAVA_HOME = '/full/path/to/JDK'}


您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。

您还可以选择在gradle构建脚本中定义默认值。阅读更多相关信息在这里



Python使用Artifactory构建

Python构建可以解决依赖关系,部署工件并向Artifactory发布构建信息。要使用Artifactory运行Python构建,请按照以下步骤开始,以确保您的Jenkins代理已经准备好:

  1. 确保Python安装在生成代理程序上,并且python命令在PATH中。
  2. 安装皮普.您可以使用皮普的文档使用pip和虚拟环境安装包
  3. 确保而且setuptools安装。您可以使用安装包文件
  4. 通过从终端运行以下命令,验证构建代理是否准备就绪:
Output Python version: > Python——version Output pip version: > pip——version Verify wheel is installed: > wheel -h Verify setuptools is installed: > pip show setuptools Verify virtual-environment is activated: > echo $VIRTUAL_ENV . sh

要从您的Pipeline脚本运行Python构建,您首先需要创建一个Artifactory服务器实例,如创建Artifactory服务器实例部分。

下一步是定义rtPipResolver,它定义依赖项解析细节。这里有一个例子:

rtPipResolver (id: "resolver-unique-id", serverId: "Artifactory-1", repo: "pip-virtual")

正如您在上面的示例中所看到的,解析器应该有一个惟一的ID,以便稍后在脚本中引用它。此外,它还包括一个Artifactory服务器ID和存储库的名称。

现在我们可以用rtPipInstall闭包,以解决PIP依赖关系。注意,闭包引用了我们在上面定义的解析器。

rtPipInstall (resolverId: "resolver-unique-id", args: "-r python-example/ requests .txt", envActivation: virtual_env_activation, // Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005' //如果这里没有设置生成名称和生成编号,则将使用当前作业名称和生成编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的某个项目相关联时,设置项目键如下。项目:“my-project-key”)

注意到envActivation属性。是一个可选属性。自通常建议在虚拟环境中运行PIP命令,以实现PIP构建的隔离。要遵循此建议,您可以选择使用envActivation通过发送一个shell脚本作为它的值,来设置虚拟环境。

在大多数情况下,您的构建也会产生工件。生成的工件可以使用rtUpload闭包,如上传和下载文件章节。

您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。

关于build-info的更多信息:您还可以选择自定义build-info模块名称。您可以通过添加模块财产rtPipInstall闭包如下:

rtPipInstall (resolverId: "resolver-unique-id", args: "-r python-example/requirements.txt", envActivation: virtual_env_activation, module: 'my-custom-build-info-module-name')


NuGet和。net核心构建与Artifactory

Artifactory Plugin与NuGet和。net Core客户端的集成允许构建解析依赖,部署工件并向Artifactory发布构建信息。

  • 根据您想使用的客户端,请确保nugetdotnet客户端包含在构建代理的PATH中。
  • 如果你在用dotnet客户端,请注意支持的最低版本是。net Core 3.1.200 SDK。

要从Pipeline脚本中使用Artifactory运行NuGet / DotNet Core构建,首先需要创建Artifactory服务器实例,如创建Artifactory服务器实例部分。

下一步是定义rtNugetResolverrtDotnetResolver(这取决于你使用的是NuGet还是DorNet Core),它定义了依赖性解析细节。这里有一个例子:

rtNugetResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'lib -nuget') //或rtDotnetResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'lib -nuget')

正如您在上面的示例中所看到的,解析器应该有一个惟一的ID,以便稍后在脚本中引用它。此外,它还包括一个Artifactory服务器ID和存储库的名称。

现在我们可以用rtNugetRunrtDotnetRun闭包,解析NuGet依赖项。注意,闭包引用了我们在上面定义的解析器。

rtNugetRun (resolverId: "resolver-unique-id", args: "restore ./示例。sln", //可选- Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", //可选-默认情况下,构建使用NuGet API协议v2。如果您想使用v3,可以在构建实例上设置它,如下所示。apiProtocol: "v3" //如果这里没有设置build名称和build编号,将使用当前的作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此build与Artifactory中的一个项目相关联时,设置项目键如下。//或rtDotnetRun (resolverId: "resolver-unique-id", args: "restore ./Examples. project: 'my-project-key'), // Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", //可选-默认情况下,构建使用NuGet API协议v2。如果您想使用v3,可以在构建实例上设置它,如下所示。 apiProtocol: "v3" // If the build name and build number are not set here, the current job name and number will be used: buildName: 'my-build-name', buildNumber: '17', // Optional - Only if this build is associated with a project in Artifactory, set the project key as follows. project: 'my-project-key' )

在大多数情况下,您的构建也会产生工件。工件可以是NuGet包、DLL文件或任何其他类型的工件。生成的工件可以使用rtUpload闭包,如上传和下载文件章节。

您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。

关于build-info的更多信息:您还可以选择自定义build-info模块名称。您可以通过添加模块财产rtNugetRunrtDotnetRun闭包如下:

rtNugetRun (resolverId: "resolver-unique-id", args: "restore ./示例。Sln ",模块:'my-custom-build-info-module-name')// OR rtDotnetRun ( resolverId: "resolver-unique-id", args: "restore ./Examples.sln", module: 'my-custom-build-info-module-name' )



NPM使用Artifactory构建

NPM构建可以解决依赖关系,部署工件并向Artifactory发布构建信息。要从您的Pipeline脚本中使用Artifactory运行NPM构建,您首先需要创建一个Artifactory服务器实例,如创建Artifactory服务器实例部分。

下一步是定义rtNpmResolver闭包,它定义依赖项解析细节rtNpmDeployer闭包,它定义了构件部署细节。这里有一个例子:

rtNpmResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'libs-npm') rtNpmDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'libs-npm-local', //将自定义属性附加到发布的工件:properties: ['key1=value1', 'key2=value2'])


正如您在上面的例子中所看到的,解析器和部署器应该有一个惟一的ID,这样它们就可以在稍后的脚本中引用。此外,它们还包括一个Artifactory服务器ID和存储库的名称。

现在我们可以用rtNpmInstallrtNpmCi闭包,以解析NPM依赖。注意,闭包引用了我们在上面定义的解析器。

rtNpmInstall(//可选的Jenkins配置工具名称:NPM_TOOL, //可选的项目根路径。如果未设置,则假定工作区的根为根项目路径。'npm-example', //可选npm标志或参数。args: '——verbose', resolverId: 'resolver-unique-id', // Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005' //如果这里没有设置生成名称和生成编号,则将使用当前作业名称和生成编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的某个项目相关联时,设置项目键如下。项目:“my-project-key”)

rtNpmInstall一步调用npm安装幕后指挥。如果你想用npm ci命令代替,只需将步骤名替换为rtNpmCi


为了将项目创建的npm包打包并发布出去,我们使用rtNpmPublish闭包使用对我们定义的部署程序的引用。

rtNpmPublish(//可选的Jenkins配置工具名称:'npm-tool-name', //可选的项目根路径。如果未设置,则假定工作区的根为根项目路径。path: 'npm-example', deployerId: ' deployerId -unique-id', // Jenkins在这一步执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005' //如果这里没有设置生成名称和生成编号,则将使用当前作业名称和生成编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的某个项目相关联时,设置项目键如下。项目:“my-project-key”)

构建使用npm可执行文件来安装(下载依赖项),并在发布之前打包生成的npm包。默认情况下,Jenkins使用npm可执行文件,它出现在代理的PATH中。您还可以引用Jenkins配置中定义的工具。方法如下:

environment {// NodeJS主目录的路径(不是npm可执行文件)NODEJS_HOME = ' Path /to/the/ NodeJS /home'} //或environment{//如果Jenkins配置中定义了一个名为' NodeJS -tool-name'的工具。NODEJS_HOME = "${tool 'nodejs-tool-name'}"} //或nodejs(nodeJSInstallationName: 'nodejs-tool-name'){//仅在此代码范围内使用'nodejs-tool-name'定义的npm。}

如果没有设置npm安装,则使用在代理的PATH中找到的npm可执行文件。

您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。

关于build-info的更多信息:您还可以选择自定义build-info模块名称。您可以通过添加模块财产rtNpmInstallrtNpmPublish闭包如下:


rtNpmPublish(工具:'npm-tool-name',路径:'npm-example', resolverId: 'resolver-unique-id',模块:'my-custom-build-info-module-name')


与Artifactory一起构建

在构建Go项目时,Jenkins可以解决依赖关系、部署工件并向Artifactory发布构建信息。

请确保运行客户端包含在构建代理的PATH中。


要从您的Pipeline脚本中使用Artifactory运行Go构建,您首先需要创建一个Artifactory服务器实例,如创建Artifactory服务器实例部分。

下一步是定义rtGoResolver闭包,它定义依赖项解析细节rtGoDeployer闭包,它定义了构件部署细节。这里有一个例子:


rtGoResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'libs-go') rtGoDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'libs-go-local', //附加自定义属性到发布的工件:properties: ['key1=value1', 'key2=value2'])

正如您在上面的例子中所看到的,解析器和部署器应该有一个惟一的ID,这样它们就可以在稍后的脚本中引用。此外,它们还包括一个Artifactory服务器ID和存储库的名称。

现在我们可以用rtGoRun注意,闭包引用了我们上面定义的解析器。

rtGoRun (path: 'path/to/the/project/root', resolverId: 'resolver-unique-id', args: 'build' //如果这里没有设置生成名称和生成编号,则将使用当前作业名称和生成编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的项目相关联时,设置项目键如下。项目:“my-project-key”)

现在已经构建了项目,您可以打包并将其作为Go包发布到Artifactory。我们使用rtGoPublish闭包使用对我们定义的部署程序的引用。

rtgpublish (path: "path/to/the/project/root ", deployerId: 'deployer-unique-id', version: '1.0.0')

您可能想做的最后一件事是发布此构建的构建信息。看到向Artifactory发布构建信息章节介绍如何做到这一点。

关于build-info的更多信息:您还可以选择自定义build-info模块名称。方法将模块属性添加到rtGoRunrtGoPublish闭包如下:

rtGoRun (path: 'path/to/the/project/root', resolverId: 'resolver-unique-id', args: 'build', module: 'my-custom-build-info-module-name')


柯南建造Artifactory

柯南是一个C/ c++包管理器。Artifactory Pipeline DSL包括一些api,这些api使您可以使用安装在构建代理上的Conan客户机轻松地运行Conan构建。以下是你需要做的,在你创建你的第一个柯南建造工作与詹金斯:

1、在Jenkins构建代理上安装最新的柯南客户端。详情请参阅柯南的文档安装说明。

2.将Conan客户端可执行文件添加到构建代理上的PATH环境变量中,以确保Jenkins能够使用客户端。

3.在Artifactory中创建一个Conan存储库柯南存储库Artifactory文档。

好的。让我们开始编写你的第一个柯南管道脚本。

让我们从创建一个Conan客户端实例开始:

rtConanClient (id: "myConanClient")

在创建Conan客户端时,还可以指定Conan用户的主目录,如下所示:

rtConanClient (id: "myConanClient", userHome: "conan/my-conan-user-home")

现在,我们可以通过向其添加Artifactory存储库来配置新的conan客户机。在我们的示例中,我们添加了'conan-local'存储库,它位于Artifactory服务器中,由预先配置的服务器ID引用:

rtConanRemote (name: "myRemoteName", serverId: "Artifactory-1", repo: "conan-local", clientId: "myConanClient", //可选-添加此参数将使conan客户端不抛出错误。如果存在具有所提供名称的现有远程服务器。force: true, //可选-添加此参数将使conan客户端跳过SSL证书的验证。verifySSL:假)

好的。我们准备好开始执行柯南命令了。您需要熟悉由Conan Client公开的Conan命令语法才能运行这些命令。您可以阅读有关命令语法的柯南的文档

让我们运行第一个命令:

rtConanRun (clientId: "myConanClient", command: "install . install ")——建立失踪”)

接下来我们要做的是使用我们创建的conan远程。例如,让我们将工件上传到conan远程。注意我们如何使用前面创建的远程的ID,它是myRemoteName

rtConanRun (clientId: "myConanClient", command: "upload *——all -r myRemoteName——confirm")

我们现在可以将buildInfo发布到Artifactory,如向Artifactory发布Build-Info部分:

rtPublishBuildInfo (serverId: "Artifactory-1")


Docker使用Artifactory构建

一般

Jenkins Artifactory插件支持管道DSL,允许从Artifactory和向Artifactory拖动和推送docker映像。同时收集并发布建筑信息给Artifactory。要设置Jenkins构建代理来为Docker构建收集构建信息,请参阅设置说明

与Docker Daemon直接工作

Jenkins Artifactory Plugin支持通过其REST API直接使用docker守护进程。请确保设置Jenkins与docker和artisasctory一起工作,如前一节所述。

接下来,让我们创建一个如图所示的Artifactory服务器实例,或者通过它进行配置管理|配置系统

rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', credentialsId: 'my-credentials-id')

接下来,介绍如何从Artifactory中提取码头映像。

从Artifactory提取Docker映像
rtDockerPull (serverId:“Artifactory-1”形象:ARTIFACTORY_DOCKER_REGISTRY + / hello world:最新的,/ /主持人:/ / OSX:“tcp: / / 127.0.0.1:1234”/ / Linux上可以省略或null主持人:HOST_NAME, sourceRepo: ' docker-remote ', / /如果构建名称和构建数字没有设置,当前工作将使用的姓名和电话号码:buildName: my-build-name, buildNumber:“17”/ /可选,只有这个构建在Artifactory关联到一个项目,把项目主要如下。Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs:“-agentlib: jdwp =运输= dt_socket, server = y,暂停= n,地址= *:5005)

下面介绍如何将图像推送到Artifactory

将Docker图像推送到Artifactory
rtDockerPush (serverId:“Artifactory-1”形象:ARTIFACTORY_DOCKER_REGISTRY + / hello world:最新的,/ /主持人:/ / OSX:“tcp: / / 127.0.0.1:1234”/ / Linux上可以省略或null主持人:HOST_NAME, targetRepo: ' docker-local ', / /自定义属性附加到发布的构件:性质:“项目名称= docker1;状态=稳定',/ /如果构建名称和构建数字没有设置,当前工作将使用的姓名和电话号码:buildName: my-build-name, buildNumber:'17', //可选-仅当此构建与Artifactory中的项目相关联时,按以下方式设置项目键。Jenkins在此步骤执行期间生成一个新的java进程。//你可以选择将任何java参数传递给这个新进程。javaArgs:“-agentlib: jdwp =运输= dt_socket, server = y,暂停= n,地址= *:5005)

最后,您可以选择将构建信息发布到Artifactory,如下所示。

rtPublishBuildInfo (serverId: 'Artifactory-1', //如果这里没有设置构建名称和构建编号,将使用当前的作业名称和编号。确保使用在rtDockerPull和/或rtDockerPush步骤中使用的相同值。buildName: 'my-build-name', buildNumber: '17', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下。项目:“my-project-key”)



使用Kaniko

rtCreateDockerBuildstep允许收集发布到Artifactory的docker映像的构建信息Kaniko.看到我们在GitHub上的kaniko项目示例去学习如何做到这一点。

使用臂

rtCreateDockerBuildstep允许收集发布到Artifactory的docker映像的构建信息t臂Maven插件.看到我们在GitHub上的maven-jib示例去学习如何做到这一点。由于此示例也使用Artifactory管道api运行maven,我们还建议参考Maven使用Artifactory进行构建部分包含在本文档页中。

使用JFrog x射线扫描构建

Jenkins Artifactory插件通过JFrog Artifactory与JFrog Xray集成,允许您扫描构建工件的漏洞和其他问题。如果发现问题或漏洞,您可以选择让构建失败。这种集成要求JFrog Artifactory v4.16及以上,JFrog x光v1.6及以上。

您可以扫描已经发布到Artifactory的任何构建。构建是什么时候发布的并不重要,只要它是在JFrog Xray触发扫描之前发布的就行。

下面的说明向您展示如何配置Pipeline脚本以扫描构建。

rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', credentialsId: 'my-credential -id') xrayScan (serverId: 'Artifactory-1', //如果这里没有设置生成名称和生成编号,将使用当前的作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此生成与Artifactory中的项目相关联时,按如下方式设置项目键。//如果发现构建易受攻击,作业将默认失败。如果你不希望它失败:failBuild: false)


管理发布包

一般

Jenkins Artifactory Plugin公开了一组用于管理和分发发布包的管道api。这些api需要2.0或更高版本的JFrog分布.这些api与JFrog Distribution的REST端点一起工作,而不是与Artifactory的REST端点一起工作。因此,建议验证JFrog Distribution是否可以通过Jenkins访问詹金斯|管理|配置系统.本节中所有示例中的serverId值都应该替换为您配置的JFrog平台ID。

为了使开始使用JFrog分发管道api更容易,您可以使用jfrog-distribution-example可用在这里

创建或更新未签名发布包

dsCreateReleaseBundle而且dsUpdateReleaseBundle步骤在JFrog Distribution上创建和更新一个发布包。这些步骤接受配置的JFrog平台ID,以及要创建的发布包名称和发布包版本。步骤也接受一个文件规范,它定义了Artifactory中要捆绑到发布包中的文件。

创建一个发布包
dsCreateReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", spec: """{"files": [{"pattern": " lilib -release-local/ artifactorypeline3 .zip"}]}""", //缺省值为"plain_text"。发布说明的语法。可以是'markdown'、'asciidoc'或'plain_text'中的一个。releaseNotesSyntax: "markdown", //可选。如果设置为true,则自动签署发布包版本。signimmediate: true, //可选。描述发布包版本的发布说明的文件的路径。releaseNotesPath: "path/to/release-notes", //可选。签名密钥的密码短语。gpgPassphrase: "abc", //可选。 A repository name at the source Artifactory instance, to store release bundle artifacts in. If not provided, Artifactory will use the default one. storingRepo: "release-bundles-1", // Optional. description: "Some desc", // Optional. Path to a file with the File Spec content. specPath: "path/to/filespec.json", // Optional. Set to true to disable communication with JFrog Distribution. dryRun: true )
更新一个发布包
dsUpdateReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", spec: """{"files": [{"pattern": " lilib -release-local/ artifactorypeline3 .zip"}]}""", //缺省值为"plain_text"。发布说明的语法。可以是'markdown'、'asciidoc'或'plain_text'中的一个。releaseNotesSyntax: "", //可选。如果设置为true,则自动签署发布包版本。signimmediate: true, //可选。描述发布包版本的发布说明的文件的路径。releaseNotesPath: "path/to/release-notes", //可选。签名密钥的密码短语。gpgPassphrase: "abc", //可选。 A repository name at the source Artifactory instance, to store release bundle artifacts in. If not provided, Artifactory will use the default one. storingRepo: "release-bundles-1", //Optional. description: "Some desc", // Optional. Path to a file with the File Spec content. specPath: "path/to/filespec.json", // Optional. Set to true to disable communication with JFrog Distribution. dryRun: true )


签署发布包

在发布包被分发之前,必须对它们进行签名。以下是签署发行包的方法。

签署一个发布包
dsSignReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", //可选的GPG passphrase: "abc", //可选的源Artifactory实例的存储库名称,用于存储发布包工件。如果没有提供,Artifactory将使用默认值。storingRepo:“release-bundles-1”)


分发发布包

下面是分发已签名发布包的方法。

发布一个发布包
dsDeleteReleaseBundle(serverId: " j青蛙-instance-1", name: "example-release-bundle", version: "1", //可选的分发规则distRules: """{"distribution_rules": [{"site_name": "*", "city_name": "*", "country_codes":["*"]}]}""" ", //可选的国家代码。不能与'distRules'一起使用countryCodes:["001", "002"], //可选站点名称。不能与'distRules'一起使用siteName: "my-site", //可选的城市名称。不能与'distRules'一起使用cityName: "New York", //可选。如果设置为true,则只有在分发完成后才返回响应。sync: true, //可选。设置为true禁用与JFrog Distribution的通信。dryRun:真}

删除发布包

下面是删除发布包的方法。

dsDeleteReleaseBundle(serverId: " j青蛙-instance-1", name: "example-release-bundle", version: "1", //可选的分发规则distRules: """{"distribution_rules": [{"site_name": "*", "city_name": "*", "country_codes":["*"]}]}""" "), //可选的国家代码。countryCodes:["001", "002"] //可选站点名称。不能与'distRules'一起使用)siteName: "my-site", //可选的城市名称。不能与'distRules'一起使用)cityName: "New York", //可选。如果设置为true,则只有在删除完成后才返回响应。sync: true, //可选。如果设置为true,发布包也将在源Artifactory实例上删除,而不仅仅是在边缘节点上。deleteFromDist: true, //可选。设置为true禁用与JFrog Distribution的通信。dryRun:真}


建立触发器

Artifactory触发允许在特定Artifactory路径中添加或修改文件时自动触发Jenkins作业。触发器定期轮询Artifactory,以检查作业是否应该被触发。你可以阅读更多在这里

您可以选择从管道中定义Artifactory Trigger。你可以这样做:

首先,创建Artifactory服务器实例,如创建Artifactory服务器实例部分。

接下来,定义如下所示的触发器:

rtBuildTrigger(serverId: "ARTIFACTORY_SERVER", spec: "*/10 * * * *",路径:"generic-lib -local/builds/starship")

当部署到Artifactory后触发作业时,您可以在Artifactory中存储在环境变量中触发作业的文件的URL。你可以这样做:

environment {RT_TRIGGER_URL = "${currentbuild . getbuildcause ('org.jfrog.hudson.trigger.ArtifactoryCause')[0]?。url} "}
  • 没有标签
版权所有©2022 JFrog有限公司