[PT-BR] Introdução ao Github Actions

Introdução ao Github Actions

Passo-a-passo de como usar a ferramenta

É tão bom ver tudo verdinho É tão bom ver tudo verdinho

Se você nao está familializado com DevOps e CI/CD, o GitHub Actions pode parecer um pouco confuso no início. Neste artigo vamos ver um tutorial passo-a-passo de como utilizar a ferramenta.

Do ponto de vista de CI/CD (Continuous Integration/Continuous Delivery) o objetivo principal do GitHub Actions e dos Workflows é testar o software sempre que houver alguma mudança, por mínima que seja. Assim é possível detectar bugs e corrigir as coisas no momento em que elas aparecerem.

Hoje vamos aprender mais sobre o GitHub Actions e ver como usar scripts em bash e Python junto com a ferramenta.

GitHub Actions vs. Workflows

Primeiramente é importante estabelecer a diferença entre GitHub Actions e Workflows. Como a documentação do GitHub Actions menciona, ações são tarefas individuais que você pode combinar para criar jobs e customizar seu workflow. Por outro lado, Workflows são “processos automáticos customizados” que você pode configurar no seu repositório para dar build, testar e criar packages em qualquer projeto no GitHub. Em outras palavras:

Criando nosso primeiro Workflow

Primeiro vamos criar um wokflow sem actions para entender como eles funcionam. Workflows são definidos usando arquivos YAML e você deve salvá-los no diretório .github/workflows, na raiz do seu repositório;

Para criar um workflow precisamos definir essas coisas:

A sintaxe básica para um workflow é:

Primeiro precisamos definir o evento que aciona o workflow. Neste exemplo nós queremos imprimir saudações sempre que alguém der push no repositório.

Um run de um worklow é composto de um ou mais jobs. Cada job roda numa máquina especificada em runs-on. A máquina pode ser um runner hospedado pelo GitHub ou hospedado pelo usuário. Neste exemplo vamos usar o runner ubuntu-latest fornecido pelo GitHub.

Um job contém uma sequência de tarefas chamada steps. Cada step roda um comando, uma ação de configuração ou uma action. Cada step pode ter um comando run que usa o shell do sistema operacional da máquina. Vamos ver como dar echo (print) em uma mensagem.

Ok, agora vamos juntar tudo que vimos até aqui. Crie um arquivo first_workflow.yml dentro do seu repositório e code file inside .github/workflows on your repo, then paste this code:

# seu-repositorio/.github/workflows/first_workflow.yml

name: First Workflow                                               

on: push                                                  

jobs:                         
  first-job:                           
    name: Say hi                           
    runs-on: ubuntu-latest                           
    steps:                           
    - name: Print a greeting                             
      run: echo Hi from our first workflow!
      

Agora se você der commit adicionando esse arquivo ao repositório, der push e for na aba Actions no site do GitHub você pode ver o workflow e as saídas:

The outputs of our fist workflow As saídas do primeiro workflow

Usando uma Action no nosso workflow

Actions são tarefas individuais e podemos usá-las a partir de 3 fontes:

Elas rodam como um step no nosso workflow. Para chamá-las usamos a sitaxe use. Neste exemplo vamos usar uma Action que imprime arte em ASCII, escrita por Mike Coutermarsh. Como ela está definida em um repositório público nós só precisamos passar o nome do repositório:

# seu-repositorio/.github/workflows/first_workflow.yml

name: First Workflow

on: push                                                  

jobs:                         
  first-job:                           
    name: Say hi                           
    runs-on: ubuntu-latest                           
    steps:                           
      - name: Print a greeting                             
        run: echo Hi from our first workflow!   

      - name: Show ASCII greeting                             
        uses: mscoutermarsh/ascii-art-action@master   
        with:                               
          text: 'HELLO!'

A sintaxe with é um mapeamento entre parametros de entrada definidos pela action. O resultado:

The result of the ASCII art Action O resultado da action ASCII

Usando Python nos Workflows

Como cientistas de dados nós usamos bastante Python no nosso dia-a-dia, então é uma boa aprender como usar Python nos workflows. Definir uma versão específica do Python ou PyPy é a maneira recomendada de usar Python com GitHub Actions porque assim a gente garante um comportamento consistente entre os diferentes runners e diferentes versões do Python.

Depois de definir a versão do Python nós podemos rodar os comandos como fazemos em um computador comum. Neste exemplo vamos instalar o Scrapy e rodar um script para pegar todos os posts do TDS sobre GitHub Actions. Como queremos rodar um script salvo no nosso próprio repositório precisamos da action checkout para poder acessá-lo. Vamos criar o job e rodar o script:

# seu-repositorio/.github/workflows/first_workflow.yml

name: First Workflow

on: push                                                  

jobs:                         
  first-job:                           
    name: Say hi                           
    runs-on: ubuntu-latest                           

    steps:                           
      - name: Print a greeting                             
        run: echo Hi from our first workflow!  

      - name: Show ASCII greeting                             
        uses: mscoutermarsh/ascii-art-action@master    
        with:                               
          text: 'HELLO!'                                                           

  get-posts-job:                            
    name: Get TDS posts                            
    runs-on: ubuntu-latest     

    steps:                             
      - name: Check-out the repo under $GITHUB_WORKSPACE                               
        uses: actions/checkout@v2         

      - name: Set up Python 3.8                               
        uses: actions/setup-python@v2                               
        with:                                 
          python-version: '3.8'          

      - name: Install Scrapy                               
        run: pip install scrapy         

      - name: Get TDS posts about GitHub Actions                                 
        run: scrapy runspider posts_spider.py -o posts.json

Queremos salvar os posts em um arquivo, então vamos aprender como fazer isso.

Persistindo os dados gerados durante um Workflow

Um artefato (artifact) é um arquivo ou uma coleção de arquivos produzidos durante a execução de um worklfow. Podemos passar esse artefato para outro job no mesmo workflow ou fazer download do arquivo usando a UI do GitHub.

Vamos baixar o JSON com os posts para ver como isso funciona. Para trabalhar com artifacts precisamos das actions upload-artifact e download-artifact. Para fazer upload de um artefato precisamos especificar o caminho para o arquivo ou diretório e o nome do artefato.

# seu-repositorio/.github/workflows/first_workflow.yml

# [...]

get-posts-job:                            
    name: Get TDS posts                            
    runs-on: ubuntu-latest

    steps:                             
      - name: Check-out the repo under $GITHUB_WORKSPACE                               
        uses: actions/checkout@v2         

      - name: Set up Python 3.8                               
        uses: actions/setup-python@v2                               
        with:                                 
          python-version: '3.8'          

      - name: Install Scrapy                               
        run: pip install scrapy         

      - name: Get TDS posts about GitHub Actions                                 
        run: scrapy runspider posts_spider.py -o posts.json

      - name: Upload artifact                      
        uses: actions/upload-artifact@v2                        
        with:                                 
          name: posts                                 
          path: posts.json

E agora podemos baixar o arquivo usando a UI do GitHub:

Downloading the artifact Baixando o artefato

Criando sua primeira Action

Actions podem ser criadas usando containers do Docker, JavaScript ou usando shell scripts (uma action composite run steps). O principal caso de uso para actions composite run steps é quando você tem muitos shell scripts para automatizar alçoes e escrever um script para combiná-los é mais fácil do que usar JavaScript ou Docker.

Os três componentes principais de uma action são runs, inputs e outputs.

O nome do arquivo de uma action pode ser tanto action.yml ou action.yaml. Vamos usar o exemplo da documentação do GitHub e criar uma action que imprime a mensagem “Hey [user]”. Como é uma action composite vamos usar a sintaxe using: "composite":

    # action.yml

    name: 'Hey From a GitHub Action'

    description: 'Greet someone'

    inputs:
      user:  # id of input
        description: 'Who to greet'
        required: true
        default: 'You'

    runs:
      using: "composite"
      steps: 
        - run: echo Hey $.
          shell: bash

Se uma action é definida no mesmo repositório que o workflow podemos nos referir a ela usando ./caminho-para-o-arquivo-da-action. Neste caso precisamos acessar o arquivo dentro do repositório, então também usamos a action checkout.

Se a action for definida em um repositório público podemos nos referir a ela usando um commit específico, uma versão de um release ou um branch.

Rodando uma Action salva no mesmo repositório


    # .github/workflows/use-action-same-repo.yml

    name: Action from the same repo

    on: push 
    jobs:                                 
      use-your-own-action:                           
        name: Say Hi using your own action                           
        runs-on: ubuntu-latest                           
        steps:                             
          - uses: actions/checkout@v2
                                                                
          - uses: ./ **# the action.yml file is in the root folder                            
            with:                                
             user: 'Déborah'

Rodando uma Action salva em um repositório público

# .github/workflows/use-action-public-repo.yml

name: Action from a public repository

on: push 
jobs:                                 
  use-your-own-action:                           
    name: Say Hi using your own action                           
    runs-on: ubuntu-latest                           
    steps:                                               
      - uses: dmesquita/github-actions-tutorial@master                            
        with:                                
         user: 'Déborah'

E chegamos ao fim do nosso passo-a-passo. Você também pode usar variáveis e secrets no workflow, fazer cache de dependência para diminuir o tempo necessário para eles rodarem e conectar bancos de dados e containers para gerenciar as ferramentas do workflow.

Neste tutorial não fazemos uso de uma das coisas mais legais do CI que é rodar testes sempre para detectar bugs no processo. Mas eu acho que é importante entender primeiro como as actions e os wokflows funcionam antes de fazer uso disso. Espero que agora seja mais fácil para você começar a usar as GitHub Actions e outras ferramentas de CI.

Você pode ver todo o código usado neste artigo aqui: https://github.com/dmesquita/github-actions-tutorial

Obrigada pela leitura!