4
votes

Intégration de Google Cloud Build avec Bitbucket

Nous utilisons Bitbucket comme outil de contrôle de version. Les builds et les déploiements sont en cours d'exécution sur Google Cloud Platform.

Toutes les compilations sont déclenchées via des déclencheurs de compilation comme spécifié dans Google Docs Cloud . Cela fonctionne très bien, mais nous aimerions obtenir un retour sur l'état de la compilation pour une branche spécifique de Bitbucket ou de préférence sur demande d'extraction.

J'ai fait des recherches, mais je n'ai rien trouvé d'utile sur ce sujet précis. Il y a une note dans Google Cloud docs concernant la compilation sur pull request qui ne nous laisse pas beaucoup d'espoir:

"Qu'elles soient basées sur des commits de branche ou des commits de balises, les compilations ne sont déclenchées que sur les poussées vers l'origine distante. Les compilations ne se déclenchent pas sur les modifications locales, les pré-soumissions ou les demandes d'extraction."

GitHub semble avoir une très bonne intégration avec Google Cloud Build qui prend en charge Build commentaires sur l'état.

Est-il possible d'obtenir des commentaires sur l'état de Google Cloud Build dans Bitbucket sur pull request / push à distance et si c'est le cas, comment? Comment gérez-vous ce problème?


0 commentaires

3 Réponses :


4
votes

Ici, nous avons utilisé, prêt à l'emploi, intégration entre Google Cloud Build et Google Pub / Sub . Connecté à ce sujet par défaut cloud_builds , nous avons une Fonction Google Cloud responsable de faire une requête HTTP dans API REST Bitbucket . Cette API a une version actuelle 2.0 mais plusieurs exemples mentionnent encore la version précédente 1.0 , alors faites attention aux problèmes potentiels.


2 commentaires

Merci @MoacirRosa. En attendant, nous avons migré vers GitLab, je ne suis donc pas en mesure de mettre en œuvre votre solution. Cependant, j'accepterai cela comme une réponse, car cela semble la seule solution comme je le fais loin.


Merci mec ... J'espère que cela pourrait aider d'une manière ou d'une autre. Je n'utilise pas GitLab ces dernières années, mais je me souviens qu'ils avaient également une riche API REST. Peut-être la même idée, mais en utilisant L'API GitLab serait possible.



2
votes

@Moacir Rosa merci pour votre réponse. Sur la base de cette suggestion, nous construisons la fonction cloud GCP suivante:

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';
      }
  }
};

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


0 commentaires

0
votes

J'utilise Bitbucket Cloud qui ne prend pas en charge les jetons Bitbucket. J'ai créé l'excellent dépôt de Honest Food Company et l'ai modifié pour prendre en charge les mots de passe d'application pour Bitbucket Cloud.

https://github.com/dgallegos/gcp-cloud-build -fonction-bitbucket


0 commentaires