将VSTS持续集成管道用于来自不同Git存储库的项目

时间:2018-08-26 16:13:12

标签: c# continuous-integration azure-devops

我有这个特殊的设置,我想将其包含在VSTS中,并进行持续集成+持续部署。为了简单起见,我将情况简化为以下设置:

我有两个解决方案A和B,它们分别位于单独的Git存储库中。解决方案A的一个项目A1引用了解决方案B的一个项目B1。由于这是出于演示目的的简化案例,因此,我们假定无法合并Git存储库!

现在,我正在为项目A1设置CI。该项目的构建显然失败了,因为无法解析对B1的依赖性。

到目前为止,我已经针对我的案子搜索了两种解决方案,这两种方法都令我不高兴:

  • 选项1)应该将所有NuGet无法解析的引用添加到库文件夹中,请参阅How to properly check in DLLs/assemblies to TFS/Visual Studio Team Services (was VSO)。如果这些引用是第三方,我可能会同意此选项依赖关系很少改变,例如一年两次。但是,由于我自己编译B1(并且我可能经常这样做),所以我不喜欢这种解决方案。当然,我可以在B1构建后自动将B1中的二进制文件复制到A1 / lib中,但是我想避免签入B1中的二进制文件。
  • 选项2)对我要集成的每个参考使用NuGet。我知道我可以设置自己的本地NuGet服务器。我不确定带有“私有软件包”的托管解决方案。由于我在本地开发A1和B1,并且对于B1的每个本地版本,在使用更新程序传递到A1之前,我都必须推送一个新版本并从A1更新软件包,因此使用Nuget似乎是一个过大的杀伤力。现在,我可以在本地构建B1,而A1立即看到更新。假设我在本地有很多开发构建,基本上我不想每天为B1推送50 + / 100 +个构建。

我还将在VSTS中为B1建立CI管道。

我想我正在寻找一种使用VSTS的“引用路径”来查找从另一个CI管道构建的依赖项的方法。 VSTS项目是否有一种共享的“ bin”空间?在A1构建之前,我会自动将构建的二进制文件从B1复制到A1。

有什么好的方法可以做到这一点吗?现在,我正在考虑一种后置/预建FTP /云推/拉解决方案,但是鉴于我的情况(对不同Git存储库的依赖)应该很常见,解决方案是什么?

1 个答案:

答案 0 :(得分:1)

如果您不想通过NuGet软件包管理@Service(Author) abstract class AuthorService { @Query(""" select auth from ${Author auth} where auth.id in ( select a.id from ${Book b} join ${b.author} a group by a.numberOfKnownBooks, a.id having count(*) = a.numberOfKnownBooks ) """) abstract List<Author> retrieveCompleteAuthors() } ,则可以使用其他选项。

假设projectB1solutionB中进行管理,而repoB中的文件结构如下:

repoB

选项1:直接在构建过程中克隆repoB

在构建定义的开头,您可以添加 PowerShell任务以克隆存储库。 PowerShell脚本如下:

repoB
  |___solutionB
           |___projectB1
                    |___...
           |___...
  |___...

要确保首先构建# If you are using private agent to build and clean source is false, you should check if the repoB folder exist or not git clone https://Personal%20Access%20Token:{PAT}@{account}.visualstudio.com/{project}/_git/repoB ,可以使用两个VS构建任务。第一个用于构建solutionBsolutionB),第二个用于构建repoB/*.slnsolutionA)。

选项2:将repoB添加为repoA的子模块

如果您想将**/solutionA.sln添加为repoB的子模块,则可以通过以下方式添加repoA作为repoB的子模块:

repoA

然后提交并将更改推送到远程git submodule add https://{account}.visualstudio.com/{project}/_git/repoB

注意:您还需要首先添加另一个VS Build任务来构建solutionB。

选项3:将repoB的分支(例如主分支)添加为repoA的子树

类似于子模子,您可以通过以下方式将repoA的分支(例如master)添加到repoB中:

repoA