【发布时间】:2011-07-01 08:56:46
【问题描述】:
是否可以通过编程/自动方式在 Teamcity 中固定构建? 如果部署构建成功,我想固定构建。
【问题讨论】:
是否可以通过编程/自动方式在 Teamcity 中固定构建? 如果部署构建成功,我想固定构建。
【问题讨论】:
刚刚通过REST API发现它可能 我可以 f.ex 发送这样的 PUT 命令 http://teamcityserver:81/httpAuth/app/rest/builds/id:688/pin/ 然后将固定 ID 为 688 (teamcity.build.id) 的构建。
【讨论】:
http://YourServer:Port/guestAuth/app/rest/builds/id:688/pin/。不过,我会对您在访客身份验证下允许的权限非常谨慎。
我想用一个最新的答案来挑战接受的答案,该答案已经过 TeamCity 9 EAP 4(内部版本 31717)和 8.1.x 测试。
标记和固定可以通过一个简单的插件来实现,该插件仅包含一个事件适配器,如下所示:
package com.foo;
import com.intellij.openapi.diagnostic.Logger;
import jetbrains.buildServer.messages.Status;
import jetbrains.buildServer.serverSide.BuildServerAdapter;
import jetbrains.buildServer.serverSide.BuildServerListener;
import jetbrains.buildServer.serverSide.SRunningBuild;
import jetbrains.buildServer.util.EventDispatcher;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Map;
public class MyEventAdapter extends BuildServerAdapter
{
private final static Logger logger = Logger.getInstance(MyEventAdapter.class.getName());
public MyEventAdapter(@NotNull EventDispatcher<BuildServerListener> serverDispatcher)
{
serverDispatcher.addListener(this);
}
@Override
public void buildFinished(@NotNull SRunningBuild build)
{
logger.debug("#");
logger.debug("# Build finished: ");
logger.debug("# name: " + build.getBuildTypeName() + ";" +
" id: " + build.getBuildId() + ";" +
" build number: " + build.getBuildNumber() + "; " +
" owner: " + build.getTriggeredBy().getUser().getName());
logger.debug("# status: " + build.getBuildStatus());
logger.debug("# ---------------------------------------------------");
super.buildFinished(build);
if (build.getBuildStatus().equals(Status.NORMAL))
{
if (someConditionCheckWhetherToTagAndPinGoesHere())
{
final String tag = "dev";
// Pin the build:
if (build.getBuildType() != null && build.getBuildType().getLastChangesSuccessfullyFinished() != null)
{
build.getBuildType().getLastChangesSuccessfullyFinished().setPinned(true, build.getOwner(), "This is a " + tag + " build.");
}
// Tag the build:
build.setTags(build.getOwner(), Arrays.asList(tag));
}
}
}
}
您还需要在 src/main/resources/META-INF/my-plugin.xml 下有一个 Spring 上下文:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="constructor">
<bean class="com.foo.MyEventAdapter"/>
</beans>
【讨论】:
受 carlspring 回答的启发,我编写了一个小型 teamcity 插件,它以编程方式将标签添加到您的构建中:
https://github.com/echocat/teamcity-buildTagsViaBuildLog-plugin
您可以轻松修改它以固定您的构建。此外,标记您成功的构建而不是固定它们并将标签用作过滤器可能会有所帮助。
【讨论】:
curl --user ${username}:${password} -X POST --data "${tags}" %teamcity.serverUrl%/httpAuth/app/rest/8.0/builds/id:%teamcity.build.id%/tags --header "Content-Type: text/plain" 实际上,可以从上面的 curl 调用中创建一个元运行器,并从构建步骤标记运行构建。 Jetbrains 甚至有一个 metarunner 电源包,它有一个使用 ant 的类似 metarunner。
如果你愿意安装一个插件,我写了一个能够基于构建功能或系统消息以编程方式标记和固定构建的插件。
【讨论】: