Интеграция Google Cloud Build с Bitbucket - PullRequest
2 голосов
/ 05 марта 2019

Мы используем Bitbucket в качестве инструмента контроля версий. Сборки и развертывания выполняются на Google Cloud Platform.

Все сборки запускаются с помощью триггеров сборки, как указано в Документы Google Cloud . Это прекрасно работает, но мы хотели бы получить отзыв о статусе сборки для конкретной ветки в Bitbucket или предпочтительно по запросу pull.

Я провел некоторые исследования, но не нашел ничего полезного по этой конкретной теме. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. В этой статье, в частности, не учитываются надежды на сборку по запросу извлечения.

"Будь то на основе фиксации ветви или тега, сборки запускаются только при толчках к удаленному источнику. Сборки не запускаются при локальных изменениях, предварительных отправках или запросах извлечения."

GitHub , кажется, имеет очень хорошую интеграцию с Google Cloud Build, которая поддерживает обратную связь о статусе сборки.

Возможно ли получить отзыв о статусе Google Cloud Build в Bitbucket по запросу извлечения / удаленному отправлению, и если да, то как? Как вы справляетесь с этой проблемой?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Здесь мы использовали встроенную интеграцию между Google Cloud Build и Google Pub / Sub .В этой теме по умолчанию cloud_builds у нас есть Облачная функция Google , отвечающая за отправку HTTP запроса в Bitbucket REST API .Этот API имеет текущую версию 2.0, но в нескольких примерах упоминается предыдущая версия 1.0, поэтому будьте осторожны с потенциальными проблемами.

0 голосов
/ 20 июня 2019

@ Моасир Роза, спасибо тебе за ответ.На основе этого предложения мы создаем следующую облачную функцию GCP:

const axios = require('axios');

/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event Event payload.
 * @param {!Object} context Metadata for the event.
 */
exports.processPubSubMessage = (event, context) => {
  const pubsubMessage = event.data;
  const dataString = Buffer.from(pubsubMessage, 'base64').toString();
  const message = JSON.parse(dataString);
  const commitSha = message.sourceProvenance.resolvedRepoSource.commitSha;
  const repoName = message.sourceProvenance.resolvedRepoSource.repoName;
  const [bitbucket, username, repo_slug] = repoName.split('_');
  // Build Bitbucket payload data.
  const payload = {
      type: 'string',
      created_on: message.createTime,
      description: `Status: ${message.status}`,
      key: 'string',
      name: 'Google Cloud Build',
      refname: `buildTriggerId: ${message.buildTriggerId}`,
      state: getBitbucketState(message.status),
      updated_on: message.finishTime,
      url: message.logUrl,
      uuid: message.id,
  }
  // Send request to Bitbucket.
  const token = process.env.BITBUCKET_TOKEN;
  const url = getBuildUrl(username, repo_slug, commitSha);
  axios.post(url, payload, {
      headers: { Authorization: `Basic ${token}` }
  })
      .then(function(response){
          console.log(response);
      })
      .catch(function(error){
          console.log(error);
      });


  /**
   * See: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bnode%7D/statuses/build
   * 
   * @param {string} username
   * @param {string} repo_slug
   * @param {string} commitSha 
   */
  function getBuildUrl(username, repo_slug, commitSha) {
      const baseUrl = 'https://api.bitbucket.org/2.0/repositories';
      return `${baseUrl}/${username}/${repo_slug}/commit/${commitSha}/statuses/build`;;
  }

  /**
   * Translates states from Google Cloud Build Message to Bitbucket.
   * See: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bnode%7D/statuses/build
   * 
   * @param {string} status 
   */
  function getBitbucketState(status) {
      switch(status.toLowerCase()) {
          case 'success':
              return 'SUCCESSFUL';
          case 'queued':
          case 'working':
              return 'INPROGRESS';
          default:
              return 'FAILED';
      }
  }
};

См .: https://github.com/honest-food-company/gcp-cloud-build-function-bitbucket

...