以编程方式在Teamcity中固定构建

11

是否可以通过编程/自动化方式将构建固定在Teamcity中? 如果Deploy-build成功,我想要将构建固定。

4个回答

4

我想用最新的答案挑战被接受的答案,这个答案是使用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>

4

@RickardN:你可以使用guestAuth:http://YourServer:Port/guestAuth/app/rest/builds/id:688/pin/。但是,在允许guest身份验证下的权限时,我会非常谨慎。 - Mike Bailey

3

受carlspring回答的启发,我编写了一个小型的teamcity插件,可以通过程序将标签添加到构建中:

https://github.com/echocat/teamcity-buildTagsViaBuildLog-plugin

您可以轻松修改它以固定您的构建。此外,将成功的构建标记而不是固定它们并使用标记作为过滤器可能会有所帮助。


插件需要您在构建日志中放置一些内容才能正常工作,这可以通过从构建步骤中进行curl调用来完成。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甚至有一个元运行器Power Pack,其中包含使用ant的类似元运行器。 - Amit

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接