如何在Jenkins Pipeline中使用CA Agile Central Publisher更新Rally用户故事
我之前也碰到过这个情况——自由风格任务里能轻松找到CA Agile Central Publisher的构建后操作,但Pipeline的代码片段生成器里却找不到对应的选项。其实这个插件是支持Pipeline的,只是没在生成器里显示出来,下面给你两种靠谱的解决方案:
方案1:直接使用CA Agile Central Publisher的Pipeline步骤
首先确保你安装了最新版的CA Agile Central(Rally)Jenkins插件,然后可以直接在Pipeline中调用caAgileCentralPublisher步骤,示例代码如下:
pipeline { agent any stages { stage('Build') { steps { // 替换成你的实际构建步骤,比如Maven打包 sh 'mvn clean install' } } } post { always { caAgileCentralPublisher( rallyServer: 'https://rally1.rallydev.com', apiKey: credentials('rally-api-key-cred'), // 从Jenkins凭据中读取API密钥,避免硬编码 workspaceName: '你的Rally工作区名称', projectName: '你的Rally项目名称', artifactType: 'UserStory', artifactIds: ['US12345', 'US67890'], // 要更新的用户故事ID列表 buildUrl: env.BUILD_URL, buildNumber: env.BUILD_NUMBER, buildStatus: currentBuild.result ?: 'SUCCESS', // 动态获取构建状态,默认SUCCESS buildName: '你的Jenkins任务名称' ) } } }
参数说明
apiKey:把Rally的API密钥存在Jenkins的「Secret text」凭据中,用credentials()引用凭据ID即可artifactIds:填写需要关联构建信息的User Story编号(比如US开头的ID)buildStatus:通过currentBuild.result动态获取构建状态,失败时会自动传入FAILURE,未结束的构建默认用SUCCESS
如果不确定参数细节,可以先在自由风格任务中配置好CA Agile Central Publisher,然后查看任务的config.xml文件,里面会有完整的参数映射,直接对应到Pipeline步骤即可。
方案2:通过Rally REST API手动更新
如果插件的步骤满足不了复杂的自定义需求,你可以直接调用Rally的REST API来更新User Story,灵活性更高。下面是用curl命令实现的示例:
pipeline { agent any environment { RALLY_API_KEY = credentials('rally-api-key-cred') RALLY_SERVER = 'https://rally1.rallydev.com' WORKSPACE_OID = '12345678901' // 从Rally URL中提取,比如#/12345678901/workspace/... PROJECT_OID = '98765432109' } stages { stage('Update Rally User Stories') { steps { script { def targetStories = ['US12345', 'US67890'] targetStories.each { storyId -> // 第一步:获取User Story的Rally唯一引用地址(_ref) def storyInfo = sh( script: """ curl -s -H "Authorization: Bearer ${RALLY_API_KEY}" \ "${RALLY_SERVER}/slm/webservice/v2.0/UserStory?query=(FormattedID = \"${storyId}\")&workspace=${WORKSPACE_OID}&project=${PROJECT_OID}&fetch=ObjectID" """, returnStdout: true ) def storyRef = new groovy.json.JsonSlurper().parseText(storyInfo).QueryResult.Results[0]._ref def storyObjectId = storyRef.split('/').last() // 第二步:更新User Story的Build字段,关联Jenkins构建信息 def updateResult = sh( script: """ curl -s -X POST -H "Authorization: Bearer ${RALLY_API_KEY}" \ -H "Content-Type: application/json" \ "${RALLY_SERVER}/slm/webservice/v2.0/UserStory/${storyObjectId}" \ -d '{ "UserStory": { "Build": "Build ${env.BUILD_NUMBER} - ${env.BUILD_URL}" } }' """, returnStdout: true ) echo "更新User Story ${storyId}的结果:${updateResult}" } } } } } }
注意事项
- 确保Jenkins服务器能访问Rally的API地址(https://rally1.rallydev.com)
- Rally的API密钥需要拥有目标User Story的编辑权限
- 所有敏感信息(API密钥、OID)都要通过Jenkins凭据管理,绝对不要硬编码在Pipeline中
内容的提问来源于stack exchange,提问作者YK S
相关产品推荐
相关产品推荐

