Do conceito ao deploy: pipeline automático com publicação no GitHub Pages.
Printa a tela e escaneia o QR Code.
Inscreva-se já no Link.
GitHub.Todos os erros, avisos e dicas foram documentados a partir de situações reais vividas durante o desenvolvimento deste e de outros projetos.
GitHub Actions é uma plataforma de automação integrada ao GitHub que permite executar tarefas automaticamente em resposta a eventos no repositório.
Em projetos de dados, isso significa que a cada atualização do código, o pipeline executa sozinho: instala pacotes, roda scripts, renderiza relatórios e publica resultados.
Tudo isso sem abrir o RStudio, sem rodar nada manualmente.
CI (Continuous Integration): integração contínua. Cada atualização de código é testada e validada automaticamente.
CD (Continuous Deployment): entrega contínua. O resultado validado é publicado automaticamente para o ambiente final.
Em ciência de dados: a análise roda automaticamente e o relatório é publicado sem intervenção manual.
Dica
Para projetos de análise estatística com relatório em Quarto, o GitHub Actions é a forma mais simples de garantir que o resultado publicado sempre corresponde ao código do repositório.
| Ferramenta | Onde roda | Indicada para |
|---|---|---|
| GitHub Actions | Nuvem GitHub | Projetos no GitHub |
| GitLab CI | Nuvem GitLab | Projetos no GitLab |
| Jenkins | Servidor próprio | Empresas com infraestrutura local |
| Azure Pipelines | Nuvem Microsoft | Integração com Azure |
Dica
Para portfólio e projetos acadêmicos, o GitHub Actions é a escolha mais simples pois não exige nenhuma infraestrutura adicional.
Um workflow é o arquivo que define toda a automação. Ele fica em .github/workflows/ e é escrito em formato YAML.
Cada repositório pode ter vários workflows para finalidades diferentes.
O nome do arquivo pode ser qualquer um com extensão .yml.
.github/
└── workflows/
├── pipeline.yml # roda a análise e publica
└── verificar.yml # verifica o código a cada PR
Um trigger define quando o workflow dispara. Os mais comuns são:
push: dispara quando há um push em uma branch específicapull_request: dispara quando um pull request é abertoschedule: dispara em horários definidos (cron)workflow_dispatch: dispara manualmente pela interface do GitHubDica
Durante o desenvolvimento, use workflow_dispatch para rodar o workflow manualmente sem precisar fazer um push a cada teste.
Um runner é a máquina virtual onde o workflow executa. O GitHub fornece runners gratuitos com Ubuntu, Windows e macOS.
Para projetos de dados em R, sempre use ubuntu-22.04 pois é o mesmo sistema da imagem rocker/tidyverse e do Posit Package Manager.
Importante
Nunca use ubuntu-latest em projetos de dados em R. A versão exata do Ubuntu afeta quais binários o Posit Package Manager entrega. Com ubuntu-22.04 (Jammy) os pacotes instalam como binários pré-compilados. Com versões diferentes, o R compila do código fonte e o workflow trava.
Um job é um conjunto de steps que roda em um runner. Por padrão, jobs diferentes rodam em paralelo.
Para publicar no GitHub Pages, precisamos de dois jobs em sequência: build e deploy.
steps:
- name: Clonar repositório
uses: actions/checkout@v4
- name: Instalar pacotes R
run: Rscript -e "install.packages('tidyverse')"uses: usa uma action pronta do marketplace do GitHubrun: executa um comando diretamente no terminal do runnerActions são blocos reutilizáveis criados pela comunidade. Em vez de escrever scripts longos, você usa actions prontas para tarefas comuns.
As mais usadas em projetos de dados em R:
| Action | Função |
|---|---|
actions/checkout@v4 |
Clona o repositório no runner |
r-lib/actions/setup-r@v2 |
Instala R no runner |
quarto-dev/quarto-actions/setup@v2 |
Instala Quarto no runner |
actions/configure-pages@v5 |
Configura o GitHub Pages |
actions/upload-pages-artifact@v3 |
Envia os arquivos para o Pages |
actions/deploy-pages@v4 |
Publica no GitHub Pages |
O arquivo de workflow deve estar exatamente neste caminho dentro do repositório:
.github/
└── workflows/
└── pipeline.yml
Aviso
A pasta .github começa com ponto e pode ser invisível no Windows. No terminal do RStudio, confirme que ela foi criada com ls -la antes de fazer o push.
name: Pipeline de análise e publicação
on:
push:
branches: [main, master]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-22.04
steps:
- ...
deploy:
needs: build
runs-on: ubuntu-22.04
steps:
- ...name: nome do workflow que aparece na aba Actions do GitHub.
on: define os gatilhos. push dispara ao fazer push no repositório. workflow_dispatch permite rodar manualmente.
permissions: define o que o workflow pode fazer no repositório. Para publicar no Pages são necessárias as permissões pages: write e id-token: write.
concurrency: garante que apenas uma execução do workflow roda por vez. Evita conflitos quando há vários pushes em sequência.
jobs:
build:
runs-on: ubuntu-22.04
steps:
- name: Clonar repositório
uses: actions/checkout@v4
- name: Instalar R
uses: r-lib/actions/setup-r@v2
with:
r-version: '4.4.1'
use-public-rspm: true
- name: Instalar Quarto
uses: quarto-dev/quarto-actions/setup@v2
- name: Instalar pacotes R
run: |
Rscript -e "
options(repos = c(CRAN = 'https://packagemanager.posit.co/cran/__linux__/jammy/latest'));
install.packages(c('tidyverse', 'knitr', 'rmarkdown'))
" - name: Rodar simulação
run: Rscript R/01_simular_dados.R
- name: Renderizar relatório
run: |
quarto render report/relatorio_simulacao.qmd \
--output-dir ../docs \
--execute-dir .
- name: Copiar index.html para docs
run: cp report/index.html docs/index.html
- name: Configurar GitHub Pages
uses: actions/configure-pages@v5
- name: Enviar artefato para Pages
uses: actions/upload-pages-artifact@v3
with:
path: docs deploy:
needs: build
runs-on: ubuntu-22.04
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Publicar no GitHub Pages
id: deployment
uses: actions/deploy-pages@v4needs: build garante que o deploy só roda após o build terminar com sucessoenvironment define o ambiente de publicação e expõe o link do Pages no summaryurl captura o link gerado automaticamente pelo Pages e exibe no summary do workflowA action r-lib/actions/setup-r instala R no runner com configurações otimizadas para CI/CD:
r-version: fixa a versão do R, garantindo reprodutibilidadeuse-public-rspm: true: ativa automaticamente o Posit Package Manager como repositório padrãoImportante
Sempre fixe a versão do R com r-version. Sem isso, o runner instala a versão mais recente, que pode mudar entre execuções e quebrar a reprodutibilidade.
No GitHub Actions, o runner usa Ubuntu. O CRAN padrão não fornece binários para Linux, o que força o R a compilar cada pacote do código fonte em C++.
options(repos = c(CRAN = 'https://packagemanager.posit.co/cran/__linux__/jammy/latest'))
install.packages(c('tidyverse', 'knitr', 'rmarkdown'))Aviso
O endereço jammy no URL corresponde ao Ubuntu 22.04. Se mudar o runner para outra versão do Ubuntu, o endereço do Posit Package Manager também muda.
- name: Instalar pacotes R
run: |
Rscript -e "
options(repos = c(CRAN = 'https://packagemanager.posit.co/cran/__linux__/jammy/latest'));
install.packages(c('tidyverse', 'knitr', 'rmarkdown'))
"Dica
Mantenha a lista de pacotes no workflow enxuta. Instale apenas o necessário para o relatório rodar. Cada pacote adicional aumenta o tempo de execução mesmo com binários pré-compilados.
A action quarto-dev/quarto-actions/setup instala a versão mais recente do Quarto CLI no runner. Não é necessário especificar a versão para a maioria dos projetos.
- name: Renderizar relatório
run: |
quarto render report/relatorio_simulacao.qmd \
--output-dir ../docs \
--execute-dir .report/relatorio_simulacao.qmd: caminho para o arquivo a renderizar--output-dir ../docs: pasta onde o HTML será salvo. A pasta docs/ fica na raiz do projeto--execute-dir .: define o diretório de trabalho do R durante a execuçãoImportante
O parâmetro --execute-dir é obrigatório quando o .qmd está em uma subpasta. Sem ele, o R executa a partir da pasta report/ e não encontra os arquivos em data/ ou R/, gerando erro de arquivo não encontrado.
GitHub Pages é um serviço gratuito do GitHub que hospeda sites estáticos diretamente a partir de um repositório.
Para projetos de dados, é a forma mais simples de publicar um relatório HTML com um link público permanente.
O link segue o padrão:
https://seu-usuario.github.io/nome-do-repositorio/
Aviso
O GitHub Pages precisa ser ativado antes da primeira execução do workflow. Se o Pages não estiver configurado, o step configure-pages falha com o erro Get Pages site failed. Not Found.
Quando alguém acessa a raiz do site, por exemplo https://seu-usuario.github.io/projeto/, o GitHub Pages procura por um arquivo index.html. Se não encontrar, retorna erro 404.
O index.html que usamos redireciona automaticamente para o relatório:
Sem ele o visitante precisa digitar o nome completo do arquivo no link. Com ele, o link raiz já abre o relatório direto.
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=relatorio_simulacao.html">
<title>Redirecionando...</title>
</head>
<body>
<p>Redirecionando para o relatório...</p>
</body>
</html>Esse arquivo fica em report/index.html e é copiado para a pasta docs/ pelo workflow antes do deploy.
- name: Configurar GitHub Pages
uses: actions/configure-pages@v5
- name: Enviar artefato para Pages
uses: actions/upload-pages-artifact@v3
with:
path: docs
- name: Publicar no GitHub Pages
id: deployment
uses: actions/deploy-pages@v4configure-pages: verifica se o Pages está ativado e configura o ambienteupload-pages-artifact: empacota a pasta docs/ e envia para o GitHubdeploy-pages: publica o pacote enviado e gera o link públicosoja_actions/
├── .github/
│ └── workflows/
│ └── pipeline.yml
├── R/
│ └── 01_simular_dados.R
├── report/
│ ├── relatorio_simulacao.qmd
│ └── index.html
├── data/
└── README.md
No terminal do RStudio, dentro da pasta do projeto:
O link aparece no summary do workflow abaixo do job deploy:
https://seu-usuario.github.io/soja_actions/
Esse link é público e pode ser compartilhado diretamente no LinkedIn e colocado no README do projeto.
github-pages contém o HTML do relatório empacotado antes do deploy.Cada push ou execução manual gera uma nova linha na aba Actions. Isso é o comportamento esperado e desejado.
O histórico de execuções mostra:
Dica
Use mensagens de commit descritivas pois elas aparecem diretamente no histórico do Actions. git commit -m "fix: corrige caminho do CSV" é muito mais informativo do que git commit -m "ajuste".
Dica
Quando um workflow falha, os logs do step com erro mostram a mensagem exata. Leia a última linha antes do Error para identificar o problema.
Mensagem:
Error: Get Pages site failed. Please verify that the repository
has Pages enabled and configured to build using GitHub Actions.
Error: Not Found
Causa: O GitHub Pages não foi ativado antes da primeira execução do workflow.
Solução:
Sintoma: O workflow roda com sucesso mas ao acessar o link aparece erro 404.
Causa 1: O arquivo index.html não foi criado ou não foi copiado para a pasta docs/.
Solução: Verificar se o step Copiar index.html para docs está no workflow e se o arquivo report/index.html existe no repositório.
Causa 2: O relatório foi gerado com nome diferente do especificado no index.html.
Solução: Conferir se o nome do arquivo no <meta http-equiv="refresh"> do index.html corresponde ao nome gerado pelo Quarto.
Sintoma: O step de instalação de pacotes fica rodando por muito tempo ou excede o tempo limite do workflow.
Causa: O Posit Package Manager não está configurado e o R está compilando do código fonte.
Solução: Garantir que o options(repos = ...) com o endereço do Posit Package Manager está definido antes do install.packages:
Mensagem:
Error: 'data/ensaio_fungicida.csv' does not exist in current
working directory: '/home/runner/work/projeto/projeto/report'
Causa: O --execute-dir está faltando no comando quarto render. O Quarto executa a partir da pasta report/ e não encontra a pasta data/.
Solução: Adicionar --execute-dir . ao comando de renderização:
Causa 1: O arquivo .yml não está no caminho correto .github/workflows/.
Solução: Verificar no repositório do GitHub se a pasta .github aparece na raiz. Se não aparecer, o Git pode ter ignorado a pasta oculta.
Causa 2: A branch do push não corresponde à branch definida no trigger.
Solução: Verificar se o push foi feito para main e se o workflow tem main na lista de branches:
Mensagem:
Error: HttpError: Resource not accessible by integration
Causa: As permissões pages: write e id-token: write estão faltando no workflow.
Solução: Adicionar o bloco de permissões no início do workflow:
Importante
Sempre teste o pipeline localmente antes de fazer push. Cada execução com erro no Actions consome minutos do runner gratuito e fica registrada no histórico.
Se renderizar sem erros localmente, o workflow tem alta chance de passar.
Durante o desenvolvimento, use workflow_dispatch para rodar o workflow manualmente sem precisar fazer um push a cada teste:
Dica
Isso evita poluir o histórico de commits com mensagens como teste, ajuste, mais um teste apenas para disparar o workflow.
As mensagens de commit aparecem diretamente no histórico do Actions. Compare:
| Commit vago | Commit descritivo |
|---|---|
ajuste |
fix: corrige caminho do CSV no quarto render |
teste |
test: verifica instalacao de pacotes com posit |
ok |
feat: adiciona index.html com redirecionamento |
Commits descritivos tornam o histórico do Actions legível e facilitam identificar qual mudança causou uma falha.
Antes de subir o projeto e rodar o workflow pela primeira vez, confirme:
.yml está em .github/workflows/index.html existe em report/ubuntu-22.04 como runnerquarto render tem --execute-dir .source() e quarto::quarto_render()data/ é gerada pelos scripts e está no .gitignore.gitignore tem data/ e a pasta de output.github/workflows/pipeline.yml existe na raiz do projetoR/.qmd está em report/index.html está em report/index.html aponta para o nome correto do HTML gerado pelo Quartoubuntu-22.04 (não ubuntu-latest)r-version: '4.4.1'use-public-rspm: true está no step de instalação do Roptions(repos = ...) antes do install.packagesquarto render tem --output-dir apontando para ../docsquarto render tem --execute-dir .index.html para docs/ existepages: write e id-token: write estão no cabeçalhodeploy tem needs: build.github aparece na raiz do repositório no GitHubmain ou masterdeployErrorPrinta a tela e escaneia o QR Code.
Inscreva-se já no Link.
Jennifer Lopes | Café com R | GitHub Actions para projetos de dados em R