一键导入
building-blog
How to preview blog posts locally: one-command container-based Jekyll serve with auto-detection of changed posts and deep-linking.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
How to preview blog posts locally: one-command container-based Jekyll serve with auto-detection of changed posts and deep-linking.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | building-blog |
| description | How to preview blog posts locally: one-command container-based Jekyll serve with auto-detection of changed posts and deep-linking. |
This workflow is supported on Linux, macOS, and Windows through WSL2. Native Windows shells (PowerShell, CMD, Git Bash) are not supported.
Run the full preview pipeline in one command:
just blog-preview
Or directly:
bash blog-preview.sh
The script uses marker files to track state across runs:
.blog-preview-last-run — timestamp of the last preview run.
Used to detect recently changed posts and open the right URL..blog-preview.lock — directory-based lock to prevent concurrent runs.Both files are gitignored. Delete .blog-preview-last-run to reset
change detection.
Detects the container runtime (podman or docker), SELinux state
(sets :z volume flag if needed), and browser command (xdg-open,
open, or wslview).
Builds a Jekyll image from jekyll-container/Dockerfile in this repo
and starts a preview container. If a healthy container is already
running from a previous invocation, it is reused without restart.
The container runs with:
--future — always included so posts with future dates are visible--livereload — browser auto-refreshes on file changes (port 35729)--incremental — only rebuilds changed pages_noguides_config.yml — excludes guides for fast builds (~10s)quarkus-blog-jekyll-bundles — persists gems across restartsThe script auto-detects what you were working on and opens the right page:
| Changed posts | Preview URLs |
|---|---|
| 1 post | /blog/ (listing) + /blog/<slug>/ (deep-link) |
| 2–4 posts | /blog/ (listing) + a tab for each post |
| 5+ posts | /blog/ (listing only), unless git narrows it (see below) |
| No changes | /blog/ (listing only) |
When the timestamp marker is stale and detects 5+ changed posts, the script cross-references with git to find posts you actually added or modified. If the intersection is smaller (1–4 posts), those are used instead and deep links open as in the 1-post or 2–4-post cases above.
The slug is derived from the filename: strip the YYYY-MM-DD- prefix
and the file extension (.adoc, .asciidoc, or .md).
Edit .adoc → save → Jekyll auto-rebuilds → browser auto-refreshes
The container stays running. LiveReload on port 35729 triggers the browser refresh automatically — no manual reload needed.
--future FlagThe --future flag is always included because blog contributors
typically work on posts with today's or a future publication date.
Without this flag, Jekyll silently excludes future-dated posts from
the generated site.
Port 4000 or 35729 already in use — Another process is using the
preview ports. Stop the existing container:
podman rm -f quarkus-blog-preview (or docker).
Failed to delete .cache/ or permission errors — Rootless Podman
UID mapping. Fix: podman unshare rm -rf .cache/. With Docker:
rm -rf .cache/.
Volume mount errors on macOS/Ubuntu — SELinux :z flag applied
on a system without SELinux. The script detects this automatically;
if it persists, check getenforce output.
Preview shows stale content — Jekyll's --incremental mode can
sometimes miss dependency changes. Restart the container and re-run:
podman rm -f quarkus-blog-preview
just blog-preview
Container image build fails — Check the build log printed by the
script. To force a rebuild of the local image:
podman rmi quarkus-blog-jekyll:local (or docker).
Post not appearing — Check that the file is in _posts/ with the
correct YYYY-MM-DD-slug.adoc naming and that the front matter date
matches the filename date.