GitHub
Plataforma de hospedagem de código com Git, CI/CD, colaboração e Pages. Git é o motor; GitHub é o ecossistema ao redor.
Conceitos Fundamentais
| Tipo | Uso |
|---|---|
| Personal | sua conta individual (alfredo-petri) |
| Organization | time/empresa — times, permissões granulares |
| Enterprise | SSO, SAML, auditoria, compliance |
| Termo | Significado |
|---|---|
| Upstream | repo original do qual você fez fork |
| Issue | tarefa, bug ou feature request |
| Actions | CI/CD nativo (YAML workflows) |
| Pages | hospedagem gratuita de sites estáticos |
Repositórios
# criar novo
gh repo create meu-projeto --public --clone
gh repo create meu-projeto --private --clone
# fork de repo alheio
gh repo fork alfredo-petri/docs --clone
# clonar
gh repo clone alfredo-petri/docs
# ver info
gh repo view
gh repo view alfredo-petri/docs --web
Configurações importantes
Issues
Sistema de tracking de tarefas, bugs e features.
gh issue create --title "Bug: login falha com email inválido" --body "..."
gh issue list
gh issue list --label bug --assignee @me
gh issue view 42
gh issue close 42
gh issue reopen 42
# labels
gh label create priority/high --color F85149 --description "Alta prioridade"
gh label list
Labels padrão
| Label | Uso |
|---|---|
| bug | algo que não funciona |
| enhancement | nova funcionalidade |
| documentation | melhorias em docs |
| good first issue | convidativa para novos contribuidores |
| help wanted | precisa de ajuda externa |
Template de Issue
Crie .github/ISSUE_TEMPLATE/bug_report.md:
---
name: Bug Report
about: Reporte um bug
title: "[Bug] "
labels: bug
---
**Descrição**
Descrição clara do bug.
**Passos para reproduzir**
1. Vá para '...'
**Comportamento esperado**
O que deveria acontecer.
Pull Requests
Centro da colaboração no GitHub. Proposta de mudança revisada antes de mergear.
gh pr create --title "feat: adicionar login" --body "Closes #42"
gh pr create --draft # rascunho (não pede review)
gh pr list
gh pr list --state merged
gh pr view 42
gh pr checkout 42 # baixar branch do PR
gh pr diff 42
gh pr review 42 --approve
gh pr review 42 --comment "LGTM"
gh pr merge 42 --squash
gh pr merge 42 --rebase
gh pr merge 42 --merge
gh pr close 42
Status de PR
| Status | Significado |
|---|---|
| Draft | em desenvolvimento, não pronto |
| Open | PR criado, aguardando |
| Changes requested | revisor pede alterações |
| Approved | aprovado, pode mergear |
| Merged | código incorporado |
| Closed | fechado sem merge |
PR Template
.github/PULL_REQUEST_TEMPLATE.md:
## Descrição
## Tipo de mudança
- [ ] Bug fix
- [ ] Nova funcionalidade
- [ ] Refatoração
## Issues relacionadas
Closes #N
Code Review Workflow
Branch Protection Rules
Settings → Branches → Add branch protection rule
Branch name pattern: main
☑ Require a pull request before merging
☑ Require approvals (1)
☑ Dismiss stale reviews
☑ Require status checks to pass
☑ Require conversation resolution
☑ Require linear history (rebase only)
☑ Do not allow bypassing
GitHub Actions
CI/CD nativo. Workflows em YAML dentro de .github/workflows/.
Estrutura básica
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run build
- run: npm test
Eventos (on)
Matrix builds
strategy:
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
Actions do marketplace
| Ação | Uso |
|---|---|
| actions/checkout@v4 | clonar repo |
| actions/setup-node@v4 | setup Node.js |
| actions/cache@v4 | cache de dependências |
| actions/upload-artifact@v4 | guardar artefatos |
| appleboy/ssh-action@v1.0.3 | comandos via SSH |
| docker/build-push-action@v5 | build + push Docker |
| softprops/action-gh-release@v2 | releases automáticas |
Secrets
Uso no YAML:
${{ secrets.SSH_KEY }}
${{ vars.DEPLOY_PATH }}
CLI:
gh secret set SSH_KEY < ~/.ssh/id_ed25519
gh secret list
gh secret remove SSH_KEY
Exemplo — Deploy
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run build
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ~/apps/meu-app
git pull origin main
npm ci
npm run build
pm2 reload meu-app
GitHub Pages
Hospedagem gratuita de sites estáticos diretamente do repositório. Ideal para documentação, blogs, portfólios.
Tipos de site
Publicar Guias neste Repositório
Este repositório (alfredo-petri/docs) usa GitHub Pages para publicar os guias. Abaixo, as opções para configurar:
Opção A: Publicar da branch main — pasta /docs
Recomendada para este repositório. A estrutura exata — guias dentro de docs/ na branch main — é o caso de uso mais direto.
Settings → Pages → Source: Deploy from a branch
Branch: main
Folder: /docs
→ Salvar
O site fica em: https://alfredo-petri.github.io/docs/
docs/.nojekyll na raiz da pasta publicada para desativar o Jekyll (que ignora arquivos começando com _ ou .).Opção B: Branch gh-pages separada
git checkout --orphan gh-pages
git rm -rf .
git add . && git commit -m "chore: publish docs"
git push origin gh-pages
Settings → Pages → Source: Deploy from a branch
Branch: gh-pages
Folder: / (root)
Opção C: GitHub Actions para Pages
Usa o workflow oficial actions/deploy-pages. Permite deploy com build (Jekyll, Vite, etc).
name: Deploy to GitHub Pages
on:
push:
branches: [main]
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/configure-pages@v4
- uses: actions/upload-pages-artifact@v3
with:
path: docs/
- id: deployment
uses: actions/deploy-pages@v4
Configurar: Settings → Pages → Source: GitHub Actions
Opção D: Pages com build (Node.js)
Para projetos que geram HTML estático (Vite, Next.js export).
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run build # gera pasta dist/
- uses: actions/upload-pages-artifact@v3
with:
path: dist/
deploy:
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/deploy-pages@v4
Publicar via GitHub CLI / API
O gh CLI não tem comando direto para Pages, mas existem várias formas de automatizar o deploy.
Opção 1: Push via subtree (mais simples)
Publica uma subpasta do repo direto para a branch gh-pages sem precisar de checkout separado.
# publicar pasta docs/ para branch gh-pages
git subtree push --prefix docs origin gh-pages
# forçar repush (se já existir)
git push origin `git subtree split --prefix docs`:gh-pages --force
Opção 2: gh-pages npm package
Faz push automático de uma pasta para a branch gh-pages.
# instalar
npm install -g gh-pages
# publicar pasta dist/ ou docs/
gh-pages -d docs
# com mensagem customizada
gh-pages -d dist -m "deploy: atualizar documentação"
# com dotfiles (arquivos ocultos)
gh-pages -d docs -t true
Opção 3: GitHub API (gh api)
Configura Pages via API REST.
# listar configuração atual
gh api repos/{owner}/{repo}/pages
# criar/configurar Pages (branch + pasta)
gh api -X POST repos/{owner}/{repo}/pages \
-f build_type=legacy \
-f source.branch=master \
-f source.path=/docs
# habilitar Pages via API
gh api -X PUT repos/{owner}/{repo}/pages \
-f build_type=legacy \
-f source.branch=master \
-f source.path=/docs
# listar builds de Pages
gh api repos/{owner}/{repo}/pages/builds
# forçar novo build
gh api -X POST repos/{owner}/{repo}/pages/builds
Opção 4: Trigger workflow existente
Se já tiver um workflow de deploy, execute via CLI.
# listar workflows
gh workflow list
# executar workflow específico
gh workflow run deploy-pages.yml
# com inputs
gh workflow run deploy-pages.yml \
-f environment=production \
-f ref=main
# listar execuções recentes
gh run list --workflow=deploy-pages.yml
# acompanhar execução em tempo real
gh run watch
Opção 5: Deploy via SSH + gh
Para servidores VPS — deploy manual via SSH após push.
# deploy completo: build + push + deploy remoto
npm run build && \
git add -A && git commit -m "deploy" && git push && \
ssh deployer@meuserver.com "cd ~/app && git pull && npm ci && npm run build && pm2 reload app"
# simplificado com gh secret
gh secret set SSH_KEY < ~/.ssh/id_ed25519
# em GitHub Actions:
- uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ~/app
git pull origin main
npm ci && npm run build
pm2 reload app
Comparativo
| Método | Quando usar | Complexidade |
|---|---|---|
| git subtree push | Docs estáticos, sem build | Baixa |
| gh-pages npm | Projetos com build (React, Vite) | Baixa |
| gh api | Automação programática | Média |
| gh workflow run | CI/CD já configurado | Baixa |
| SSH + gh | Deploy em VPS própria | Média |
Settings → Pages → Deploy from branch: main, pasta /docs. Para automação completa, use o workflow GitHub Actions (Opção C na seção anterior).Domínio Personalizado
Settings → Pages → Custom domain:
→ Digitar docs.alfredopetri.com
→ DNS: CNAME docs.alfredopetri.com → alfredo-petri.github.io
→ Enforce HTTPS → ON (após propagação DNS)
Ou criar arquivo CNAME na raiz:
docs.alfredopetri.com
404 personalizado
Crie 404.html na raiz do diretório publicado.
Resumo rápido — GitHub Pages
| Passo | Ação |
|---|---|
| 1 | Estruturar site em docs/ ou pasta separada |
| 2 | touch docs/.nojekyll |
| 3 | Settings → Pages → branch + pasta |
| 4 | Aguardar 1-2 min para primeiro deploy |
| 5 | (opcional) Domínio personalizado + HTTPS |
| 6 | Verificar em https://usuario.github.io/repo |
Dependabot
Monitora dependências com vulnerabilidades e abre PRs automaticamente.
Settings → Code security → Dependabot
☑ Dependabot alerts → ON
☑ Dependabot security updates → ON
.github/dependabot.yml:
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 10
labels:
- dependencies
Code Scanning (CodeQL)
Análise estática de segurança dentro do CI.
name: CodeQL
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: javascript
- uses: github/codeql-action/analyze@v3
GitHub CLI (gh) — Avançado
# Navegação
gh browse # abrir repo no navegador
gh browse --settings
# Releases
gh release create v1.0.0 --title "v1.0.0" --notes "Changelog..."
gh release list
gh release download v1.0.0
gh release upload v1.0.0 asset.zip
# Gists
gh gist create arquivo.txt
gh gist list
gh gist view GIST_ID
# Search
gh search repos "topic:react"
gh search issues "label:bug" --repo user/repo
gh search prs --state open --author @me
# Secrets
gh secret list
gh secret set SSH_KEY < ~/.ssh/id_ed25519
gh secret remove SSH_KEY
# Config
gh config set editor nvim
gh config set git_protocol ssh
Discussions / Projects / Wiki
Discussions
Fórum do repositório (separado de Issues):
Settings → Features → Discussions → ON
Categorias:
└─ 📣 Announcements
└─ 💡 Ideas
└─ 🙏 Q&A
└─ 💬 General
Projects (kanban)
Quadro de gerenciamento visual vinculado a Issues e PRs.
gh project list
gh project view 1
gh project item-add 1 --url https://github.com/user/repo/issues/42
Wiki
Repositório separado de documentação:
git clone https://github.com/user/repo.wiki.git
Releases
Distribuição de versões com changelog e assets.
gh release create v1.0.0 \
--title "v1.0.0" \
--notes "### Added\n- Feature X\n### Fixed\n- Bug Y" \
--target main
# com assets
gh release create v1.0.0 dist/meu-app.zip --title "v1.0.0"
Referência Rápida
| Situação | Comando / Ação |
|---|---|
| Criar repositório | gh repo create nome --public --clone |
| Fork | gh repo fork user/repo --clone |
| Criar Issue | gh issue create --title "..." |
| Criar PR | gh pr create --title "..." --body "..." |
| Aprovar PR | gh pr review 42 --approve |
| Mergear PR | gh pr merge 42 --squash |
| Configurar Pages | Settings → Pages → branch + pasta |
| Adicionar secret | gh secret set NOME < arquivo |
| Config Dependabot | .github/dependabot.yml |
| Novo workflow | .github/workflows/*.yml |
| Ver runs Actions | gh run list |
| Criar release | gh release create v1.0.0 |
| Branch protection | Settings → Branches → Add rule |
| Deletar branch remota | git push origin --delete branch |
| Fechar issue com PR | Closes #42 no body do PR |
| Sync fork | gh repo sync owner/repo -b main |