Jenkins :版本1.525
Jenkins Server URL :http://my.jenkins.server.com:9040
Linux 红帽5.3
Artifactory :免费版
Artifactory Server URL :http://my.artifactory.server:8081/Artifactory
我已成功构建Jenkins并将工件上传到我的Artifactory服务器下的相应存储库 .
发生构建时,工件(ProjectA-1.0.0.25.tar.gz)将转到libs-snapshot-local存储库下的Artifactory . 这里1.0.0表示应用程序/ jenkins作业的给定版本的主要版本,次要版本和临时版本:在这种情况下为"ProjectA" . 可以说25是内部版本号
当ProjectA构建在开发中变得稳定时,我们将该应用程序版本的给定构建推广到INT或任何其他更高的环境(QA / PrePROD等) .
在此促销过程中,我们只选择要推广和使用Jenkins Promoted Build Plugin的构建,我们能够成功完成 .
Now, what we need is:
- 在推广过程中,我想调用一个Groovy脚本,该脚本将在"ProjectA-1.0.0.25.tar.gz"成功提升为INT后删除ProjectA的1.0.0版本中Jenkins和Artifactory(libs-snapshot-local)的所有Jenkins构建 . 促销部分现在正常运作;我只需要一个Groovy脚本,它将删除Jenkins中的Jenkins构建(1.0.0.1到1.0.0.24和> = 1.0.0.25)及其与Artifactory存储库(libs-snapshot-local)相关联的工件 .
我们公司的想法是,一旦发布版本's build is promoted for an application, all other builds / artifacts we have (in Jenkins/Artifactory) - we want to delete forever using a Groovy script. Someone will ask, what if I want to promote a different build#; well in our case, we dont want that. Simple rule is, if someone promotes ProjectA-1.0.0.25.tar.gz, then, delete ProjectA'在Jenkins和Artifactory中构建/工件,其中构建/工件不是1.0.0.25并继续新版本1.1.0
具有以下功能的脚本会很棒 .
1.使用属性文件(jenkins.properties / artifactory.properties) - 其中包含一些关于主机名/用户名/密码等的变量(如果有的话) .
2.使用REST API对给定的应用程序/作业执行删除并给予发布(对于前1.0.0)
3.可以用于Jenkins / Artifactory删除 - 如果在命令提示符下,我说使用这个(Jenkins)属性文件 - 或那个(Artifatory) - 因为在这两种情况下,应用程序及其发布值都是相同的 .
4.我们知道,为了促进INT的构建(使用Jenkins推广插件),我们将始终只在libs-snapshot-release从Jenkins服务器和Artifactory服务器中删除 .
现在,如果某人升级到QA(稍后),那么神器库将是(libs-stage-local)
换句话说,我们应该调用Groovy脚本,传递一些变量/值(REST)并告诉要删除哪个应用程序/作业以及它的构建版本 . 然后,它将删除除用户将通过的构建之外的所有构建(即1.0.0.25)
我是Groovy /使用REST API的新手,为Jenkins / Artifactory做这个“删除”工作 . 如果有人已经有任何样本脚本执行此类活动,并且您可以共享,我将根据我的设置调整它,看看我是否可以在升级步骤中看到上述行为 . 我有一些时间来处理这个脚本的工作版本,会很感激一些脚本代码执行相同的任务(而不是很棒的人告诉我通过大文档/链接,我知道这将使我成为一个更好的编码器在Groovy但它会延迟这篇文章的整个目的) .
Thanks a lot.
5 回答
找到了一种方法(此时不使用REST API调用,但很快我会更新,或者你可以提供帮助) .
解决方案1 - 删除除一个构建(我们选择用于促销)之外的Jenkins作业的所有构建,因此,在促销期间,我们将在Jenkins的BUILD部分下调用“scriptler”脚本,脚本具有以下代码或创建一个单独的作业并通过传递2个参数(jobName和buildNumber - Jenkins作业中的字符串参数)来调用此脚本 .
-bash-3.2 $ cat bulkDeleteBuildsExceptOne.groovy
https://github.com/gigaaks/jenkins-scripts/blob/master/scriptler/bulkDeleteBuildsExceptOne.groovy -OR http://scriptlerweb.appspot.com/script/show/101001(Scriptler Web站点) - 这可以在远程目录脚本部分下的Jenkins Scriptler插件中看到 .
如果GITHUB人员提供一个简单的按钮/链接到PUSH我对主jenkinsci分支/存储库的更改会更容易一些 .
Though I'm still looking for 2 things:
如何在Groovy中对以下脚本进行参数化 . 使用CliBuilder,我发现class not found错误 .
如何使用Jenkins REST API调用执行此操作 . 稍后,我将使用Artifactory REST API调用执行相同的操作 .
好 . 有一点调整 . 发现如果Jenkins作业从单个作业生成多个发布/版本构建/工件(即,如果它使用Build Name Setter插件)并使用Major.minor.interim(2.75.0 for ex . )因为它的发布并为此版本生成了1-150版本,之后一旦该版本发布到INT / QA env,同样的工作是为下一版本创建1-N编号的版本(即2.75) .1或2.76.0或者等等 . )然后以下脚本就可以了 .
看到这个链接:Do not delete a Jenkins build if it's marked as "Keep this build forever" - Groovy script to delete Jenkins builds
bulkDeleteJenkinsBuildsExceptOne_OfAGivenRelease.groovy
使用REST API调用上面的脚本编写器脚本或者Jenkins作业就像:想知道我在哪里传递POST操作 .
主线是:
def artifactSearchUri = "api/build/$/$"
...我们需要调整如下:
= "api/build/Some_Jenkins_Job_That_You_Will_Create/buildWithParameters?jobName=Test_AppSvc&releaseVersion=2.75.0&buildNumber=15"
并且为了删除Artifactory构建,我们必须使用以下groovy脚本来支持上述逻辑,我仍然试图让它工作 . 我知道我很亲密 .
BLOG: http://browse.feedreader.com/c/Gridshore/11546011
Script: https://github.com/jettro/small-scripts/blob/master/groovy/artifactory/Artifactory.groovy
FINAL Answer :这包括使用Artifactor删除Artifactory中的构建工件's REST API call. This script will delete Jenkins/Artifactory builds/artifacts of a given Release/Version (as sometimes over the time - a given Jenkins job can create multiple release / version builds for ex: 2.75.0.1, 2.75.0.2, 2.75.0.3,....,2.75.0.54, 2.76.0.1, 2.76.0.2, ..., 2.76.0.16, 2.76.1.1, 2.76.1.2, ...., 2.76.1.5). In this case, for every new release of that job, we start the build# from 1 fresh. If you have to delete the all builds except one / even all (change the script a little bit for your own needs) and don't更改旧版/其他版本构建,然后使用以下脚本 .
Scriptler Catalog link :http://scriptlerweb.appspot.com/script/show/103001
Enjoy!
首先,但它没有完成 . 你为什么要删除:
一些不会伤害你的额外Jenkins构建 .
从工件存储库(名为Artifactory !!)中删除工件
既然这样说,我知道你可能还有充分的理由这样做(这很有趣) . 这是我可以提议的另一种方法:
Jenkins :我假设您正在使用Maven . 在这种情况下,您使用M2 release plugin来创建"Release Builds" . 现在这些构建将在它们旁边有一个特殊的手提箱图标,并且将是"keep this build for ever" . 您可以在Jenkins中花多少天来保存工件,保留多少构建等,并制定自己的策略以满足您的需求 .
Artifactory :我使用Nexus,因此实现可能会有所不同 . 但您可以对其进行设置,以便每次都覆盖快照构建 . 因此,您始终拥有 n 版本的发布版本和1个快照 . 第二项政策是"delete snapshot when released" . 这确保了相同编号的快照和发布在repo中不共存 . 现在这正是应该如何,并且没有理由从诸如Artifactory的存储库中删除"released"工件 . 这是发布的全部内容 .