创建人工服务器实例
有两种方法可以告诉管道脚本要使用哪个Artifactory服务器。可以将服务器详细信息定义为管道脚本的一部分,也可以将服务器详细信息定义为管理|配置系统.
如果您选择在管道中定义Artifactory服务器,请向脚本添加以下内容:
rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', //如果你正在使用用户名和密码:用户名:'user',密码:'password', //如果你正在使用凭据id: credentialsId: ' ccrecreeddeennttiiaall ', //如果Jenkins被配置为使用http代理,你可以绕过代理时使用这个Artifactory服务器:bypassProxy: true, //配置连接超时(以秒为单位)。//默认值(如果未配置)为300秒:timeout: 300)
你也可以使用Jenkins Credential ID代替用户名和密码:
的id属性(Artifactory-1在上面的示例中)是此服务器的唯一标识符,允许我们稍后在脚本中引用此服务器。如果您喜欢将服务器定义为管理|配置系统,你不需要加rtServerit定义如上所示。您可以使用其配置的引用服务器服务器ID.
上传和下载文件
要下载这些文件,请在管道脚本中添加以下闭包:
rtDownload (serverId: 'Artifactory-1', spec: " '{"files": [{"pattern": "bazinga-repo/frog -files/", "target": "bazinga/"}]} " ', //可选-将下载的文件与以下自定义构建名称和构建编号相关联,//作为构建依赖项。//如果没有设置,文件将与默认的构建名称和构建号(即// Jenkins作业名称和编号)相关联。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目密钥如下。项目:'my-project-key')
在上面的示例中,文件是从Artifactory服务器下载的Artifactory-1服务器ID。
上面的闭包还包括一个文件规范,它指定应该下载哪些文件。在本例中,目录中的所有ZIP文件bazinga-repo froggy-files /人工路径应该下载到bazinga目录。
上传文件非常相似。下面的示例上传所有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闭包。这允许在源代码控制中管理文件规范,也可以使用项目源代码。下面是访问文件规范的方法rtUpload.的配置类似rtDownload关闭:
rtUpload (serverId: 'Artifactory-1', specPath: 'path/to/spec/relative/to/workspace/spec. ')//可选-将上传的文件与以下自定义构建名称和构建号关联。//如果没有设置,文件将与默认的构建名称和构建号(即// Jenkins作业名称和编号)相关联。buildName: 'holyFrog', buildNumber: '42', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目密钥如下。项目:'my-project-key')
您可以阅读有关使用文件规格下载和上传文件在这里.
如果您希望在没有上传或下载文件的情况下使构建失败,请将failNoOp属性添加到rtUpload或rtDownload闭包如下:
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. ')json', props: 'p1=v1;p2=v2', failNoOp: true)
在上面的例子中:
- 的serverId属性用于引用预配置的Artifactory服务器实例,如创建Artifactory服务器实例部分中所述。
- 的specPath属性包括指向文件规范的路径,该文件规范具有与用于下载文件的文件规范相似的结构。
- 的道具属性定义了我们想要设置的属性。在上面的例子中,我们分别用v1和v2值设置了两个属性——p1和p2。
- 的failNoOp属性是可选的。如果没有设置任何属性,将其设置为true将导致作业失败。
您还可以在rtSetProps闭包中直接指定File Spec,如下所示。
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. ')json', props: 'p1,p2,p3', failNoOp: true)
与rtSetProps闭包类似,File Spec可以隐式地定义在闭包内部,如下所示:
rtDeleteProps (serverId: 'Artifactory-1', props: 'p1,p2,p3', spec: ''{"files": [{"pattern": "my-frog -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')
如果您如上所示设置了自定义构建名称和编号,请确保在rtUpload或rtDownload闭包如下所示。如果不这样做,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。
你可以用通配符添加更多的include/exclude模式,如下所示:
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) -在删除构建时也删除构建工件。deletebuilartifacts: true, //可选-构建名称和构建号。如果未设置,则使用Jenkins作业的构建名称和构建号。buildName: 'my-build', buildNumber: '20', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下。项目:'my-project-key')
收集构建问题
构建信息可以包括作为构建的一部分处理的问题。问题列表是由Jenkins从git提交消息中自动收集的。这要求项目开发人员使用一致的提交消息格式,其中包括问题ID和问题摘要,例如:
HAP-1364 -将制表符替换为空格
然后可以在Artifactory的构建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"}} ",)
在上面的例子中,issues配置被嵌入到rtcollectissue闭包中。您还可以选择提供包含问题配置的文件。你应该这样做:
rtcollectissue (serverId: 'Artifactory-1', configPath: '/path/to/config. conf ')json”)
如果您想将问题信息添加到特定的构建信息中,您还可以提供构建名称和构建编号,如下所示:
rtcollectissue (serverId: 'Artifactory-1', configPath: '/path/to/config' buildName: 'my-build', buildNumber: '20', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目密钥如下。项目:'my-project-key')
为了帮助您开始,我们建议使用Github的例子.
聚合构建
发布到Artifactory的构建信息可以包含表示不同构建步骤的多个模块。正如本节前面所示,您只需要将相同的buildName和buildNumber传递给所有需要它的步骤(rtUpload例如)。
但是,如果构建过程在多台机器上运行,或者分布在不同的时间段,会发生什么情况?如何将所有构建步骤聚合到一个构建信息中?
当构建过程在多台机器上运行或分布在不同的时间段时,您可以选择为构建过程的每个部分创建和发布单独的构建信息,然后将所有已发布的构建信息聚合到一个构建信息中。最终的结果是一个build-info引用了其他先前发布的build-info。
在下面的例子中,我们的管道脚本向Artifactory发布了两个build-info实例:
rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'my-app-linux', buildNumber: '1') rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'my-app-windows', 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') //将聚合的构建信息发布到ArtifactoryrtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'final', buildNumber: '1')
如果Artifactory中发布的构建与项目相关联,则应该将项目密钥添加到rtBuildAppend和rtPublishBuildInfo步骤如下。
rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-linux', appendBuildNumber: '1', buildName: 'final', buildNumber: '1', project: 'my-project-key') rtBuildAppend(//必选:serverId: 'Artifactory-1', appendBuildName: 'my-app-windows', appendBuildNumber: '1', buildName: 'final', buildNumber: '1', project: 'my-project-key') //将聚合的构建信息发布到Artifactory。rtPublishBuildInfo (serverId: 'Artifactory-1', buildName: 'final', buildNumber: '1', project: 'my-project-key')
构建提升和x射线构建扫描目前不支持聚合构建。
在Artifactory中促进构建
要在Artifactory中提升存储库之间的构建,请在rtPromote例如:
rtPromote(//必选参数buildName: 'MK', buildNumber: '48', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目键如下。project: 'my-project-key', //来自Jenkins配置的Artifactory服务器ID,或者来自管道脚本中的配置serverId: 'Artifactory-1', // Artifactory目标存储库的名称targetRepo: 'lib -release-local', //可选参数//评论和状态将显示在Artifactory的Build History选项卡中评论:'这是推广评论',状态:'已发布',//指定构建工件的源存储库。sourceRepo: 'lib -snapshot-local', //指示除了构件之外是否提升构建依赖项。默认为False。includeDependencies: true, //当移动或复制文件失败时,是否使升级进程失败。默认为False failFast: true, //是否复制。Move是默认值。副本:true)
允许发布版本的交互式推广
的在Artifactory中促进构建部分描述了您的Pipeline脚本如何在Artifactory中促进构建。然而,在某些情况下,您希望在构建完成后执行构建提升。您可以配置Pipeline作业,将其发布到Artifactory的部分或全部构建公开,以便以后可以使用GUI交互式地提升它们。以下是互动推广的内容:
当构建完成时,可以通过单击构建运行旁边的升级图标来访问升级窗口。要为已发布的构建启用交互式推广,请添加rtAddInteractivePromotion如下所示。
rtAddInteractivePromotion(//必选参数//来自Jenkins配置的Artifactory服务器ID,或者来自流水线脚本中的配置serverId: 'Artifactory-1', buildName: 'MK', buildNumber: '48', //仅当此构建与Artifactory中的项目相关联时,设置项目键如下。如果设置了,提升窗口将显示这个标签,而不是构建名称和编号。displayName: 'Promote me please', // Artifactory目标存储库的名称targetRepo: 'lib -release-local ' //评论和状态将显示在Artifactory的Build History选项卡中评论:'这是推广评论',状态:'已发布',//指定构建工件的源存储库。sourceRepo: 'lib -snapshot-local', //指示除了构件之外是否提升构建依赖项。默认为False。includeDependencies: true, //当移动或复制文件失败时,是否使升级进程失败。默认为False failFast: true, //是否复制。Move是默认值。副本:true)
你可以加上多个rtAddInteractivePromotion闭包,以便在提升窗口中包含多个构建。
使用Artifactory构建Maven
Maven构建可以解析依赖关系、部署构件并向Artifactory发布构建信息。
Maven的兼容性
- 支持的Maven最低版本是3.3.9
- 对Artifacts的部署由部署和安装阶段触发。
要从Pipeline脚本中使用Artifactory运行Maven构建,首先需要创建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配置的工具名称。tool: MAVEN_TOOL, //如果你想要构建使用Maven Wrapper,设置为true。useWrapper: true, pom: ' Maven -example/pom.xml',目标:'clean install', // Maven选项。options: '- xms1024m - xmx4096m ', resolverId: 'resolver-unique-id', deployerId: ' deplover -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'}
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到Artifactory章节介绍如何进行。
Gradle build with Artifactory
Gradle构建可以解析依赖关系、部署构件并将构建信息发布到Artifactory。
Gradle兼容性
支持的Gradle最低版本是4.10
要从您的Pipeline脚本中使用Artifactory运行Gradle构建,您首先需要创建一个Artifactory服务器实例,如创建人工服务器实例部分。
下一步是定义一个rtGradleResolver闭包,它定义依赖项解析细节,以及rtGradleDeployer闭包,它定义了构件的部署细节。这里有一个例子:
rtGradleResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'jcenter-remote') rtGradleDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'lib -snapshot-local', //可选-默认情况下,3个线程用于上传工件到Artifactory。你可以通过设置:threads: 6来覆盖这个默认值,//可选-为发布的工件附加自定义属性:properties: ['key1=value1', 'key2=value2'], //可选- Gradle允许通过定义发布作为Gradle构建脚本的一部分来自定义部署的工件列表。// Gradle的发布是用来将工件分组在一起的。您可以选择定义Jenkins应该使用哪个已定义的发布。只有按这些发布分组的工件才会被部署到Artifactory。//如果不定义发布,则使用默认发布,其中包括java项目生成的工件列表。//下面是定义出版物列表的方法。如果你想从gradle脚本中定义的所有出版物中部署工件,你可以设置"ALL_PUBLICATIONS"字符串如下// publications: ["ALL_PUBLICATIONS"])
正如您在上面的示例中看到的,解析器和部署器应该有一个唯一的ID,以便稍后在脚本中引用它们。此外,它们还包括一个Artifactory服务器ID以及版本和快照maven存储库的名称。
如果您正在使用gradle构建一个项目,该项目将生成maven构件,那么您还可以选择定义两个部署存储库作为组件的一部分rtGradleDeployer闭包——一个存储库用于快照工件,另一个用于发布工件。你是这样定义它的:
rtGradleDeployer (id: 'deployer-unique-id', serverId: 'Artifactory-1', releaseRepo: 'lib -release', snapshotRepo: 'lib -snapshot')
现在我们可以运行Gradle构建,引用我们定义的解析器和部署器:
rtGradleRun(//如果Artifactory Plugin已经在构建脚本中定义,则设置为true。usesPlugin: true, // Jenkins配置中的工具名。tool: GRADLE_TOOL, //如果你想要构建使用Gradle Wrapper,设置为true。userwrapper: true, rootDir: 'gradle-examples/gradle-example/', buildFile: 'build. exe '。gradle', tasks: 'clean artifactoryPublish', resolverId: 'resolver-unique-id', deployerId: ' deplover -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'}
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到Artifactory章节介绍如何进行。
您还可以选择在gradle构建脚本中定义默认值。阅读更多在这里.
使用Artifactory构建Python
Python构建可以解析依赖关系、部署构件并向Artifactory发布构建信息。要使用Artifactory运行Python构建,请遵循以下步骤,以确保您的Jenkins代理已准备就绪:
- 确保Python已安装在生成代理上,并且python命令在PATH中。
- 安装皮普.你可以使用皮普的文档也使用pip和虚拟环境安装软件包.
- 确保轮和setuptools安装。你可以使用安装软件包文档.
- 通过从终端运行以下命令来验证构建代理是否准备就绪:
输出Python版本:> Python——version输出pip版本:> pip——version检查wheel是否安装:> wheel -h检查setuptools是否安装:> pip show setuptools检查虚拟环境是否激活:> echo $VIRTUAL_ENV
要从Pipeline脚本运行Python构建,首先需要创建一个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/requirements.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闭包,如上传和下载文件节。
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到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发布构建信息。
- 根据您想使用的客户端,请确保nuget或dotnet客户端包含在构建代理的PATH中。
- 如果你在用dotnet客户端,请注意支持的最低版本是。net Core 3.1.200 SDK。
要从Pipeline脚本中使用Artifactory运行NuGet / DotNet Core构建,首先需要创建一个Artifactory服务器实例,如创建人工服务器实例部分。
下一步是定义一个rtNugetResolver或rtDotnetResolver(取决于您使用的是使用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和存储库的名称。
现在我们可以用rtNugetRun或rtDotnetRun闭包,以解析NuGet依赖项。注意,闭包引用了我们上面定义的解析器。
rtnugerun (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" //如果此处未设置构建名称和构建号,则使用当前作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目密钥如下。project: 'my-project-key') //或者rtDotnetRun (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" // 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闭包,如上传和下载文件节。
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到Artifactory章节介绍如何进行。
关于build-info的更多信息:您还可以选择自定义build-info模块名称。你可以通过加上模块属性赋给rtNugetRun或rtDotnetRun闭包如下:
rtnugerun (resolverId: "resolver-unique-id", args: "restore ./示例。, module: 'my-custom-build-info-module-name')// OR rtDotnetRun ( resolverId: "resolver-unique-id", args: "restore ./Examples.sln", module: 'my-custom-build-info-module-name' )
使用Artifactory构建NPM
NPM构建可以解析依赖关系、部署构件并向Artifactory发布构建信息。要从Pipeline脚本中使用Artifactory运行NPM构建,首先需要创建一个Artifactory服务器实例,如创建人工服务器实例部分。
下一步是定义一个rtNpmResolver闭包,它定义依赖项解析细节,以及rtNpmDeployer闭包,它定义了构件的部署细节。这里有一个例子:
rtNpmResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'lib -npm-local') rtNpmDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'lib -npm-local', //为发布的工件附加自定义属性:properties: ['key1=value1', 'key2=value2'])
正如您在上面的示例中看到的那样,解析器和部署器应该具有唯一的ID,以便稍后在脚本中引用它们。此外,它们还包括Artifactory服务器ID和存储库的名称。
现在我们可以用rtNpmInstall或rtNpmCi闭包,以解决NPM依赖。注意,闭包引用了我们上面定义的解析器。
rtNpmInstall (// Jenkins配置工具的可选工具名:NPM_TOOL, //项目根目录的可选路径。如果未设置,则假定工作区的根路径为根项目路径。path: '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', //项目根目录的可选路径。如果未设置,则假定工作区的根路径为根项目路径。//在这一步的执行中,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可执行文件。
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到Artifactory章节介绍如何进行。
关于build-info的更多信息:您还可以选择自定义build-info模块名称。你可以通过加上模块属性赋给rtNpmInstall或rtNpmPublish闭包如下:
rtNpmInstall (tool: 'npm-tool-name', path: 'npm-example', resolverId: 'resolver-unique-id', module: 'my-custom-build-info-module-name') rtNpmPublish (tool: 'npm-tool-name', path: 'npm-example', deployerId: ' deplover -unique-id' module: 'my-custom-build-info-module-name')
使用Artifactory进行构建
在构建Go项目时,Jenkins可以解析依赖关系,部署工件并将构建信息发布到Artifactory。
请确保go客户端包含在构建代理的PATH中。
要从您的Pipeline脚本运行带有Artifactory的Go构建,您首先需要创建一个Artifactory服务器实例,如创建人工服务器实例部分。
下一步是定义一个rtGoResolver闭包,它定义依赖项解析细节,以及rtGoDeployer闭包,它定义了构件的部署细节。这里有一个例子:
rtGoResolver (id: 'resolver-unique-id', serverId: 'Artifactory-1', repo: 'lib -go-local') rtGoDeployer (id: ' deplover -unique-id', serverId: 'Artifactory-1', repo: 'lib -go-local', //将自定义属性附加到发布的工件:属性:['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闭包,引用我们定义的部署器。
rtgoppublish (path: "path/to/the/project/root ", deployerId: " deploy- unique-id ", version: " 1.0.0 ")
您可能想要做的最后一件事是发布此构建的build-info。看到发布构建信息到Artifactory章节介绍如何进行。
关于build-info的更多信息:您还可以选择自定义build-info模块名称。方法中添加模块属性rtGoRun或rtGoPublish闭包如下:
rtgoppublish (path: 'path/to/the/project/root', resolverId: 'resolver-unique-id', args: 'build', module: 'my-custom-build-info-module-name') rtgoppublish (path: 'path/to/the/project/root', deployerId: ' deplover -unique-id', version: '1.0.0', module: 'my-custom-build-info-module-name')
柯南和Artifactory一起建造
柯南是一个C/ c++包管理器。Artifactory Pipeline DSL包括一些api,这些api使您可以使用安装在构建代理上的Conan Client轻松运行Conan构建。在使用Jenkins创建你的第一个柯南构建工作之前,你需要做的是:
1、在Jenkins构建代理上安装最新的柯南客户端。请参阅柯南的文档有关安装说明。
2.将Conan Client可执行文件添加到构建代理的PATH环境变量中,以确保Jenkins能够使用该客户端。
3.中所描述的在Artifactory中创建一个Conan存储库柯南存储库Artifactory文档。
好的。让我们开始编写第一个柯南管道脚本。
让我们从创建一个柯南客户端实例开始:
rtConanClient (id: "myConanClient")
在创建Conan客户端时,您还可以指定Conan用户的主目录,如下所示:
rtConanClient (id: "myConanClient", userHome: "conan/my-conan-user-home")
现在,我们可以通过向新的conan客户端添加一个Artifactory存储库来配置它。在我们的示例中,我们添加了'conan-local'存储库,位于Artifactory服务器中,由预配置的服务器ID引用:
rtConanRemote (name: "myRemoteName", serverId: "Artifactory-1", repo: "conan-local", clientId: "myConanClient", //可选-添加此参数将使conan客户端不会引发错误。如果存在具有所提供名称的现有远程。force: true, //可选-添加此参数将使conan客户端跳过SSL证书的验证。verifySSL: false)
好的。我们已经准备好开始运行柯南命令了。您需要熟悉Conan命令语法,它由Conan Client公开以运行命令。中的命令语法柯南的文档.
让我们运行第一个命令:
rtConanRun (clientId: "myConanClient", command: "install . exe ")——build missing”)
接下来我们要做的是使用我们创建的柯南远程。例如,让我们把我们的文物上传到柯南遥控器。注意我们是如何使用前面创建的远程的ID的,它是myRemoteName:
rtConanRun (clientId: "myConanClient", command: "upload *——all -r myRemoteName——confirm")
我们现在可以将buildInfo发布到Artifactory,如将构建信息发布到Artifactory部分:
rtPublishBuildInfo (serverId: "Artifactory-1")
Docker使用Artifactory构建
一般
Jenkins Artifactory插件支持管道DSL,允许从Artifactory中提取和推送docker映像。同时收集和发布构建信息到Artifactory。要设置Jenkins构建代理来收集Docker构建的构建信息,请参考设置说明.
直接使用Docker守护进程
Jenkins Artifactory Plugin支持通过其REST API直接与docker守护进程一起工作。请确保设置Jenkins与docker和artifacts一起工作,就像上一节提到的那样。
接下来,让我们创建如图所示的Artifactory服务器实例,或者通过以下方式配置它管理|配置系统.
rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', credentialsId: 'my-credentials-id')
接下来,下面是如何从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关联到一个项目,把项目主要如下。project: 'my-project-key', // Jenkins在这一步的执行过程中生成一个新的java进程。//您可以选择将任何java参数传递给这个新进程。javaArgs: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005')
下面是将图像推送到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中的项目相关联时,按如下方式设置项目密钥。project: 'my-project-key', // Jenkins在这一步的执行过程中生成一个新的java进程。//您可以选择将任何java参数传递给这个新进程。javaArgs: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005')
最后,您可以选择将构建信息发布到Artifactory,如下所示。
rtPublishBuildInfo (serverId: 'Artifactory-1', //如果此处未设置构建名称和构建号,则使用当前的作业名称和编号。确保使用与rtDockerPull和/或rtDockerPush步骤相同的值。buildName: 'my-build-name', buildNumber: '17', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目关键字如下。项目:'my-project-key',)
使用Kaniko
的rtCreateDockerBuild步骤允许收集发布到Artifactory的docker映像的构建信息Kaniko.看到我们在GitHub上的kaniko项目示例去学习怎么做。
使用臂
的rtCreateDockerBuild步骤允许收集发布到Artifactory的docker映像的构建信息t他JIB Maven插件.看到我们在GitHub上的maven-jib示例去学习怎么做。由于此示例还使用Artifactory管道api运行maven,因此我们还建议参考使用Artifactory构建Maven节包含在本文档页面中。
扫描构建与JFrog x射线
Jenkins Artifactory插件通过JFrog Artifactory与JFrog Xray集成,允许您扫描构建工件的漏洞和其他问题。如果发现问题或漏洞,您可以选择使构建失败。这种集成需要JFrog Artifactory v4.16在这之上JFrog Xray v1.6及以上。
您可以扫描已发布到Artifactory的任何构建版本。何时发布构建并不重要,只要它在触发JFrog x射线扫描之前发布即可。
以下说明向您展示如何配置Pipeline脚本以扫描构建。
rtServer (id: 'Artifactory-1', url: 'http://my-artifactory-domain/artifactory', credentialsId: 'my-credentials-id') xrayScan (serverId: 'Artifactory-1', //如果此处未设置构建名称和构建编号,则使用当前作业名称和编号:buildName: 'my-build-name', buildNumber: '17', //可选-仅当此构建与Artifactory中的项目相关联时,设置项目密钥如下。project: 'my-project-key', //如果发现构建是脆弱的,作业将默认失败。如果你不希望它失败:failBuild: false)
管理发布包
一般
Jenkins Artifactory Plugin提供了一组用于管理和分发发布包的管道api。这些api需要2.0或更高版本的JFrog分布.这些api使用JFrog Distribution的REST端点,而不是Artifactory REST端点。因此,建议通过以下方式验证是否可以从Jenkins访问JFrog发行版詹金斯|管理|配置系统.本节中所有示例中的serverId值都应该替换为您配置的JFrog平台ID。
为了更容易地开始使用JFrog分发管道api,您可以使用jfrog-distribution-example可用在这里.
创建或更新未签名的发布包
的dsCreateReleaseBundle和dsUpdateReleaseBundle步骤在JFrog发行版上创建和更新一个发布包。这些步骤接受已配置的JFrog平台ID以及要创建的发布包名称和发布包版本。这些步骤也接受a文件规范,它定义了Artifactory中要绑定到发布包中的文件。
dsCreateReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", spec: """{"files": [{"pattern": "lib -release-local/ artifactoryppipeline .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": "lib -release-local/ artifactoryppipeline .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 gpgPassphrase: "abc", //可选源Artifactory实例的存储库名称,用于存储发布包中的工件。如果没有提供,Artifactory将使用默认的。storingRepo: "release-bundle -1")
发布发布包
下面是发布已签名发布包的方法。
dsDeleteReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", //可选分发规则分发规则:"""{"distribution_rules": [{"site_name": "*", "city_name": "*", "country_codes":["*"]}]}""" ", //可选国家代码。不能与'distRules'一起使用。countryCodes:["001", "002"], //可选站点名称。siteName: "my-site", //可选城市名。不能与'distRules'一起使用cityName: "New York", //可选。如果设置为true,则只有在分发完成后才返回响应。sync: true, //可选。设置为true将禁用与JFrog Distribution的通信。dryRun: true}
删除发布包
下面是删除发布包的方法。
dsDeleteReleaseBundle(serverId: "jfrog-instance-1", name: "example-release-bundle", version: "1", //可选分发规则distRules: """{"distribution_rules": [{"site_name": "*", "city_name": "*", "country_codes":["*"]}]}""" "), //可选国家代码。不能与'distRules'一起使用)countryCodes:["001", "002"] //可选站点名称。siteName: "my-site", //可选城市名称。不能与'distRules'一起使用)cityName: "New York", //可选。如果设置为true,则只有在删除完成后才返回响应。sync: true, //可选。如果设置为true,发布包也将在源Artifactory实例上被删除,而不仅仅是在边缘节点上。deleteFromDist: true, //可选。设置为true将禁用与JFrog Distribution的通信。dryRun: true}
建立触发器
的Artifactory触发允许在特定Artifactory路径中添加或修改文件时自动触发Jenkins作业。触发器定期轮询Artifactory以检查是否应该触发作业。你可以读到更多在这里.
您可以选择在管道中定义Artifactory Trigger。你应该这样做:
首先,创建Artifactory服务器实例,如创建人工服务器实例部分。
接下来,定义触发器,如下所示:
rtBuildTrigger(serverId: "ARTIFACTORY_SERVER", spec: "*/10 * * * *", paths: " general -lib -local/builds/starship")
当作业在部署到Artifactory后被触发时,您可以将触发作业的Artifactory文件的URL存储在环境变量中。你应该这样做:
. environment {RT_TRIGGER_URL = "${currentBuild.getBuildCauses('org.jfrog.hudson.trigger.ArtifactoryCause')[0]?url} "}