共享资源
共享资源 构建功能允许通过使用共享资源(例如外部(对于 CI 服务器)资源,例如,测试数据库,或者连接数量有限的服务器)来限制同时运行的构建。
某些此类资源可能会被并发访问,但只允许有限数量的连接,其他资源则需要独占访问。 向共享资源添加不同的锁可以解决这些情况:您可以在项目级别上定义资源,配置其参数(例如,类型和配额),然后通过将共享资源构建功能添加到特定的构建配置中来使用此资源。 构建在获得资源锁定后开始;构建完成时,锁定将被释放。 当使用资源的构建运行时,资源将不可用,而其他需要锁的构建将在队列中等待。
添加和编辑共享资源
您可以在项目配置页面的 共享资源 标签页中添加、编辑共享资源,并查看它们的详细信息(资源来源、使用情况等)。
资源名称只能包含字母数字字符和下划线( _
)——最多80个字符——并且应该以拉丁字母开头。
在项目级别定义的共享资源对所有子项目和构建配置都是可用的。
在子项目级别,无法编辑从项目继承的资源。
但是,通过在子项目中创建具有相同名称但设置不同的资源,可以重新定义从项目继承的资源。 例如:
在 Parent 项目中以无限制配额创建资源 A。
转到其子项目 Child 1,并创建了资源 A (与 Parent 中的资源同名)配额为 5。
TeamCity 将会将此资源视为在子项目 Child 1 中被重新定义:即在项目级别(无限配额)定义的资源 A 的设置将传播到其所有子项目,除了子项目 Child 1,其中资源 A 将配额为 5。
资源的使用量是通过扫描当前项目的子树来计算的;因此,如果有多个项目使用同一资源,只会计算当前项目中的使用量。
共享资源的类型
当您点击 Add new resource 时,将提供三种类型的资源:
无限资源是一个拥有无限数量读取锁的共享资源。
带配额的资源:配额是可以在资源上获取的最大读锁数量。
具有自定义值的资源:自定义值(例如,URL)被传递给已获取此类资源锁定的构建。
在构建配置中使用共享资源
要定义哪些构建配置将使用资源,您需要在构建配置设置中添加 Share Resources 构建功能。
当添加一个共享资源时,选择对此构建配置可用的资源,并定义一个锁。
以下锁定可用:
配额资源的锁定
对于这种资源类型,支持两种类型的锁:
读锁:共享(允许多个正在运行的构建拥有读锁)。
写锁:独占锁 (只允许有一个正在运行的构建拥有写锁)。
拥有配额的资源将允许多个构建同时访问以进行读取,但会限制单个构建对资源的写入访问。 在所有读锁被释放之前,需要写锁的构建将不会开始,而会在队列中等待,同时新的读者能够获取锁。
设置了资源配额为零的构建将不会运行。
锁公平性
虽然读取锁能使多个构建并行访问配额 > 1 的共享资源,但锁公平性确保不会违反构建队列。 这意味着,如果有一个配额 > 1 的共享资源,且有几个读锁排队的构建和一个位于读者之间的写锁构建,那么具有写锁的构建会等待所有具有读锁的 较早 队列中的构建完成并释放锁。 然后需要写锁的构建将会被执行,只有在此之后,其他读取器才能获取锁。 锁定公平性不允许拥有读取锁的构建干扰构建队列的顺序,并“滑过”正在等待写入锁变为可用的构建。
拥有自定义值的资源的锁定
带有自定义值的资源支持三种类型的锁:
锁定任何可用的值:如果资源中至少有一个值可用,那么将开始使用该资源的构建。 如果所有值当前都在使用中,构建将在队列中等待。
对所有值进行锁定:所有值:构建将锁定资源的所有值。 使用此资源的其他构建将不会开始,直到当前的构建完成。
对特定值上锁:只有资源的特定值会传递给构建。 如果该值已经被正在运行的构建占用,新的构建将会在 队列 中等待,直到该值变为可用状态。
每个定义的锁在构建中都以配置参数 teamcity.locks.readLock.<lockName>
或 teamcity.locks.writeLock.<lockName>
的形式表示,其值为资源字符串。 参数名称示例: teamcity.locks.readLock.databaseUrl
。
复合构建中的资源锁
现在,共享资源(自定义值除外)也可以被用于锁定复合构建。 当复合构建开始时(当复合构建链的第一个构建开始时),将会获取到指定资源的锁定;当复合构建完成时(其链中的最后一个构建完成时),锁定将被释放。
在复合构建上获得的锁只影响这些复合构建,而不会传播到其各个部分。 例如,如果一个资源的配额为 N,则可以同时运行 N 个已在此资源上加了读锁的复合构建。 这些组合构建中并发的个别构建数量不会受到资源配额的影响。
查看共享资源的使用情况
如果构建配置中定义了至少一个资源锁,您可以在 Build Results 页面的 Shared Resources 标签页上查看构建使用的资源。 该标签页显示资源及其类型,包括每个资源中构建所使用的锁。
点击资源名称将您带回到项目级别的 共享资源配置 页面。