Este documento de trabalho reúne um conjunto de boas práticas para usar o GitHub Actions. Se você tiver sugestões ou acréscimos, abra um pull request no GitHub!
Por padrão, o GitHub Actions encerra os fluxos de trabalho depois de 6 horas, caso eles não tenham terminado até lá. Muitos fluxos de trabalho não precisam nem de perto de tanto tempo para terminar, mas às vezes acontecem erros inesperados ou um job trava até que a execução do fluxo de trabalho seja encerrada 6 horas depois de começar. Por isso, é recomendável especificar um tempo limite menor.
O tempo limite ideal depende de cada fluxo de trabalho, mas 30 minutos costuma ser mais do que suficiente para os fluxos de trabalho usados nos repositórios do Exercism.
Isso tem as seguintes vantagens:
jobs:
configlet:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- [...]
As actions devem ser tratadas como dependências da sua linguagem de programação preferida1: elas são código escrito por autores terceiros, fora do controle do Exercism. Mesmo que você confie nos autores da action, pode haver uma tomada hostil do repositório, o que dará indiretamente a essas pessoas acesso aos repositórios do Exercism, incluindo permissão de escrita.
Por isso, considere com cuidado se vale mesmo a pena introduzir uma nova action ou se é melhor mover o código para uma action (nova) sob o controle do Exercism.
Considere também se a action é mantida ativamente, por exemplo verificando a atividade recente do repositório ou confirmando que a action faz parte de uma organização, e não de uma conta individual.
Actions publicadas pelo GitHub ou pela organização do Exercism podem, em geral, ser consideradas razoavelmente seguras para incluir sem cuidado especial.
Por padrão, o token de acesso concedido ao fluxo de trabalho tem permissões amplas, tanto de leitura quanto de escrita.
O princípio do menor privilégio também deve ser aplicado aos fluxos de trabalho.
Você pode especificar de quais permissões um fluxo de trabalho precisa em cada fluxo de trabalho.
Se um fluxo de trabalho só precisa ler o conteúdo de um repositório, mas não escrever nele, por exemplo porque é uma verificação de CI comum, você pode restringir o token assim:
permissions:
contents: read
Consulte a documentação do GitHub para ver a lista completa de permissões.
Ao usar outras actions, fixe-as em um commit (pelo SHA), não em um branch ou uma tag. Isso garante que o mesmo código será executado sempre, o que não é garantido quando você fixa em um branch ou uma tag.
Isso traz dois benefícios:
A única exceção a essa regra podem ser as actions que nós (o Exercism) criamos.
Normalmente, você quer fixar no SHA do commit de uma release específica.
Para encontrar o SHA do commit de uma release, vá até a página de releases do repositório da action (por exemplo, https://github.com/actions/checkout/releases).
Encontre a release que você quer usar e clique no SHA abreviado (por exemplo, a12a394) listado na seção de resumo à esquerda da release.
Você será então redirecionado para a página de detalhes da release, que mostra o SHA completo do commit que você pode usar.
- name: Checkout code
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
A maioria dos fluxos de trabalho roda nos runners compatíveis do GitHub. Ao usar um desses runners, use uma versão específica em vez da versão mais recente.
Isso garante que o fluxo de trabalho sempre rodará no mesmo runner, o que torna a sua build estável.
Use:
runs-on: ubuntu-22.04
em vez de:
runs-on: ubuntu-latest
Muitas vezes não é necessário nem útil rodar a CI em commits intermediários se um commit mais novo foi enviado nesse meio tempo.
Você pode configurar uma estratégia de concorrência para cancelar automaticamente os fluxos de trabalho em execução no mesmo contexto.
Para cancelar builds intermediárias em um PR, você pode usar as seguintes configurações de concorrência:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
O exemplo acima é baseado no fluxo de trabalho de CI do PkgTemplates.jl, publicado sob a licença MIT:
MIT License
Copyright (c) 2017-2020 Chris de Graaf, Invenia Technical Computing Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
As práticas mencionadas acima não são, de forma alguma, exaustivas. Para um guia completo sobre boas práticas de segurança para usar o GitHub Actions com segurança, confira o guia de segurança do GitHub.
Você pode usar o checklist a seguir para verificar se um fluxo de trabalho segue as boas práticas. O checklist não tem a intenção de ser completo, mas sim de focar nos itens mais importantes.
a menos que a linguagem use o ecossistema npm. ↩