Disparadores de fluxo de trabalho manual em Ações do Github

9

Estou configurando ações do Github para um repositório de projetos.

O fluxo de trabalho consiste nas seguintes etapas:

  • Construindo uma imagem do Docker
  • Enviando a imagem para um registro de contêiner
  • Implementar uma implantação do Kubernetes.

No entanto, tenho duas implantações diferentes do Kubernetes: uma para desenvolvimento e outra para produção. Portanto, também tenho dois fluxos de trabalho do Github Action.

O fluxo de trabalho do Github Action para desenvolvimento é acionado toda vez que um commit é enviado:

on:
  push:
    branches:
    - master

Mas não quero isso para o meu fluxo de trabalho de produção. Eu precisaria de um gatilho manual, como um botão Enviar para produção . Não vi nada parecido com isso nos documentos.


Existe uma maneira de acionar um fluxo de trabalho manualmente nas Ações do Github?

Como posso dividir meu fluxo de trabalho de desenvolvimento e produção para alcançar o que eu quero, no Github Actions, no Docker ou no Kubernetes?

Antoine C.
fonte

Respostas:

9

Existe uma maneira de acionar um fluxo de trabalho manualmente nas Ações do Github?

Eu tenho um pequeno truque para fazer isso ...

Com o evento de observação, você pode acionar manualmente uma ação com estrela ou desmarcar o repo. O código para o evento no seu fluxo de trabalho é:

on:
  watch
    types: [started]

Eu sei que é uma merda estranha, mas funciona! No entanto, não é o melhor caminho se for um repo público com estrelas em potencial.


Como posso dividir meu fluxo de trabalho de desenvolvimento e produção para alcançar o que eu quero, no Github Actions, no Docker ou no Kubernetes?

Em Ações do Github, quero dizer, você pode executar vários fluxos de trabalho / trabalhos e filtrar por ramos ou eventos direcionados. Você pode combinar vários eventos, por exemplo, acionar um fluxo de trabalho para envio por push e com um cron à meia-noite.

Sarah Abderemane
fonte
7
Haha, isso é ótimo:> de repository_dispatchlado, pode-se combinar watchcom if: github.actor == 'hackerman'para filtrar estranhos aleatórios. Ou melhor ainda - if: github.actor == github.event.repository.owner.loginpara "segurança" extra: D
Samira
11
Haha obrigado! Sim, é uma boa ideia, eu tenho que tentar isso quando tiver tempo! : D
Sarah Abderemane 21/11/19
11
Perfeito, acho que esse é o melhor método, embora não haja algo oficialmente implementado.
Antoine C.
5

Atualização : para obter uma solução "ChatOps" no estilo de comando barra, consulte a ação barra-comando-despacho . Isso pode permitir que você ative fluxos de trabalho com comandos de barra (por exemplo /deploy) do problema e obtenha comentários de solicitação.

Aqui está um exemplo básico para um deploycomando de barra. REPO_ACCESS_TOKENé um token de acesso pessoal comrepo escopo

name: Slash Command Dispatch
on:
  issue_comment:
    types: [created]
jobs:
  slashCommandDispatch:
    runs-on: ubuntu-latest
    steps:
      - name: Slash Command Dispatch
        uses: peter-evans/slash-command-dispatch@v1
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          commands: deploy

O comando pode ser processado neste fluxo de trabalho.

name: Deploy Command
on:
  repository_dispatch:
    types: [deploy-command]

Existem muito mais opções e configurações diferentes. Consulte slash-command-dispatch para obter instruções completas de uso.

Resposta original : Um repository_dispatchfluxo de trabalho pode ser acionado manualmente por uma chamada para a API do GitHub da seguinte maneira.

on:
  repository_dispatch:
    types: [production-deploy]
  • [username] é um nome de usuário do GitHub
  • [token]é um token de acesso pessoal comrepo escopo
  • [repository] é o nome do repositório no qual o fluxo de trabalho reside.
curl -XPOST -u "[username]:[token]" \
  -H "Accept: application/vnd.github.everest-preview+json" \
  -H "Content-Type: application/json" \
  https://api.github.com/repos/[username]/[repository]/dispatches \
  --data '{"event_type": "production-deploy"}'
peterevans
fonte
11
Para qualquer pessoa interessada, é possível usar um único fluxo de trabalho para vários despachos. O que é enviado como event_typeestá disponível para o fluxo de trabalho github.event.action, portanto, tarefas / etapas específicas podem ser ativadas / desativadas quando necessário. PS: PAT não é realmente necessário, iniciar o curl com -u "[username]:[password]"ou até -u "[username]"funciona também (no segundo caso, o curl solicita uma senha ao usuário); mais fácil de usar em alguns casos (por exemplo, ao escrever scripts que usam o nome de usuário como entrada ou scripts destinados a serem usados ​​por usuários menos conhecedores da tecnologia).
Samira
2

Embora a postagem de Sarah tenha sido a resposta mais próxima e mais simples à pergunta original, ela é um tanto hacky, então acabamos criando uma devramificação para usar os seguintes gatilhos:

  • Fluxo de trabalho de desenvolvimento: acionado quando um push é feito na devramificação:

    on:
      push:
        branches:    
          - dev
    
  • Fluxo de trabalho de produção: acionado quando uma solicitação / mesclagem pull é feita de devpara master:

    on:
      pull_request:
        branches:    
          - master
    
Antoine C.
fonte
1

Editado para mais detalhes / explicação.

Uma coisa que você pode fazer é ligar para repository_dispatch. Você pode visualizar a documentação do GitHub para usar um repository_dispatch aqui .

Por exemplo, se você tiver um fluxo de trabalho GitHub Actions parecido com este:

on:
  repository_dispatch:
    types: [run_tests]
name: Run tests
jobs:
  test:
    name: Run your tests
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "I just ran all your tests!"

Você pode criar um evento de despacho de repositório seguindo as etapas explicadas na documentação da API do GitHub v3 .

Primeiro, crie um token de acesso pessoal (PAT) no GitHub para autenticação.

Em seguida, você pode executar curlassim:

curl \
  -H "Authorization: token $YOUR_PAT" \
  --request POST \
  --data '{"event_type": "run_tests"}' \
  https://api.github.com/repos/$USER/$REPOSITORY/dispatches

Ao mesmo tempo, também queria compartilhar um pequeno projeto em que tenho trabalhado com um amigo que resolve esse problema exato.

https://www.actionspanel.app/

O ActionsPanel usa essa mesma repository_dispatchAPI, mas o faz com um token do GitHub App, para que você não precise se preocupar em gerenciar seu próprio PAT. Isso também facilita muito o acionamento de suas ações em equipes com várias pessoas.

Com base nas solicitações e nos comentários do usuário, criamos recursos para especificar para qual filial enviar repository_dispatche até criamos uma maneira de injetar parâmetros quando você deseja executar a ação.

Você configura seus botões com um arquivo yaml declarativo que você deixa no repositório, e o ActionsPanel lê esse arquivo e cria dinamicamente sua interface do usuário para que você possa acionar suas ações.

aaronbatilo
fonte
0

Outra maneira de resolver isso com a oferta atual de Ação do Github é criar uma productionramificação do mestre quando uma implantação é necessária e acionar a ação de implantação na productionramificação. O productionramo é essencialmente um espelho do master.

on:
  push:
    branches:    
      - master

O build / push do desenvolvedor pode acontecer sempre que houver uma confirmação para o mestre.

on:
  push:
    branches:    
      - production

Em algum momento da programação de lançamento, você pode aumentar o PR para a productionfilial. Isso cuidará da criação / implantação do produto.

user1064504
fonte