Guia sobre como usar Jekyll com o tema Chirpy
Sumário
- Introdução ao Jekyll e ao Tema Chirpy
- Instalação e Configuração
- Gerenciamento de Conteúdo com Chirpy
- Recursos de Formatação e Estilização
- Incorporando Mídia e Elementos Visuais
- Customização e Extensão do Tema
- Deploy e Publicação
- Troubleshooting e Resolução de Problemas
- Recursos Adicionais
Introdução ao Jekyll e ao Tema Chirpy
Bem-vindo a este guia avançado sobre a utilização do Jekyll em conjunto com o popular tema Chirpy. Este tutorial é projetado especificamente para usuários que já possuem familiaridade com os conceitos básicos do Jekyll e buscam aprofundar seus conhecimentos.
Pré-requisitos
Antes de começar, certifique-se de que você possui:
- Conhecimento básico de Jekyll e sua estrutura de diretórios
- Familiaridade com Markdown e Front Matter
- Experiência básica com linha de comando
- Docker instalado em seu sistema (recomendado)
O que é o Tema Chirpy?
O tema Chirpy eleva a experiência do Jekyll ao fornecer:
- Design moderno e responsivo
- Modo escuro/claro automático
- Sistema de busca integrado
- Suporte a comentários
- Integração com MathJax e Mermaid
- Otimização para SEO
Estrutura do Tutorial
Este tutorial está organizado em uma progressão lógica que permite implementar um site Jekyll/Chirpy completo do zero até a publicação, com foco em técnicas avançadas e melhores práticas.
Instalação e Configuração
Preparação do Ambiente
Método 1: Instalação Simplificada com Docker (Recomendado)
Para usuários que preferem um ambiente isolado e reproduzível:
1
2
3
4
5
6
7
8
9
# Criar diretório do projeto
mkdir meu-blog-chirpy
cd meu-blog-chirpy
# Clonar o tema Chirpy
git clone --depth 1 https://github.com/cotes2020/jekyll-theme-chirpy.git .
# Remover histórico git do tema (opcional)
rm -rf .git
Método 2: Instalação Local
Para usuários que preferem instalação direta no sistema:
Nota: Este método requer Ruby 3.0+ e Node.js 16+ instalados no sistema.
1
2
3
4
5
6
# Instalar dependências
bundle install
npm install
# Executar o site localmente
bundle exec jekyll serve
Configuração com Docker
Dockerfile Simplificado
Crie um Dockerfile
na raiz do projeto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Use imagem oficial do Jekyll
FROM jekyll/jekyll:4.2.2
# Definir diretório de trabalho
WORKDIR /srv/jekyll
# Copiar arquivos de dependências
COPY Gemfile* ./
COPY package*.json ./
# Instalar dependências Ruby e Node.js
RUN bundle install && \
npm install
# Copiar código fonte
COPY . .
# Construir o site
RUN JEKYLL_ENV=production bundle exec jekyll build
# Expor porta
EXPOSE 4000
# Comando padrão
CMD ["bundle", "exec", "jekyll", "serve", "--host", "0.0.0.0"]
Docker Compose (Alternativa Recomendada)
Para um fluxo de desenvolvimento mais eficiente, crie docker-compose.yml
:
1
2
3
4
5
6
7
8
9
10
11
version: '3.8'
services:
jekyll:
image: jekyll/jekyll:4.2.2
command: jekyll serve --watch --force_polling --host 0.0.0.0
ports:
- "4000:4000"
volumes:
- .:/srv/jekyll
environment:
- JEKYLL_ENV=development
Primeira Execução
Usando Docker Compose
1
2
3
4
5
6
# Iniciar o ambiente de desenvolvimento
docker-compose up
# Em outro terminal, instalar dependências (primeira vez)
docker-compose exec jekyll bundle install
docker-compose exec jekyll npm install
Verificação da Instalação
- Acesse http://localhost:4000
- Verifique se o site carrega corretamente
- Teste a navegação entre páginas
- Verifique se o modo escuro/claro funciona
Dica: Se encontrar erros, consulte a seção Troubleshooting deste tutorial.
Configuração Inicial do _config.yml
Edite o arquivo _config.yml
com suas informações:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Informações básicas do site
title: "Meu Blog Técnico"
tagline: "Compartilhando conhecimento sobre tecnologia"
description: "Blog pessoal sobre desenvolvimento, DevOps e tecnologias emergentes"
url: "https://meublog.com"
baseurl: ""
# Informações do autor
author:
name: "Seu Nome"
email: "seu@email.com"
links:
- https://github.com/seuusuario
- https://linkedin.com/in/seuusuario
# Configurações do tema
theme_mode: # [light|dark]
avatar: "/assets/img/avatar.jpg"
# Configurações de comentários (opcional)
comments:
active: utterances
utterances:
repo: "seuusuario/seurepositorio"
issue_term: "pathname"
# Analytics (opcional)
google_analytics:
id: "G-XXXXXXXXXX"
Gerenciamento de Conteúdo com Chirpy
Estrutura de Posts
Organização de Arquivos
O Chirpy segue a convenção padrão do Jekyll para posts. Você pode organizar seus arquivos de várias formas:
Estrutura Simples:
1
2
3
4
_posts/
├── 2025-01-15-meu-primeiro-post.md
├── 2025-01-20-tutorial-docker.md
└── 2025-02-01-deploy-automatico.md
Estrutura Organizada por Categorias:
1
2
3
4
5
6
7
8
9
_posts/
├── tutoriais/
│ ├── 2025-01-15-introducao-jekyll.md
│ └── 2025-01-20-configuracao-chirpy.md
├── devops/
│ ├── 2025-01-25-docker-compose.md
│ └── 2025-02-01-ci-cd-github.md
└── reviews/
└── 2025-02-05-ferramentas-2025.md
Importante: A estrutura de pastas é apenas para organização. As URLs finais são determinadas pela configuração
permalink
em_config.yml
.
Front Matter Avançado
Exemplo Completo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
layout: post
title: "Guia Completo de Deploy com GitHub Actions"
date: 2025-01-15 14:30:00 -0300
last_modified_at: 2025-01-16 09:00:00 -0300
author: gean
categories: [DevOps, CI/CD]
tags: [github-actions, deploy, automation, docker]
pin: true
math: false
mermaid: true
image:
path: /assets/img/posts/github-actions-cover.jpg
lqip: data:image/webp;base64,UklGRpoAAABXRUJQVlA4WAoAAAAQAAAADwAABwAAQUxQSDIAAAARL0AmbZurmr57yyIiqE8oiG0bejIYEQTgqiDA9vqnsUSI6H+oAERp2HZ65qP/VIAWAFZQOCBCAAAA8AEAnQEqEAAIAAVAfCWkAALp8sF8rgRgAP7o9FDvMCkMde9PK7euH5M1m6VWoDXf2FkP3BqV0ZYbO6NA/VFIAAAA
alt: "Fluxo de deploy automatizado com GitHub Actions"
excerpt: "Aprenda a configurar pipelines de deploy automatizado usando GitHub Actions, desde a configuração básica até estratégias avançadas de deployment."
description: "Tutorial completo sobre implementação de CI/CD com GitHub Actions para projetos Jekyll e aplicações web modernas."
toc: true
comments: true
---
Explicação dos Campos
Campos Obrigatórios:
layout
: Sempre “post” para artigostitle
: Título do post (usado em SEO)date
: Data de publicação (formato ISO 8601)
Campos Recomendados:
author
: ID do autor (referencia_data/authors.yml
)categories
: Máximo 2 categorias para melhor UXtags
: Tags relevantes (minúsculas, separadas por hífen)excerpt
: Resumo manual para listagens
Campos Opcionais:
pin
: Fixa o post no topo da página inicialmath
: Habilita MathJax para equaçõesmermaid
: Habilita diagramas Mermaidimage
: Configuração da imagem de destaquetoc
: Controla exibição do sumáriocomments
: Controla seção de comentários
Gerenciamento de Autores
Configuração em _data/authors.yml
Crie o arquivo _data/authors.yml
para centralizar informações dos autores:
1
2
3
4
5
6
7
8
9
10
11
gean:
name: "Gean Martins"
twitter: "geanmartins"
url: "https://geanmartins.com"
avatar: "/assets/img/authors/gean.jpg"
colaborador:
name: "Nome do Colaborador"
email: "colaborador@email.com"
url: "https://colaborador.com"
github: "colaborador"
Uso no Front Matter
1
2
3
4
5
# Post de autor único
author: gean
# Post com múltiplos autores
authors: [gean, colaborador]
Recursos de Formatação e Estilização
Elementos Básicos
Títulos e Estrutura
Use a hierarquia de títulos corretamente:
1
2
3
4
5
## Título Principal da Seção (H2)
### Subtítulo (H3)
#### Detalhes Específicos (H4)
Listas e Organização
Lista com marcadores:
- Item principal
- Subitem
- Outro subitem
- Segundo item principal
Lista numerada:
- Primeiro passo
- Segundo passo
- Subpasso A
- Subpasso B
- Terceiro passo
Lista de tarefas:
- Tarefa concluída
- Tarefa pendente
- Outra tarefa pendente
Prompts e Alertas
O Chirpy oferece quatro tipos de alertas para destacar informações importantes:
Dica Útil: Use prompts para destacar informações importantes e melhorar a experiência de leitura.
Informação: Este é um bloco informativo para contexto adicional.
Atenção: Cuidado com este procedimento, pois pode causar problemas se executado incorretamente.
Perigo: Esta ação é irreversível e pode causar perda de dados.
Código e Sintaxe
Código Inline
Use código inline
para comandos ou variáveis curtas dentro do texto.
Blocos de Código
Com especificação de linguagem:
1
2
3
# Comandos de terminal
docker-compose up -d
docker-compose logs -f
1
2
3
4
5
6
7
# Configuração YAML
version: '3.8'
services:
app:
image: nginx:alpine
ports:
- "80:80"
Com nome de arquivo:
1
2
3
4
# _config.yml
title: "Meu Blog"
description: "Descrição do blog"
url: "https://meublog.com"
Caminhos de Arquivo
Use a classe .filepath
para destacar caminhos:
Edite o arquivo _config.yml
na raiz do projeto.
Incorporando Mídia e Elementos Visuais
Gerenciamento de Imagens
Sintaxe Básica
1
2

_Legenda da imagem em itálico_
Controle de Tamanho
1
2
{: width="600" height="400" }
_Imagem com dimensões específicas_
Posicionamento
Imagem centralizada (padrão):
1
2

_Legenda centralizada_
Imagem à esquerda:
1
{: .left }
Imagem à direita:
1
{: .right }
Nota: Evite usar legendas com imagens flutuantes (.left ou .right) pois pode causar problemas de layout.
Imagens para Modo Escuro/Claro
1
2
{: .light }
{: .dark }
Sombra em Imagens
1
2
{: .shadow }
_Screenshot de aplicação com efeito de sombra_
Matemática com MathJax
Habilite matemática no Front Matter:
1
math: true
Equações Inline
A fórmula da energia é $E = mc^2$.
Blocos de Equação
\[\begin{align} \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &= \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} &= 4 \pi \rho \\ \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} &= \vec{\mathbf{0}} \\ \nabla \cdot \vec{\mathbf{B}} &= 0 \end{align}\]Diagramas com Mermaid
Habilite Mermaid no Front Matter:
1
mermaid: true
Fluxograma
graph TD
A[Início] --> B{Decisão}
B -->|Sim| C[Ação 1]
B -->|Não| D[Ação 2]
C --> E[Fim]
D --> E
Diagrama de Sequência
sequenceDiagram
participant U as Usuário
participant A as Aplicação
participant D as Banco de Dados
U->>A: Fazer login
A->>D: Verificar credenciais
D-->>A: Credenciais válidas
A-->>U: Login realizado
Customização e Extensão do Tema
Personalização de Estilos
Sobrescrevendo Variáveis Sass
Crie o arquivo _sass/custom.scss
:
1
2
3
4
5
6
7
8
9
10
11
// Cores personalizadas
$primary-color: #2196F3;
$link-color: #1976D2;
$text-color: #333333;
// Tipografia
$base-font-size: 16px;
$base-line-height: 1.6;
// Espaçamentos
$spacing-unit: 1rem;
CSS Customizado
Adicione estilos específicos no mesmo arquivo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Componente customizado
.destaque-especial {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: $spacing-unit;
border-radius: 8px;
margin: $spacing-unit 0;
}
// Customização de código
.highlight {
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
Includes e Layouts
Criando Include Customizado
Crie _includes/botao-cta.html
:
1
2
3
4
5
6
7
8
9
<div class="cta-button">
<a href="{{ include.url | default: '#' }}"
class="btn btn-primary btn-lg"
{% if include.target %}target="{{ include.target }}"{% endif %}>
{{ include.texto | default: "Saiba Mais" }}
</a>
</div>
Uso no post:
1
2
3
{% include botao-cta.html url="https://exemplo.com" texto="Acesse Agora" target="_blank" %}
Sobrescrevendo Layout
Para customizar um layout, copie o arquivo original de _layouts
do tema para seu diretório local e modifique conforme necessário.
Plugins Jekyll
Adicionando Plugins
Edite o Gemfile
:
1
2
3
4
5
6
group :jekyll_plugins do
gem "jekyll-feed"
gem "jekyll-seo-tag"
gem "jekyll-sitemap"
gem "jekyll-paginate"
end
Atualize _config.yml
:
1
2
3
4
5
6
7
8
9
plugins:
- jekyll-feed
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-paginate
# Configuração de paginação
paginate: 10
paginate_path: "/page:num/"
Deploy e Publicação
Preparação para Deploy
Build de Produção
1
2
3
4
5
# Usando Docker
docker-compose exec jekyll bundle exec jekyll build --destination _site
# Instalação local
JEKYLL_ENV=production bundle exec jekyll build
Verificação Pré-Deploy
- Teste todos os links internos
- Verifique imagens e assets
- Confirme configurações de SEO
- Teste responsividade
Opções de Hospedagem
GitHub Pages
Configuração automática:
- Crie repositório no GitHub
- Configure GitHub Pages nas configurações
- Use GitHub Actions para build automático
Arquivo .github/workflows/pages.yml
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: Deploy Jekyll to Pages
on:
push:
branches: ["main"]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
- name: Setup Pages
id: pages
uses: actions/configure-pages@v4
- name: Build with Jekyll
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
env:
JEKYLL_ENV: production
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
Netlify
- Conecte seu repositório ao Netlify
- Configure build settings:
- Build command:
bundle exec jekyll build
- Publish directory:
_site
- Build command:
- Configure variáveis de ambiente se necessário
Vercel
- Importe projeto no Vercel
- Configure framework preset para Jekyll
- Deploy automático a cada push
Configuração de Domínio
Domínio Customizado
Para GitHub Pages:
- Adicione arquivo
CNAME
na raiz:1
meudominio.com
- Configure DNS:
1 2 3 4 5
CNAME www meuusuario.github.io A @ 185.199.108.153 A @ 185.199.109.153 A @ 185.199.110.153 A @ 185.199.111.153
Para Netlify/Vercel:
- Configure através do painel administrativo
- Adicione registros DNS conforme instruções da plataforma
Troubleshooting e Resolução de Problemas
Problemas Comuns de Build
Erro de Dependências
Problema: Bundler could not find compatible versions
Solução:
1
2
3
4
5
6
# Limpar cache do bundler
bundle clean --force
# Reinstalar dependências
rm Gemfile.lock
bundle install
Erro de Node.js
Problema: Error: Cannot find module
Solução:
1
2
3
4
5
6
# Limpar cache npm
npm cache clean --force
# Reinstalar dependências
rm -rf node_modules package-lock.json
npm install
Problemas de Renderização
Imagens não Carregam
Verificações:
- Caminho correto do arquivo
- Configuração
baseurl
em_config.yml
- Permissões de arquivo
CSS não Aplica
Verificações:
- Ordem de importação dos arquivos Sass
- Sintaxe correta do CSS/Sass
- Cache do navegador
Problemas de Performance
Site Lento
Otimizações:
- Comprimir imagens
- Minificar CSS/JS
- Usar CDN para assets
- Otimizar plugins
Build Demorado
Soluções:
- Usar
--incremental
em desenvolvimento - Excluir arquivos desnecessários
- Otimizar plugins
Problemas de Deploy
GitHub Pages não Atualiza
Verificações:
- Status do GitHub Actions
- Configuração de branch
- Arquivo
_config.yml
válido
Netlify Build Falha
Soluções:
- Verificar logs de build
- Configurar variáveis de ambiente
- Ajustar configurações de Ruby/Node
Problemas de Interpretação Liquid
Jekyll Interpreta Código Jinja2/Ansible como Liquid
Problema: Jekyll pode interpretar blocos {% ... %}
e {{ ... }}
de outras linguagens (Jinja2, Ansible, etc.) como lógica Liquid, causando erros de build ou renderização incorreta.
Sintomas:
- Erros de build com mensagens sobre tags Liquid desconhecidas
- Conteúdo de código desaparece ou é renderizado incorretamente
- Falhas ao processar documentação de outras ferramentas
Exemplo Problemático:
1
2
3
4
5
6
7
8
# Arquivo Ansible que causa problemas
- name: Deploy application
template:
src: app.conf.j2
dest: /etc/app.conf
vars:
app_name: "{{ application_name }}"
app_port: "{% if environment == 'prod' %}80{% else %}8080{% endif %}"
Solução 1: Escape Manual com Raw
Use {% raw %}
e {% endraw %}
para escapar blocos específicos:
Exemplo de template Jinja2:
1
2
3
4
5
6
7
8
9
- name: Configure service
template:
src: service.j2
dest: /etc/service.conf
vars:
service_port: "{{ port | default(8080) }}"
debug_mode: "{% if env == 'dev' %}true{% else %}false{% endif %}"
Solução 2: Alteração em Massa com Vim
Para arquivos com muitos blocos Jinja2/Ansible, use comandos vim para escape automático:
Escapar blocos {% ... %}
:
1
:%s/{%\(\_.\{-}\)%}/{{ "{% raw " }}%}{%\1%}{{ "{% endraw " }}%}/g
Escapar blocos {{ ... }}
:
1
:%s/{{\(\_.\{-}\)}}/{{ "{% raw " }}%}{{\1}}{{ "{% endraw " }}%}/g
Solução 3: Configuração Global
Para projetos com muito código Jinja2/Ansible, considere configurar exclusões no _config.yml
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# _config.yml
markdown: kramdown
kramdown:
input: GFM
syntax_highlighter: rouge
syntax_highlighter_opts:
block:
line_numbers: false
# Excluir arquivos específicos do processamento
exclude:
- ansible/
- templates/
- "*.j2"
Solução 4: Uso de Includes para Código Complexo
Para documentação extensa de outras ferramentas, considere usar includes:
1
2
3
4
5
6
7
8
9
<!-- _includes/ansible-example.html -->
<pre><code class="language-yaml">
- name: Example task
template:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
loop:
- { src: "app.j2", dest: "/etc/app.conf" }
</code></pre>
Uso no post:
1
2
Exemplo de playbook Ansible:
{% include ansible-example.html %}
Dicas Importantes:
Atenção: Sempre teste o build após adicionar código de outras linguagens de template.
Dica: Use syntax highlighting específico (
yaml
,jinja2
) para melhor apresentação visual.
Importante: O escape com
raw
afeta apenas a interpretação Liquid, não o syntax highlighting.
Recursos Adicionais
Documentação Oficial
Ferramentas Úteis
- Editores: VS Code com extensões Jekyll
- Imagens: TinyPNG para compressão
- Ícones: Font Awesome, Feather Icons
- Analytics: Google Analytics, Plausible
Comunidade e Suporte
Próximos Passos
- Explore temas relacionados: Outros temas Jekyll
- Aprenda sobre JAMstack: Conceitos modernos de desenvolvimento web
- Automatize workflows: CI/CD avançado
- Otimize para SEO: Técnicas avançadas de otimização
Conclusão: Este tutorial fornece uma base sólida para criar e manter um blog profissional com Jekyll e Chirpy. Continue experimentando e personalizando conforme suas necessidades específicas.