如何在git子模块中提交触发持续集成的构建?

时间:2016-01-10 15:56:37

标签: git continuous-integration travis-ci

我正在研究项目A,A依赖于快速开发的项目B(其主分支)。

因此,B是A的子模块,每次构建A,B也会重建。此外,每次B有一个新的提交,我需要构建B,然后重新构建A.(幸运的是,项目足够小,所以编译时间并不重要)。

现在,重点是。当项目A或B中有新的提交时,我想在Travis CI或其他持续集成服务中触发新的构建。

我刚试过Github&特拉维斯CI。项目B中的提交不会触发项目A中的构建。是否有一种简单的方法来运行这种持续集成?

2 个答案:

答案 0 :(得分:6)

  

项目B中的提交不会触发项目A中的构建

这是预期的,考虑到B不知道A存在。

您需要通过以下方式记录项目A的B的新状态(新 gitlink special entry in the index):

cd /path/to/projectA
git submodule update --remote
git add .
git commit -m "Record new B SHA1 gitlink"
git push

git submodule update --remote会将子模块B更新为A的.gitmodules文件中记录的分支的最新提交。
请参阅“git submodule tracking latest”和“Git submodules: Specify a branch/tag

然后将为A触发新的Travis构建。

如果你想自动化上述序列,你需要一个webhook (GitHub)or BitBucket)用于projectB,一个本地监听器,它在repo B上的push事件中会触发命令之前在项目A的本地回购中提到过。

答案 1 :(得分:2)

基于@VonC的问题,我解决了这个问题。 参考https://developer.github.com/webhooks/configuring/

  1. 我设置了项目Monitor,它有两个子模块,项目A和B
  2. 在项目监控
  3. 中创建文件trigger.rb

    要求' sinatra'

    post '/payload' do
      system("git submodule update --remote")
      system("git add .")
      system("git commit -m Record_new_change")
      system("git push")
      puts "Finished handling"
    end
    
    1. Download ngrok,使用./ngrok http 4567在VPS或长时间运行的commpuer上运行它。您可能会收到http://7e9ea9dc.ngrok.io
    2. 这样的链接
    3. 运行ruby trigger.rb
    4. 将项目B分支到B',编写另一个脚本以确保所有提交都同步到项目B'
    5. 转到项目设置页面,创建一个新的webhook,其网址为http://7e9ea9dc.ngrok.io/payload,用于项目A和B'
    6. 将项目监控添加到Travis CI
    7. 通过这种方式,A和B的开发不受影响,并且可以自动触发新版本。