【问题标题】:Trigger VSTS/TFS build with webhook from Bit Bucket使用来自 Bitbucket 的 webhook 触发 VSTS/TFS 构建
【发布时间】:2018-09-29 08:06:14
【问题描述】:

更新:这是个老问题。 TFS 现在完全支持与 Bitbucket 的集成!

真的不能用http从外部触发构建TFS/VSTS 2015吗?

我在 BitBucket 上有存储库,我想在提交时触发构建。 我在网上搜索过,一无所获。

【问题讨论】:

标签: tfs bitbucket tfsbuild


【解决方案1】:

是的,除非您使用像 Zapier 这样的第三方服务。

已经为此提交了一个用户语音。详情请查看此链接:https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/10674648-enable-ci-build-support-for-bitbucket-git-reposito

更新: 此功能现在在 VSTS 中可用。您可以选择“BitBucket”作为“源”并在“触发器”面板下启用触发器。

【讨论】:

  • 我希望它会尽快添加,但我对此表示怀疑,因为只有 9 票。我认为这是一个必须的功能,但看起来我是一个边缘案例。
  • 好的,我尝试了 Zapier,他们宣传的方法是每 5 分钟检查一次 BitBucket 的更改,并为每个更改集触发构建,以防推送有多个更改集。不好。有更好的方法:在 Zapier 上选择“Zapier 的 Webhooks”。然后在 Bitbucker 存储库设置中创建 webhook 并将 url 设置为 Zapier 提供的一个。即时构建! (但我还有另一个不相关的问题:stackoverflow.com/questions/34841780/…
【解决方案2】:

VSTS 构建定义中的触发器设置不适用于外部存储库。基本上用户需要登录到 VSTS 帐户,然后触发器检查存储库。

您可以创建一个 Azure 函数并将其用作您的 BitBucket Webhook。然后在 Azure Function 中使用VSTS REST API 触发构建。

以下是您可以粘贴到 Azure 函数中并设置后的代码

  • 实例名称
  • 项目名称
  • 定义 ID
  • 分行名称
  • 个人访问令牌

它将按照您想要的方式工作 -> 在您将提交推送到存储库后,它会将指定定义的构建排队。

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
  var definitionId = -1;

  dynamic data = await req.Content.ReadAsAsync<object>();
  var branch = data?.push?.changes[0]?.@new?.name;

  if(branch == "master") definitionId = 6; // TODO update the branch name and definition Id to match your settings
  else if(branch == "ci/website-staging") definitionId = 7; // TODO update the branch name and definition Id to match your settings

  if (definitionId >= 0) // Known branch
  {
      string accessToken = GetEnvironmentVariable("PersonalAccessToken"); // TODO add your personal token to your app settings or paste it here
      const string instance = "instance_name"; // TODO put the instance name
      const string project = "project_name"; // TODO put the project name
      const string version = "api-version=2.0";

      var url = $"https://{instance}.visualstudio.com/DefaultCollection/{project}/_apis/build/builds?{version}";
      var authorizationToken = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{accessToken}"));
      var body = "{\"definition\" : {\"id\" : " + definitionId + "}}";

      return await PostAsync(url, body, authorizationToken);
  }

  return req.CreateResponse(HttpStatusCode.OK);
}

private static async Task<HttpResponseMessage> PostAsync(string url, string jsonBody, string authorizationToken = null)
{
  using (var client = new HttpClient())
  {
      if (!string.IsNullOrEmpty(authorizationToken))
          client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authorizationToken);
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      client.BaseAddress = new Uri(url);
      var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
      return await client.PostAsync("", content);
  }
}

private static string GetEnvironmentVariable(string name)
{
  return Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

我已经写了一个详细的blog post 以防您需要更多信息。

【讨论】:

  • 谢谢,我正在使用带有 webhook 的 Zapier,目前效果很好!
【解决方案3】:

我最近遇到了这个问题,我推送到外部 Bitbucket 的任何内容都没有触发我的 VSTS 构建。

我发现本地 Repo 上的 git 属性 user.emailuser.name 中的值与外部 Bitbucket 不同。

要解决此问题,请访问您在 Bitbucket 中的 Repo。

  1. 打开回购设置
  2. 常规下选择用户名别名
  3. 为 Bitbucket 输入您的 name 以及来自本地 Repo 的 user.email git 属性的电子邮件。

【讨论】:

    【解决方案4】:

    更新 - TFS 现在提供 bitbucket 集成


    这是一个相当老的线程,仍然 - tfs 文档有这个链接:https://www.visualstudio.com/docs/build/define/repository#external-git

    查看此快照:

    每当某个分支更新时触发构建:

    链接到您的存储库后,返回到您的构建定义,然后选择 触发器 选项卡。

    无论何时更新存储库分支,您都可以在此处触发您的 TFS 构建定义。

    1. 选中持续集成 (CI) 复选框
    2. 单击+ Add new Filter 链接添加新触发器并将分支名称插入文本框。
    3. 在您想要触发的其他分支上添加新过滤器(包括)或从 CI 流程中排除分支(在列表框中选择排除)

    【讨论】:

    • 问题不是从外部 git 构建,而是在外部 git 提交上触发构建
    • “有问题的”部分是链接到外部仓库。在提交时触发构建就像任何其他触发一样完成(我在上面的答案末尾添加了这部分)。
    • CI 不支持外部 git。写在文档中并由支持人员确认。
    • @hex 我们的 TFS 构建服务器与 bitbucket git 代码库集成了几个月,现在没有任何问题。我还发现奇怪的是,它能够与外部 git 服务器集成,而此功能不受支持
    猜你喜欢
    • 2018-10-18
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多