2017-05-23 11 views
1

저는 빌더를 동적으로 빌더에 추가 할 수 있어야하는 프로젝트에서 작업하고 있습니다. 빌드 프로세스는 모두 같을 것입니다 (마이크로 서비스라고 생각합니다). 그러나 그들은 다른 소스 코드 저장소에서 작업하고 소스 코드 저장소의 이름에 따라 주로 출력을 생성합니다. 내가 적절한 활성화 URL에 게시하여 임의의 변화를 만들 수 있습니다있는 contrib에서 스크립트를 발견 http://docs.buildbot.net/latest/manual/cfg-buildfactories.html#dynamic-build-factoriesBuildbot : 새 빌더 또는 BuilderConfig 또는 프로젝트를 동적으로 작성합니다.

:

그것은 알라 트래비스 (https://github.com/buildbot/buildbot_travis)를하거나 동적 빌드 공장 동적 빌드 단계를 얻기 위해 매우 쉽습니다 : https://github.com/buildbot/buildbot-contrib/blob/master/master/contrib/post_build_request.py

이은 webhook에 대한 게시물은 어느 :이 https://github.com/buildbot/buildbot/blob/master/master/buildbot/www/hooks/base.py

는 master.cfg에서과 같이 사용할 수

c['www'] = dict(port=8010, 
      plugins=dict(waterfall_view={}, console_view={}), 
      change_hook_dialects={ 
       'base': True, 
      }) 

위대한, 나는 그것을 멀리 얻었다. 그리고 내가 그렇게했을 때, twistd.log를보고 다음을보십시오.

2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Attempting to load module buildbot.www.hooks.base 
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Got the following changes [{'category': 'release', 'codebase': None, 'repository': 'mikes_microservice', 'author': 'sandford', 'when': None, 'comments': u'post_build_request submission', 'project': 'mike_basic_stats', 'branch': None, 'revlink': None, 'properties': {}, 'files': [], 'revision': None}] 
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Payload: {'category': ['release'], 'project': ['mikes_microservice'], 'repository': ['mikes_microservice'], 'comments': ['post_build_request submission'], 'author': ['sandford']} 
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] WARNING: change source is using deprecated self.master.addChange method; this method will disappear in Buildbot-1.0.0 
2017-05-22 20:43:29-0500 [-] added change with revision None to database 
2017-05-22 20:43:29-0500 [-] injected change Change(revision=None, who=u'sandford', branch=None, comments=u'post_build_request submission', when=1495503809, category=u'release', project=u'mikes_microservice', repository=u'mikes_microservice', codebase=u'') 

모두가 함께합니다! 아아, 실제 빌드를 시작한 것은 없습니다. 내 의혹은 내가 빌더를 빌더에 넣지 않았기 때문이라고 생각한다. 설정 :

c['builders'] = [] 
c['builders'].append(
    util.BuilderConfig(name="example", 
     workernames=["example-worker"], 
     factory=factory)) 

그래서 그 트릭입니다. 나는이 목록을 시작할 때 동적으로 만들 수 있다고 생각하지만 항상 새로운 마이크로 서비스를 만들고 있으며 끊임없이 재시작해야한다는 걱정이 듭니다.

그냥 내가이 BuilderConfig (그리고 스케줄러 항목)를 첨가하고 다시 시도 얻을 수 얼마나 멀리 볼 수 있습니다 :

c['builders'].append(
    util.BuilderConfig(name="mikes_microservice", 
     workernames=["example-worker"], 
     factory=factory)) 

그리고 스케줄러 : 다음

c['schedulers'] = [] 
c['schedulers'].append(schedulers.SingleBranchScheduler(
          name="all", 
          change_filter=util.ChangeFilter(branch='master'), 
          treeStableTimer=None, 
          builderNames=["example",])) 

c['schedulers'].append(schedulers.ForceScheduler(
          name="force", 
          builderNames=["example", "mikes_microservice", ])) 

내가 스크립트를 실행 시도 다시 :

python post_build_request.py -P mikes_microservice -r mikes_microservice --branch master 

내가 "mikes_microservi"가 아닌 "example"프로젝트에서 빌드를 얻었을 때 "mikes_microservice"프로젝트/빌더가 트리거 될 것으로 예상했기 때문에 스케줄러 나 변경 필터가 완료되는 방식을 이해하지 못할 수도 있습니다.

그런 다음 "mikes_microservice"를 SingleBranchScheduler builderNames에 추가하고 "mikes_microservice"빌드를 트리거 할 수 있었으며 "example"빌드도 생성 할 수있었습니다.

같은 스케줄러에 여러 빌더가있는 것이 문제를 일으키고 있다는 것을 알아 냈으므로 동일한 효과를 내기 위해 별도의 스케줄러로 분할했습니다. 적어도 webhooks를 통해 - - 분명히

c['schedulers'].append(schedulers.SingleBranchScheduler(
          name="mikes_microservice", 
          change_filter=util.ChangeFilter(branch='master'), 
          treeStableTimer=None, 
          builderNames=["mikes_microservice"])) 

나는 다르게 구축하기 위해 다른 프로젝트 나 저장소를 활용하는 방법에 대해 뭔가를 놓친 그리고 난 그 문제를 해결하면 나는 새로운 [무엇이든 모든 주입에 관심이 있어요 런타임에 buildbot에 새로운 프로젝트 나 리포지토리를 선택하고 다시 시작하지 않고 빌드하도록하기 위해 런타임에 buildbot에이 작업을 수행합니다.

답변

0

안녕하세요,이 훌륭한 질문에 감사드립니다. 여기서 virtual_builders가 재생됩니다.

아이디어는 모든 buildrequest가 첨부되는 단일 빌더를 만드는 것입니다. 부트 스트랩이라고 부를 수 있습니다. 이 부트 스트랩의 일은 buildbot.yml을 읽은 다음 나머지 빌드를 구성하는 것입니다.

이브 생각이 virtual_builder_name 프로젝트의 이름을 자동으로 설정하는 것입니다 그리고 비슷한 일

https://bitbucket.org/scality/eve/src/을하고있다. 최선의 방법은 virtual_builder_name을 자동으로 설정하는 특수 AnyBranchScheduler를 사용하는 것입니다. 이것은 Buildbot에 내장 된 것이 아닙니다. 부담없이 작업 해주십시오.