使用Bit Bucket中的webhook触发VSTS / TFS构建

时间:2016-01-14 01:03:58

标签: tfs bitbucket tfsbuild

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

是否真的不可能通过http?

从外部触发TFS / VSTS 2015中的构建

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

4 个答案:

答案 0 :(得分:5)

是的,除非您使用Zapier等第三方服务。

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

<强>更新 此功能现在可在VSTS中使用。你可以选择&#34; BitBucket&#34;作为&#34; Srouce&#34;并在&#34; Triggers&#34;下启用触发器。面板。

答案 1 :(得分:3)

VSTS构建定义中的触发器设置无法与外部存储库一起正常工作。基本上用户需要登录VSTS帐户,然后触发器检查存储库。

您可以创建Azure功能并将其用作BitBucket Webhook。然后在Azure Function中使用VSTS REST API来触发构建。

以下是您可以在Azure功能中粘贴的代码以及设置

之后的代码
  • 实例名称
  • 项目名称
  • 定义Id(s)
  • 分支名称
  • 个人访问令牌

它将以您想要的方式工作 - &gt;在将提交推送到存储库之后,它将为指定的定义对构建进行排队。

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

答案 2 :(得分:0)

更新 - TFS现在提供bitbucket集成

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

看到这个快照: enter image description here

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

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

从这里,您可以在更新存储库分支时触发TFS构建定义。

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

答案 3 :(得分:0)

我最近遇到过这个问题,我推送到外部Bitbucket的任何东西都没有触发我的VSTS版本。

我在git属性中找到了值 user.email &amp;我当地的Repo上的 user.name 与外部Bitbucket不同。

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

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