文档

项目在 scm_branch 字段中指定要从源代码控制中使用的分支、标签或引用。这些由项目详细信息字段中指定的值表示,如所示。

_images/projects-create-scm-project-branching-emphasized.png

项目可以选择“允许分支覆盖”。选中此选项后,项目管理员可以将分支选择权委托给使用该项目的作业模板(仅需要项目 use_role)。

_images/projects-create-scm-project-branch-override-checked.png

作业模板的管理员可以通过选中作业模板的 SCM 分支字段旁边的 **启动时提示** 框,将该能力进一步委托给执行作业模板的用户(仅需要作业模板 execute_role)。

_images/jt-create-scm-project-scm-branch-prompt-checked.png

源代码树复制行为

每次作业运行都有其自己的私有数据目录。该目录包含该作业运行的给定 scm_branch 的项目源代码树的副本。作业可以自由地对项目文件夹进行更改,并在作业运行期间使用这些更改。此文件夹是临时的,会在作业运行结束时清理。

如果选中 **清除**,Tower 将通过在与 gitSubversionMercurial 相关的 Ansible 模块中使用 force 参数,丢弃其本地存储库副本中修改的文件。

_images/projects-create-scm-project-clean-checked.png

项目修订行为

通常,在项目更新期间,默认分支的修订(在项目的 **SCM 分支** 字段中指定)会在更新时存储,并且使用该项目的作业将使用此修订。在作业中提供非默认 **SCM 分支**(不是提交哈希或标签),在作业开始之前会立即从源代码控制远程获取最新的修订。此修订在作业的 **修订** 字段及其各自的项目更新中显示。

_images/jobs-output-branch-override-example.png

因此,离线作业运行对于非默认分支是不可能的。为了确保作业运行的是源代码控制中的静态版本,请使用标签或提交哈希。项目更新不会保存所有分支的修订,只保存项目默认分支的修订。

**SCM 分支** 字段不会被验证,因此项目必须更新以确保其有效。如果提供或提示此字段,作业模板的 **剧本** 字段将不会被验证,您必须启动作业模板才能验证预期剧本的存在。

Git Refspec

**SCM Refspec** 字段指定更新应从远程下载哪些额外的引用。示例是

  1. refs/*:refs/remotes/origin/*:获取所有引用,包括远程的远程

  2. refs/pull/*:refs/remotes/origin/pull/*(特定于 GitHub):获取所有拉取请求的所有引用

  3. refs/pull/62/head:refs/remotes/origin/pull/62/head:获取该 GitHub 拉取请求的一个引用

对于大型项目,在使用这里第一个或第二个示例时,您应该考虑性能影响。

**SCM Refspec** 参数会影响项目分支的可用性,并且可以允许访问原本无法访问的引用。上面的示例允许用户从 **SCM 分支** 中提供拉取请求,如果没有 **SCM Refspec** 字段,这将是不可能的。

Ansible git 模块默认情况下会获取 refs/heads/*。这意味着如果 **SCM Refspec** 为空,则项目的 Branches 和 Tags(以及其中的提交哈希)可以用作 SCM 分支。**SCM Refspec** 字段中指定的值会影响哪些 **SCM 分支** 字段可以用作覆盖。任何类型的项目更新都会执行额外的 git fetch 命令,以从远程拉取该 Refspec。

例如:您可以设置一个允许分支覆盖的项目,其中包含第一个或第二个 Refspec 示例 -> 在作业模板中使用此功能,该模板会提示 **SCM 分支** -> 客户端可以在创建新的拉取请求时启动作业模板,提供分支 pull/N/head -> 作业模板将在提供的 GitGub 拉取请求引用上运行。

有关 Ansible git 模块的更多信息,请参阅 https://docs.ansible.org.cn/ansible/latest/modules/git_module.html.