2016-08-02 10 views
1

Я знаю, что можно вручную отключить или удалить агента на странице агентов Bamboo. Я пишу плагин Bamboo, который должен удалять агенты Bamboo, когда сборка завершена. Кажется, что нет прямого способа сделать это с использованием Bamboo REST API или SDK-библиотеки.Есть ли способ удалить агент Bamboo с помощью API Atlassian Bamboo SDK или Bamboo REST API?

Пожалуйста, помогите.

Спасибо, Сварог Донепуди.

+0

Хороший вопрос, вы нашли решение тем временем? –

ответ

2

WE (Atlassian Постройте Engineering) делают что-то подобное в наших плагинов, которые мы недавно открытым исходным кодом на https://bitbucket.org/atlassian/per-build-container

Мы создаем на основе Docker удаленных агентов по требованию, они строят работу, а затем удаляются.

+0

Я вижу, что вы используете ExecutableAgentsHelper для получения списка агентов, соответствующих набору требований. Я предполагаю, что объект ExecutableAgentsHelper создается при инициализации класса Reaper. Не могли бы вы помочь мне понять, как создать экземпляр ExecutableAgentsHelper в других классах? 'public class Reaper реализует LifecycleAware { закрытый финальный плагин PluginScheduler pluginScheduler; закрытый конечный исполняемый файлAgentsHelper executableAgentsHelper; private final AgentManager agentManager; ' –

+0

ExecutableAgentsHelper должен автоматически вводиться в любой из ваших компонентов автоматически. Как и в случае с классом Reaper. Но это немного не связано с первоначальным вопросом. Вы хотели удалить/отключить агент, это то, что в основном делает класс AgentRemovals - https://bitbucket.org/atlassian/per-build-container/src/22d3925f857b841159aa85b040270d5e2b2eabc7/bamboo-isolated-docker-plugin/src/main/java /com/atlassian/buildeng/isolated/docker/AgentRemovals.java?at=master&fileviewer=file-view-default – mkleint

+0

Что нужно отметить и что мы только что сожгли недавно, это то, что ExecutableAgentsHelper является внутренним api, а не общедоступным и может изменяться без уведомление. и действительно, между 6.1 и будущим 6.2 – mkleint

0

Это довольно измененная версия того, что я нашел в https://bitbucket.org/atlassian/per-build-container, которой поделился @mkleint. Я добавил запрос, чтобы получить список агентов на основе требований к работе.

import com.atlassian.bamboo.plan.ExecutableAgentsHelper; 
import com.atlassian.bamboo.buildqueue.manager.AgentManager; 
import com.atlassian.bamboo.v2.build.agent.AgentCommandSender; 
import com.atlassian.bamboo.v2.build.agent.BuildAgent; 
import com.atlassian.bamboo.v2.build.agent.messages.StopAgentNicelyMessage; 

class DeleteAgent{ 
    private AgentManager agentManager; 
    private AgentCommandSender agentCommandSender; 

    //Atlassian managed object and will be auto injected when this setter is found 
    public void setAgentManager(AgentManager agentManager) { 
    this.agentManager = agentManager; 
    } 

    //Atlassian managed object and will be auto injected when this setter is found 
    public void setAgentCommandSender(AgentCommandSender agentCommandSender) { 
     this.agentCommandSender = agentCommandSender; 
    } 

    public static void main(String[] args) { 
    RequirementSetImpl reqs = new RequirementSetImpl(); 
    reqs.addRequirement(new RequirementImpl("requirement-key","requirement-value"); 
    reqs.addRequirement(new RequirementImpl("requirement-key","requirement-value"); 
    Collection<BuildAgent> agentsToBeDeleted = executableAgentsHelper.getExecutableAgents(ExecutableAgentsHelper.ExecutorQuery.newQuery(reqs)); 
    Iterator<BuildAgent> agentsToBeDeletedIterator = agentsToBeDeleted.iterator(); 
    while(agentsToBeDeletedIterator.hasNext()) { 
     this.deleteSingleAgentOnBambooServer(agentsToBeDeletedIterator.next()); 
    } 
    } 

    private void deleteSingleAgentOnBambooServer(BuildAgent agent) { 
    if(agent!=null) { 
     this.stopAgentRemotely(agent.getId()); 
     this.removeAgent(agent); 
    } 
    } 

    public void stopAgentRemotely(BuildAgent buildAgent) { 
    Long agentId = buildAgent.getId(); 
    String agentName = buildAgent.getName(); 
    buildAgent.setRequestedToBeStopped(true); 
    agentCommandSender.send(new StopAgentNicelyMessage(), agentId); 
} 

public void stopAgentRemotely(long agentId) { 
    BuildAgent ba = agentManager.getAgent(agentId); 
    if (ba != null) { 
     stopAgentRemotely(ba); 
    } 
} 

public void removeAgent(BuildAgent agent) { 
    if (agent != null) { 
     removeAgent(agent.getId()); 
    } 
} 

public synchronized void removeAgent(long agentId) { 
    BuildAgent ba = agentManager.getAgent(agentId); 
    if (ba != null) { 
     String agentName = ba.getName(); 
     try { 
      agentManager.removeAgent(agentId); 
     } catch (TimeoutException e) { 
       System.out.println(String.format("timeout on removing agent %s (id: %s)", agentName, agentId), e); 
     } 
    } 
} 
} 
+0

, что нужно отметить, и то, что мы только что сожгли недавно, это то, что ExecutableAgentsHelper является внутренним api, а не публичным и может меняться без предупреждения. и это действительно произошло между 6.1 и предстоящим 6.2 – mkleint