Git & Jenkins: obtenha o mais recente commit verde na filial

10

Estamos apenas começando a pressionar o CI-CD e, como um pequeno passo, tentaremos atualizar uma pilha com o mais recente desenvolvimento verde a cada duas horas. Sou bastante novo no Git / Bitbucket e não consigo descobrir como garantir que o check-out feito por Jenkins faça com que o último commit seja marcado por Jenkins em verde, em vez de apenas "o último commit" como uma declaração geral.

Como o Notificador de Status de Construção do Bitbucket está instalado, o Bitbucket controla quais confirmações são verdes após a execução dos testes de unidade. Existe uma maneira de aproveitar essas informações para garantir que a confirmação correta seja escolhida?

Alex
fonte

Respostas:

6

Você não menciona a linguagem de script que deseja usar, portanto, falarei especificamente sobre as solicitações HTTP para a API do BitBucket:

Premissas

Se você tem um Repositório BitBucket que possui três confirmações, a primeira e a última estão com falha na compilação, o meio está passando:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Obter a lista de confirmações

Você pode obter a lista de confirmações chamando o seguinte método de API:

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

A resposta é assim:

{
  "pagelen": 30,
  "values": [
    {
      "hash": "4768815fdc27abf4be17096e7c460f7f68f5d39b",
      "repository": { ... },
      "links": {
        ...
        "statuses": {
          "href": "https://api.bitbucket.org/2.0/repositories/RichardSlater/greencommitproofofconcept/commit/4768815fdc27abf4be17096e7c460f7f68f5d39b/statuses"
        }
      },
      "author": { ... },
      "parents": [ ... ],
      "date": "2017-04-10T11:38:18+00:00",
      "message": "README.md edited online with Bitbucket",
      "type": "commit"
    },
    {
      "hash": "49d7110b98616358d16055960a4abdf2926b890d",
      ...
    },
    {
      "hash": "42d357f1df7a7d7bcf1f10a9f3a5a40d85d5b11c",
      ...
    }
  ]
}

Se você analisar o JSON e repetir as respostas, poderá extrair os status de:

values[n].links.statuses.href

Onde né o índice, isto é 0, 1ou 2no exemplo acima. Se você fosse construir isso do zero, seria no seguinte formato.

Obtenha a lista de status da confirmação

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept
  • sha: 4768815fdc27abf4be17096e7c460f7f68f5d39b

Nota: esta é uma API Hypermedia, o que significa que os URLs podem mudar, por isso recomendo usar os links da resposta anterior em vez de tentar gerá-los do zero.

A resposta da solicitação HTTP acima será algo como:

{
  "pagelen": 10,
  "values": [
    {
      "key": "POC-01",
      "name": "Build #1",
      "repository": { ... },
      "url": "http://devops.stackexchange.com/q/809/397",
      "links": { ... },
      "refname": null,
      "state": "FAILED",
      "created_on": "2017-04-10T13:04:28.261734+00:00",
      "updated_on": "2017-04-10T13:04:28.261759+00:00",
      "type": "build",
      "description": "Changes by Richard Slater"
    }
  ],
  "page": 1,
  "size": 1
}

A partir desta resposta, você pode extrair o stateuso:

values[n].state

Novamente, onde nestá o status- poderia haver muitos deles se um commit resultasse em muitas compilações.

Se o estado da construção com o qual você se importa for SUCCESSFUL, você terá sua resposta e poderá retornar imediatamente shaa confirmação.

Faça um loop sobre todas as confirmações desde a primeira fase, se você ficar sem confirmações, siga a nextpágina linkincluída na chamada para /commits.

Diagrama de fluxo completo

Em um nível alto, o fluxo ficará assim:

Diagrama de fluxo

Não se esqueça que esta é uma API Hypermedia, portanto, sempre que possível, faça com que seu código siga os links da API em vez de tentar "adivinhar".

Richard Slater
fonte
11
Sim, provavelmente é minha resposta mais longa do que nunca.
Richard Slater
Agradeço o tempo que você levou para explicar isso, mesmo que você ache que sou completamente louco por querer. Aceito
Alex
Não é completamente insano, basta dar os primeiros passos - lembre-se de minha outra resposta quando estiver pensando em arquiteturas de CI / CD.
Richard Slater #
3

Em um pipeline típico de Entrega / Implantação Contínua, você faria o seguinte:

  1. O desenvolvedor envia uma ou mais confirmações ou uma solicitação de recebimento é mesclada.
  2. Jenkins cria e executa testes automaticamente.
  3. Se bem-sucedido, Jenkins publica um pacote de implantação em um Repositório de Artefato; se a falha não publicar nada e notificar os desenvolvedores.
  4. A automação de implantação usa pacotes do Repositório de Artefatos e os implementa.

Pipeline de CI / CD simples

O objetivo é evitar criar a solução a partir da fonte duas vezes, você a cria uma vez e a implanta várias vezes. Você pode implementar aprovações no Sonartype Nexus para definir o processo de aprovação do ambiente, ou seja, Dev → Teste → UAT → Estágio → Produção.

Dito isso ... se você leu todas as anteriores e ainda deseja obter a última versão verde do controle de origem, pode usar uma das duas técnicas:

  1. Faça com que Jenkins identifique o ramo com uma tag adequadamente nomeada, ou seja master-green, use-a em vez de masterquando desejar a última compilação verde.
  2. Use as bitbucket commits para obter uma lista de commits e cometer / {sha} / status sobre cada um para encontrar o comprometer com um status verde. Eu expandi essa solução em outra resposta .

Sinta-se à vontade para postar uma pergunta de acompanhamento, se desejar obter detalhes específicos sobre como usar as abordagens acima.

Richard Slater
fonte