当前位置: 首页 > article >正文

基于Jekyll与GitHub Actions构建个人静态网站:从环境配置到自动化部署

1. 项目概述一个由Jekyll与AI驱动的个人网站最近在整理自己的数字资产发现一个干净、高效、完全由自己掌控的个人网站依然是展示技术思考与项目沉淀的最佳载体。于是我花了一些时间基于Jekyll静态站点生成器并融合了一些现代化的开发工具与工作流重新搭建了我的个人网站。这个项目的核心仓库是dennisXZX/dennisxzx.github.io它不仅仅是一个托管在GitHub Pages上的静态页面集合更是一套完整的、可复现的本地开发与自动化部署方案。这个网站本质上是一个静态站点所有内容文章、页面、样式最终都会被Jekyll编译成纯粹的HTML、CSS和JavaScript文件。选择Jekyll一方面是因为它与GitHub Pages原生集成部署简单到只需推送代码另一方面其基于Markdown写作、模板继承的特性让我能专注于内容创作而非复杂的框架配置。项目描述中提到的“Powered by Jekyll and (mostly) AI, with a cup of ☕”非常贴切——Jekyll提供了骨架和自动化而内容构思与部分代码辅助则借助了AI工具如Cursor来提升效率整个过程就像调配一杯Flat White需要技术基底也讲究一点风味和效率。无论你是想为自己建立一个技术博客、作品集还是仅仅想找一个地方系统性地记录想法这个项目栈都值得参考。它避免了前端框架的臃肿绕开了数据库和维护服务器的麻烦同时通过Git和CI/CD实现了版本管理和自动化非常适合开发者、写作者以及任何希望拥有一个轻量级、高性能个人主页的朋友。接下来我将从环境搭建、主题定制、内容管理到自动化部署完整拆解这个项目的每一个环节并分享我在实践中踩过的坑和总结的技巧。2. 技术栈选型与核心思路解析2.1 为什么是Jekyll而非其他静态生成器静态站点生成器SSG的选择很多比如Hugo、Hexo、Gatsby、Next.js等。我最终锁定Jekyll是基于以下几个核心考量第一与GitHub Pages的无缝集成。GitHub Pages官方支持Jekyll这意味着你几乎不需要任何额外的部署配置。只需将符合Jekyll结构的代码推送到指定分支通常是master或mainGitHub会自动识别并执行jekyll build将生成的站点发布到username.github.io域名下。这种“推送即发布”的体验极大地简化了运维流程。相比之下使用Hugo或Hexo你通常需要配置一个单独的GitHub Action来执行构建命令再将构建产物推送到另一个分支如gh-pages步骤上多了一层。第二极低的学习与定制成本。Jekyll使用Liquid模板语言其语法直观易懂类似于在HTML中插入简单的逻辑标签如{% if %}、{% for %}。对于已经熟悉HTML/CSS的开发者可以非常快速地基于一个现有主题进行修改。我的项目没有使用复杂的github-pagesgem而是直接使用较新版本的Jekyll 4这让我能自由地使用更新的Ruby特性并避免了一些因版本锁定导致的依赖冲突问题。第三内容管理的纯粹性。所有文章都以Markdown文件形式存放在_posts目录中所有页面是普通的Markdown或HTML文件。这种基于文件系统的内容管理使得版本控制Git变得极其自然。每篇文章的每一次修改都有清晰的历史记录迁移和备份也只需复制文件夹。对于崇尚“内容即数据”的我来说这比依赖数据库或在线编辑器要可靠得多。第四生态与社区成熟。虽然Jekyll不像一些基于Node.js的生成器那样“新潮”但其生态非常稳定。有大量高质量的主题可供选择从极简的技术博客到丰富的作品集模板应有尽有。遇到问题时通常都能在Stack Overflow或官方文档中找到经过时间检验的解决方案。2.2 “Powered by AI”在项目中的实际体现项目描述中提到“(mostly) AI”这并非噱头而是在具体开发环节中切实提升了效率。这里主要指的是利用像Cursor这类AI编程助手。在内容创作方面AI可以辅助进行大纲构思、初稿撰写、语法润色和技术术语核对。例如在写一篇关于某个算法原理的文章时我可以让AI先帮我梳理核心步骤的叙述逻辑然后我再填充具体的代码示例和个人理解。这大大降低了从零开始组织长篇技术内容的心理门槛。在代码开发方面AI的作用更为直接。例如快速生成样板代码当需要为网站添加一个新的布局Layout时我可以描述需求“创建一个用于项目展示的布局包含项目标题、描述、技术栈标签和链接按钮”AI能快速生成一个包含基本Liquid标签和HTML结构的文件我只需在此基础上调整样式。调试与问题排查在配置Jekyll插件或处理Ruby gem依赖冲突时将错误信息抛给AI它往往能提供可能的解决方向或直接给出需要尝试的命令比如建议升级某个gem版本或修改Gemfile中的约束条件。编写自动化脚本为了优化图片资源我写了一个简单的脚本利用AI生成了使用ImageMagick进行批量压缩和转换的命令行操作流程。注意AI是强大的辅助但绝非主体。所有AI生成的内容尤其是代码和关键的技术论述都必须经过严格的审查和测试。我的原则是让AI负责“草稿”和“建议”由我来做最终的“决策”和“验收”。网站的核心逻辑、设计风格和个人观点必须牢牢掌握在自己手中。2.3 项目结构设计哲学一个清晰的项目结构是长期维护的基石。我的仓库结构遵循Jekyll惯例并做了一些个性化调整dennisxzx.github.io/ ├── _config.yml # 站点核心配置文件 ├── _data/ # 自定义数据文件如导航菜单 ├── _drafts/ # 未发布的草稿 ├── _includes/ # 可复用的组件如页头、页脚 ├── _layouts/ # 页面布局模板default, post, page ├── _posts/ # 所有的博客文章按日期命名 ├── _sass/ # SCSS样式部分文件 ├── _site/ # Jekyll构建生成的站点通常被.gitignore忽略 ├── assets/ # 静态资源css, js, images │ ├── css/ │ ├── js/ │ └── images/ ├── pages/ # 独立的页面如about.md, projects.md ├── index.md # 首页 ├── Gemfile # Ruby依赖定义 ├── Gemfile.lock # 依赖锁文件 └── .github/workflows/ # GitHub Actions自动化部署工作流设计要点解析分离内容与样式_posts和pages只关心Markdown内容。所有样式逻辑集中在_sass和assets/css中通过_includes引入的组件保持结构清爽。利用_data管理配置将导航栏链接、社交资料等信息放入_data/navigation.yml中。这样当需要增删链接时只需修改YAML文件无需翻找多个HTML模板。忽略构建产物_site目录和vendor/bundle本地gem安装目录都被加入.gitignore。源代码仓库应保持纯净构建过程应在CI/CD环境中完成。3. 本地开发环境搭建详解本地开发环境是写作和调试的基石。一个稳定、隔离的环境能避免“在我机器上好好的”这类问题。以下步骤基于macOS但原理同样适用于LinuxWindows用户建议使用WSL2以获得最佳体验。3.1 Ruby版本管理避开系统Ruby的坑项目明确要求使用Ruby 3.x或4.x并警告了macOS系统自带的Ruby 2.6可能带来的权限和原生gem编译问题。这几乎是所有Jekyll新手的第一个坑。为什么不直接用系统RubymacOS系统自带的Ruby位于/System/Library/Frameworks/Ruby.framework/其版本较旧如2.6且系统目录受到SIP系统完整性保护的限制。当你尝试用sudo gem install安装某些需要编译原生扩展的gem如ffi,http_parser.rb时极有可能因权限不足而失败。更糟糕的是强行修改系统Ruby可能影响其他依赖它的系统工具。解决方案使用Homebrew安装独立版本的Ruby。Homebrew是macOS的包管理器它可以让你在用户目录下安装和管理多个Ruby版本与系统环境完全隔离。安装Homebrew如果尚未安装/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)通过Homebrew安装Rubybrew install ruby安装完成后Homebrew会提示你将Ruby路径加入环境变量。通常新版本Ruby会安装在/opt/homebrew/opt/ruby/bin/Apple Silicon芯片或/usr/local/opt/ruby/bin/Intel芯片。配置Shell环境变量 你需要将Homebrew的Ruby路径添加到PATH环境变量的最前面确保Shell优先使用它。根据你使用的Shellzsh或bash修改对应的配置文件~/.zshrc或~/.bash_profile。# 对于 Apple Silicon Mac (使用 zsh) echo export PATH/opt/homebrew/opt/ruby/bin:$PATH ~/.zshrc source ~/.zshrc # 对于 Intel Mac (使用 bash) echo export PATH/usr/local/opt/ruby/bin:$PATH ~/.bash_profile source ~/.bash_profile验证安装运行ruby -v你应该能看到类似ruby 3.3.0...的版本号而不是2.6.x。实操心得我强烈建议使用rbenv或rvm这类Ruby版本管理工具它们可以更灵活地切换不同项目所需的Ruby版本。但对于一个专注于Jekyll的个人网站项目直接使用Homebrew安装一个稳定的新版本Ruby是最简单直接的选择避免了多版本管理的复杂度。3.2 依赖安装与项目初始化确保Ruby环境正确后就可以进入项目目录进行依赖安装了。安装BundlerBundler是Ruby的依赖管理工具它通过Gemfile来管理项目所需的所有gemRuby包。通常新安装的Ruby会自带Bundler如果没有执行gem install bundler安装项目依赖进入你的项目根目录即包含Gemfile的目录运行bundle install关键参数解析bundle install命令会读取Gemfile下载并安装所有列出的gem及其依赖。--path vendor/bundle参数或在Gemfile中配置会将gem安装到项目本地的vendor/bundle目录下而不是全局。这样做的好处是项目依赖完全独立不会污染系统环境也方便团队协作和CI/CD环境重建。从项目描述看它正是采用了这种方式“gems go intovendor/bundle”。启动本地开发服务器依赖安装成功后运行bundle exec jekyll serve --livereloadbundle exec确保命令在当前项目的gem环境下运行避免使用全局可能不兼容的jekyll版本。jekyll serve启动Jekyll内置的开发服务器。--livereload一个极其好用的功能。当你修改了任何源文件Markdown、HTML、CSS、配置文件等并保存后浏览器页面会自动刷新无需手动按F5。这大大提升了开发效率。访问网站在终端看到Server address: http://127.0.0.1:4000或http://localhost:4000的输出后用浏览器打开该地址你就能看到本地运行的网站了。3.3 常见环境问题与排查即使按照步骤操作你也可能会遇到一些问题。这里记录几个我踩过的坑问题一执行bundle install时报错提示找不到ruby.h或编译失败。原因缺少Ruby的开发头文件或编译工具链。解决对于macOS需要安装Xcode Command Line Tools。xcode-select --install对于Ubuntu/Debian需要安装ruby-dev和build-essential。sudo apt-get install ruby-dev build-essential问题二bundle exec jekyll serve启动后访问页面显示空白或错误。排查步骤检查终端日志Jekyll服务器会在终端输出详细的构建日志和错误信息。通常错误原因会直接显示比如某个Liquid标签语法错误或者某个YAML文件格式不对。检查_config.ymlYAML对缩进极其敏感确保没有使用Tab键全部使用空格。一个常见的错误是冒号后面没加空格。检查文件命名_posts下的文章文件名必须遵循YYYY-MM-DD-title.md的格式否则不会被识别。问题三修改了_config.yml后刷新页面看不到变化。原因Jekyll默认情况下为了性能不会在每次请求时都重新读取_config.yml。解决停止服务器在终端按CtrlC然后重新运行bundle exec jekyll serve。或者使用--config _config.yml参数强制重新读取但重启服务器是最稳妥的方式。4. 主题定制与核心功能实现使用Jekyll的一大乐趣在于你可以从一个极简的主题开始逐步打磨成完全符合自己审美的样子。我最初选择了一个开源的最小化主题然后在此基础上进行深度定制。4.1 布局Layouts与包含Includes机制Jekyll的模板系统核心是“布局”和“包含”。布局Layouts位于_layouts目录下定义了页面的整体骨架。例如一个default.html布局可能包含html、head、body的基本结构以及页头和页脚的占位。!-- _layouts/default.html -- !DOCTYPE html html langen head meta charsetUTF-8 title{{ site.title }} | {{ page.title }}/title link relstylesheet href/assets/css/main.css /head body {% include header.html %} main classcontent {{ content }} !-- 这是页面具体内容注入的地方 -- /main {% include footer.html %} /body /html包含Includes位于_includes目录下是可重用的代码片段。比如header.html和footer.html。这样当需要修改导航栏时只需改动_includes/header.html一处所有使用该包含的布局都会更新。内容注入在文章或页面Markdown文件的YAML头信息Front Matter中通过layout: default指定使用哪个布局。该文件Markdown部分的内容在构建时就会被填充到布局的{{ content }}变量位置。4.2 样式SASS/SCSS的组织与编写我使用SCSS来编写样式因为它支持变量、嵌套、混合等特性能让CSS更易维护。文件组织在_sass目录下我按功能模块拆分文件_variables.scss定义颜色、字体、间距等设计令牌。_mixins.scss定义可复用的混合宏如清除浮动、媒体查询。_base.scss重置样式和基础元素样式body, h1-h6, p, a等。_layout.scss主要布局结构网格、容器。_components.scss按钮、卡片、导航栏等组件样式。_syntax-highlighting.scss代码高亮主题。主样式文件在assets/css目录下创建一个main.scss文件。这个文件的顶部需要两行破折号以让Jekyll处理它。然后它通过import引入所有部分文件。// assets/css/main.scss --- --- // 首先导入变量和混合宏 import variables; import mixins; // 然后导入基础样式和布局 import base; import layout; // 最后导入组件 import components; // 代码高亮 import syntax-highlighting;Jekyll会处理这个SCSS文件将其编译为最终的main.css。注意事项SCSS的导入顺序很重要。被依赖的文件如变量、混合宏必须先导入否则后面使用这些变量或混合宏的文件会报错。4.3 博客文章系统与Front Matter博客是个人网站的灵魂。Jekyll的博客系统非常简单高效。创建文章在_posts目录下新建一个文件文件名格式必须为YYYY-MM-DD-your-title.md。日期部分决定了文章的URL和排序。Front Matter头信息每个文章文件的开头需要用三条短横线包裹一段YAML格式的数据这就是Front Matter。它定义了文章的元数据。--- layout: post title: 深入理解Jekyll静态站点生成 date: 2023-10-27 15:30:00 0800 categories: [技术, 工具] tags: [jekyll, github-pages, 博客] excerpt: 本文详细介绍了如何使用Jekyll搭建个人博客并分享了自动化部署的技巧。 cover: /assets/images/2023/jekyll-cover.jpg ---layout指定使用的布局模板如post。title,date文章标题和发布时间。categories,tags分类和标签用于组织内容。excerpt文章摘要用于在首页列表显示。cover文章封面图路径。在首页列出文章在index.md或任何页面中你可以通过Liquid模板遍历site.posts来显示文章列表。{% for post in site.posts limit:5 %} article h2a href{{ post.url }}{{ post.title }}/a/h2 time datetime{{ post.date | date_to_xmlschema }}{{ post.date | date: %Y-%m-%d }}/time p{{ post.excerpt | default: post.content | strip_html | truncatewords: 50 }}/p /article {% endfor %}4.4 自定义数据文件Data Files对于需要在全站多处使用、且可能频繁修改的数据Jekyll的_data目录是绝佳选择。我在这里存放了导航菜单和社交链接。创建数据文件新建_data/navigation.yml# _data/navigation.yml - name: 首页 link: / - name: 博客 link: /blog/ - name: 项目 link: /projects/ - name: 关于 link: /about/在模板中使用在_includes/header.html中可以这样生成导航菜单nav ul {% for item in site.data.navigation %} lia href{{ item.link }} {% if page.url item.link %}classactive{% endif %}{{ item.name }}/a/li {% endfor %} /ul /nav这样当需要增减菜单项时只需修改YAML文件无需触碰HTML模板实现了内容与表现的分离。5. 自动化部署与GitHub Actions工作流将代码推送到GitHub仓库后自动构建并发布到GitHub Pages是这个项目工作流的精华所在。它实现了真正的CI/CD持续集成/持续部署。5.1 理解GitHub Pages的构建机制默认情况下如果你创建一个名为username.github.io的仓库并将静态HTML文件推送到master或main分支GitHub会自动将其托管。但对于Jekyll项目我们推送的是源代码Markdown、Layouts、SCSS等需要GitHub帮我们执行构建。传统方式使用github-pagesgem。在Gemfile中添加gem github-pages, group: :jekyll_plugins并依赖GitHub提供的构建环境。这种方式简单但构建环境中的Jekyll和插件版本可能更新不及时且定制性较弱。本项目采用的方式使用自定义的GitHub Actions工作流。这种方式更灵活、更透明也更容易调试。项目中的.github/workflows/jekyll.yml文件就定义了这个工作流。5.2 剖析Jekyll部署工作流让我们详细解读项目中的这个工作流文件假设内容如下# .github/workflows/jekyll.yml name: Deploy Jekyll site to Pages on: # 自动触发推送到master分支时 push: branches: [master] # 手动触发在GitHub仓库的Actions标签页可以手动运行 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/checkoutv4 - name: Setup Ruby uses: ruby/setup-rubyv1 with: ruby-version: 3.3 # 指定Ruby版本与本地开发环境一致 bundler-cache: true # 缓存gem依赖加速后续构建 - name: Setup Pages id: pages uses: actions/configure-pagesv4 - name: Build with Jekyll run: | bundle install bundle exec jekyll build --baseurl ${{ steps.pages.outputs.base_path }} env: JEKYLL_ENV: production - name: Upload artifact uses: actions/upload-pages-artifactv3 with: path: ./_site # 上传构建产物_site目录 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-pagesv4关键步骤解析触发条件onpush: branches: [master]代码推送到master分支时自动触发构建。workflow_dispatch允许在GitHub网页界面的Actions选项卡中手动触发工作流方便测试。构建任务buildjobactions/checkoutv4检出仓库代码。ruby/setup-rubyv1设置指定版本3.3的Ruby环境并启用Bundler缓存。缓存是提升CI速度的关键它避免了每次构建都重新下载所有gem。bundle install安装项目依赖。bundle exec jekyll build执行构建命令。--baseurl参数用于适配GitHub Pages的站点路径。actions/upload-pages-artifactv3将构建好的_site目录打包成一个“制品”供后续部署任务使用。部署任务deployjobneeds: build表示此任务依赖于build任务只有构建成功才会运行。actions/deploy-pagesv4这是GitHub官方的部署Action它会将上传的制品即_site内容部署到GitHub Pages服务。5.3 自定义域名与HTTPSGitHub Pages默认提供username.github.io的域名并自动配置HTTPS。如果你拥有自己的域名如example.com可以轻松绑定在仓库的Settings Pages页面找到Custom domain栏输入你的域名如blog.example.com并保存。这会在你仓库的根目录自动创建一个CNAME文件内容就是你的域名。前往你的域名注册商如Cloudflare, Namecheap等的管理后台为你的域名添加一条CNAME记录类型CNAME主机/名称blog(如果你要用子域名) 或(如果你要用根域名)目标/值yourusername.github.ioTTL自动或300秒等待DNS生效可能需要几分钟到几小时。GitHub会自动为你申请并配置Let‘s Encrypt的SSL证书启用HTTPS。重要提示如果你使用根域名example.com除了CNAME记录通常还需要配置A记录指向GitHub Pages的IP地址如185.199.108.153因为根域名不能直接做CNAME。具体IP地址请查阅GitPages官方文档因为它们可能会有变动。5.4 部署过程中的常见问题排查问题一GitHub Actions构建失败报错“Could not find gem ‘xxx’”。原因Gemfile.lock文件没有提交到仓库或者本地与CI环境的Ruby版本差异导致依赖解析不同。解决确保将Gemfile和Gemfile.lock都提交到Git。Gemfile.lock锁定了所有gem的确切版本保证了环境一致性。如果本地Ruby版本与CI中ruby-version: 3.3不一致建议在本地使用相同版本并重新运行bundle install生成新的Gemfile.lock。问题二构建成功但网站显示404或样式丢失。排查访问https://username.github.io/repo-name/如果仓库名不是username.github.io。有时站点被部署在子路径下。在_config.yml中检查baseurl和url设置。对于用户或组织页面username.github.iobaseurl通常应为空字符串url设为https://username.github.io。检查CSS/JS等资源的引用路径。在模板中建议使用{{ site.baseurl }}/assets/css/style.css这样的绝对路径引用方式。问题三手动触发工作流workflow_dispatch的按钮是灰色的。原因工作流文件可能不在默认分支上或者文件路径/语法有误。解决确保.github/workflows/jekyll.yml文件存在于你的默认分支通常是master或main中并且YAML语法正确。6. 高级技巧与性能优化当网站基本功能完善后可以从细节处着手提升用户体验和网站性能。6.1 图片优化与懒加载图片通常是网站最大的资源。未经优化的图片会严重拖慢加载速度。压缩图片在将图片放入assets/images前使用工具进行压缩。我常用的工具有命令行工具ImageMagick可以写脚本批量处理。# 将目录下所有jpg图片质量压缩到85%并调整最大宽度为1200px mogrify -path ./optimized -resize 1200x -quality 85% *.jpg图形界面工具Squoosh在线、TinyPNG在线、ImageOptimMac。使用响应式图片在HTML中使用srcset属性为不同屏幕尺寸提供不同分辨率的图片。img src/assets/images/photo-800w.jpg srcset/assets/images/photo-400w.jpg 400w, /assets/images/photo-800w.jpg 800w, /assets/images/photo-1200w.jpg 1200w sizes(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px alt描述文字这需要预先生成多个尺寸的图片可以通过构建脚本自动化。实现懒加载对于首屏之外的图片使用loadinglazy属性。这是现代浏览器的原生支持无需JavaScript。img srcthumbnail.jpg>group :jekyll_plugins do gem jekyll-sitemap gem jekyll-feed gem jekyll-seo-tag end然后运行bundle install。接着在_config.yml中启用它们plugins: - jekyll-sitemap - jekyll-feed - jekyll-seo-tag最后在布局文件如_layouts/default.html的head部分添加{% seo %}标签。6.3 搜索功能的实现静态网站实现搜索是个小挑战。我采用了一种简单有效的方法生成一个包含所有文章数据的JSON文件然后在前端用JavaScript进行检索。生成搜索索引创建一个search.json文件或利用Jekyll的Liquid模板生成。!-- search.json -- --- layout: null --- [ {% for post in site.posts %} { title: {{ post.title | jsonify }}, url: {{ post.url | jsonify }}, date: {{ post.date | date: %Y-%m-%d }}, content: {{ post.content | strip_html | truncatewords: 50 | jsonify }}, tags: {{ post.tags | jsonify }} }{% unless forloop.last %},{% endunless %} {% endfor %} ]构建后这个文件会包含所有文章的标题、链接、日期和部分内容。前端JavaScript搜索在页面中添加一个搜索输入框然后编写JavaScript来获取search.json并过滤结果。可以使用简单的字符串匹配或者集成轻量级库如lunr.js提供更强大的全文搜索能力。优化体验对搜索结果进行高亮显示并添加防抖debounce功能避免在用户快速输入时频繁触发搜索请求。6.4 分析与评论系统静态网站无法运行后端代码但可以通过第三方服务集成分析和评论。网站分析使用Google Analytics 4 (GA4) 或 Umami一个开源的、注重隐私的替代品。只需在_includes/head.html或布局的head部分插入它们提供的JavaScript跟踪代码片段即可。评论系统传统的Disqus较为臃肿。我推荐更轻量、隐私友好的方案Giscus利用GitHub Discussions作为评论存储后端。访客通过GitHub账号登录评论非常适合技术博客。Utterances原理与Giscus类似使用GitHub Issues。Telegram Comments将评论转发到Telegram群组适合社区互动。集成这些系统通常只需要在文章布局_layouts/post.html的底部添加一段它们提供的HTML/JavaScript代码块。7. 内容创作与维护工作流技术栈搭建好了最终还是要回归到内容本身。一个高效可持续的内容创作流程至关重要。7.1 基于分支的写作与预览我推荐使用Git分支来管理写作过程特别是与GitHub Pages的预览功能结合。为每篇新文章创建特性分支git checkout -b post/about-jekyll-workflow在分支上进行写作和修改。你可以随时在本地运行bundle exec jekyll serve预览效果。利用GitHub Pages的预览功能将分支推送到GitHub后GitHub Actions会为这个分支的每次提交生成一个预览站点。你可以在Pull Request的检查状态中找到类似 “deployments/your-branch-name” 的链接点开即可在线预览整个站点的效果。这比本地预览更能模拟真实环境。完成写作后合并到主分支创建Pull Request在PR中完成最后的校对和预览确认无误后合并。合并到master分支会触发自动部署更新线上网站。7.2 写作工具与效率提升编辑器我主要使用VS Code或Cursor。它们对Markdown有很好的原生支持预览、语法高亮并且通过插件可以增强体验比如拼写检查、表格格式化等。Cursor的AI辅助功能在构思和润色段落时尤其有用。图床管理文章中的图片我建议使用相对路径存放在项目本身的assets/images目录下并按照年份或分类组织子文件夹如/assets/images/2023/10/。这样图片和文章一起被版本控制永远不会失效。虽然这会让仓库变大但对于个人博客的图片量来说是可以接受的。如果图片非常多可以考虑使用Git LFS大文件存储或专门的图床服务如Cloudinary Imgur但会引入外部依赖。草稿与未来发布Jekyll有_drafts文件夹用于存放草稿草稿文章没有日期前缀。运行本地服务器时加上--drafts参数可以预览它们。对于计划在未来发布的文章只需将文章日期设置为未来的某一天Jekyll在构建时默认会跳过它直到日期到达。7.3 定期维护与更新静态网站并非一劳永逸也需要定期维护。更新依赖定期运行bundle update更新gem依赖并测试网站是否正常工作。更新后务必提交新的Gemfile.lock。检查链接使用工具如jekyll doctor或在线死链检查工具定期扫描网站修复失效的链接。内容审计每隔一段时间回顾旧文章更新过时的信息、修复笔误甚至重写一些早期不成熟的内容。这能让你的网站始终保持活力与价值。备份虽然代码托管在GitHub本身就是一种备份但建议定期将整个仓库克隆到本地其他硬盘或另一个云存储服务作为额外保障。搭建和维护这样一个个人网站的过程就像打理一个数字花园。从选择工具Jekyll到平整土地环境配置从设计布局主题定制到播种灌溉内容创作再到安装自动灌溉系统CI/CD每一步都充满动手的乐趣和学习的收获。这个项目栈的优势在于它的简洁、稳定和完全可控。你拥有从内容到样式的全部所有权深度绑定的是你的GitHub账号和你的域名而不是任何一个可能关闭的第三方博客平台。当你在深夜完成一篇长文的推送看着GitHub Actions的绿色对勾亮起几分钟后刷新浏览器看到更新无误的网站时那种满足感是托管服务无法给予的。希望这份详细的拆解能帮助你顺利启动并长期运营好自己的那片数字自留地。

相关文章:

基于Jekyll与GitHub Actions构建个人静态网站:从环境配置到自动化部署

1. 项目概述:一个由Jekyll与AI驱动的个人网站最近在整理自己的数字资产,发现一个干净、高效、完全由自己掌控的个人网站依然是展示技术思考与项目沉淀的最佳载体。于是,我花了一些时间,基于Jekyll静态站点生成器,并融合…...

3种方式彻底解决音乐文件加密问题:Unlock-Music完整实践指南

3种方式彻底解决音乐文件加密问题:Unlock-Music完整实践指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址:…...

为Claude Code编程助手配置Taotoken作为自定义模型提供商

为Claude Code编程助手配置Taotoken作为自定义模型提供商 1. 准备工作 在开始配置前,请确保已具备以下条件:一个有效的Taotoken账户,并在控制台中创建了API Key。同时确认本地已安装Claude Code编程助手,版本需支持自定义Anthro…...

专题--Redis

Redis| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台,为用户提供强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时依托于互联网…...

基于Docker沙盒构建安全隔离的AI模型运行环境

1. 项目概述:构建一个专为AI模型运行而生的Docker沙盒最近在折腾本地AI应用部署时,遇到了一个挺典型的问题:我想用Ollama跑一个叫OpenClaw的模型,但直接装在宿主机上,总担心它和系统里其他服务(比如我的开发…...

使用OpenClaw连接Taotoken快速搭建自动化AI工作流与智能体

使用OpenClaw连接Taotoken快速搭建自动化AI工作流与智能体 1. 准备工作 在开始配置之前,请确保您已经完成以下准备工作。首先,您需要在Taotoken平台注册账号并获取API Key。登录控制台后,可以在"API密钥管理"页面创建新的密钥。其…...

3步搭建免费开源翻译API:LibreTranslate私有化部署完整指南

3步搭建免费开源翻译API:LibreTranslate私有化部署完整指南 【免费下载链接】LibreTranslate Free and Open Source Machine Translation API. Self-hosted, offline capable and easy to setup. 项目地址: https://gitcode.com/GitHub_Trending/li/LibreTranslat…...

告别BurpSuite!用Yakit的MITM插件做渗透测试,这5个实战技巧真香

告别BurpSuite!用Yakit的MITM插件做渗透测试,这5个实战技巧真香 在渗透测试领域,BurpSuite长期占据着中间人攻击工具的首选地位。但近年来,一款名为Yakit的国产工具正在悄然改变这一格局。作为一名长期使用BurpSuite的安全工程师&…...

智能家居健康监测系统:振动传感与边缘计算的应用

1. 智能家居健康监测系统的核心价值与挑战在老龄化社会加速到来的今天,如何让老年人安全、舒适地实现"在地养老"(Aging in Place)已成为全球性课题。根据美国人口普查局数据,65岁以上人口占比将从2020年的17%增长到2050年的23%。传统护理模式面…...

超越看波形:用Verdi的nTrace/nSchema/nState进行深度代码与逻辑追踪

超越波形调试:Verdi高阶追踪技术实战指南 在数字芯片验证的深水区,工程师们常常面临这样的困境:波形窗口里跳动的信号明明符合预期,但系统行为却出现异常;状态机看似按设计流转,实际却卡在某个非预期状态。…...

免费AMD Ryzen深度调试工具:SMUDebugTool完全使用指南

免费AMD Ryzen深度调试工具:SMUDebugTool完全使用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...

终极指南:witr项目安全实践与生产环境诊断工具安全使用方法

终极指南:witr项目安全实践与生产环境诊断工具安全使用方法 【免费下载链接】witr Why is this running? 项目地址: https://gitcode.com/gh_mirrors/wi/witr witr作为一款强大的系统诊断工具,能够帮助用户深入了解系统运行状态,但在…...

如何用Blender 3MF插件实现专业3D打印工作流:完整指南

如何用Blender 3MF插件实现专业3D打印工作流:完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 想在Blender中无缝处理3D打印文件吗?Blende…...

SOCD Cleaner终极指南:免费解决游戏按键冲突的完整方案

SOCD Cleaner终极指南:免费解决游戏按键冲突的完整方案 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏的世界里,每一次按键都决定胜负,但你是否曾因同时按下左右方…...

快速部署MRPT:Ubuntu/Debian安装与配置完整指南

快速部署MRPT:Ubuntu/Debian安装与配置完整指南 【免费下载链接】mrpt :zap: The Mobile Robot Programming Toolkit (MRPT) 项目地址: https://gitcode.com/gh_mirrors/mr/mrpt Mobile Robot Programming Toolkit (MRPT) 是一款强大的移动机器人开发工具包&…...

KUKA C4/C2软限位修改避坑指南:$machine.dat文件详解与重启生效的正确姿势

KUKA C4/C2软限位修改避坑指南:$machine.dat文件详解与重启生效的正确姿势 在工业机器人调试过程中,软限位的精确设置直接关系到设备运行安全与工作效率。作为KUKA机器人系统的核心参数之一,软限位定义了各轴的运动范围边界,其配置…...

别再手动积分了!Python math库的erf/erfc函数,5分钟搞定高斯误差计算

别再手动积分了!Python math库的erf/erfc函数,5分钟搞定高斯误差计算 在信号处理、通信系统误码率分析或金融模型(如期权定价)中,高斯误差函数的计算是一个绕不开的数学工具。传统手动实现不仅耗时费力,还容…...

C站模型下载安装保姆级教程:从Civitai找到心仪模型到Stable Diffusion WebUI一键出图

Civitai模型下载与部署全指南:从零掌握Stable Diffusion资源管理 第一次打开Civitai网站时,琳琅满目的模型可能让你既兴奋又困惑。作为AI绘画领域的资源宝库,Civitai汇集了全球创作者分享的各类模型,但如何高效找到适合自己的资源…...

在Node.js服务中集成Taotoken实现稳定高效的大模型调用

在Node.js服务中集成Taotoken实现稳定高效的大模型调用 1. 环境准备与密钥管理 在Node.js服务中集成Taotoken的第一步是妥善管理API密钥。推荐通过环境变量存储密钥,避免硬编码在代码中造成安全风险。在项目根目录创建.env文件并添加以下内容: TAOTOK…...

CoreELEC技术栈在创维E900V22C媒体中心部署与优化指南

CoreELEC技术栈在创维E900V22C媒体中心部署与优化指南 【免费下载链接】e900v22c-CoreELEC Build CoreELEC for Skyworth e900v22c 项目地址: https://gitcode.com/gh_mirrors/e9/e900v22c-CoreELEC 本指南提供了基于CoreELEC技术栈在创维E900V22C电视盒子上部署专业级媒…...

终极macOS清理神器:Pearcleaner让你的Mac告别应用残留,释放宝贵磁盘空间

终极macOS清理神器:Pearcleaner让你的Mac告别应用残留,释放宝贵磁盘空间 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾因m…...

PRM800K研究应用:如何基于800K标签推进数学AI发展

PRM800K研究应用:如何基于800K标签推进数学AI发展 【免费下载链接】prm800k 800,000 step-level correctness labels on LLM solutions to MATH problems 项目地址: https://gitcode.com/gh_mirrors/pr/prm800k PRM800K是一个包含800,000个步骤级正确性标签的…...

为多租户 SaaS 产品设计基于 Taotoken 的灵活可扩展的 AI 功能模块

为多租户 SaaS 产品设计基于 Taotoken 的灵活可扩展的 AI 功能模块 1. 多租户 AI 功能的核心需求 在多租户 SaaS 产品中集成 AI 能力时,需要解决三个核心问题:功能可定制化、资源隔离与成本透明。Taotoken 的 API Key 管理与用量统计能力可以很好地满足…...

使用curl命令直接调试Taotoken大模型接口的完整指南

使用curl命令直接调试Taotoken大模型接口的完整指南 1. 准备工作 在开始使用curl调试Taotoken大模型接口之前,需要确保已经完成以下准备工作。首先登录Taotoken控制台,在"API密钥"页面创建一个新的API Key并妥善保存。然后在"模型广场&…...

LuaDec51终极指南:快速掌握Lua 5.1反编译的完整解决方案

LuaDec51终极指南:快速掌握Lua 5.1反编译的完整解决方案 【免费下载链接】luadec51 Lua Decompiler for Lua version 5.1 项目地址: https://gitcode.com/gh_mirrors/lu/luadec51 LuaDec51是一个专业级的Lua 5.1反编译器工具,为开发者提供高效的反…...

Orama Core:构建高性能、可定制化搜索引擎的核心引擎指南

1. 项目概述:从“搜索”到“核心”的范式演进最近在折腾一个需要处理大量非结构化文本数据的项目,传统的全文搜索引擎在处理语义模糊查询时,总是差那么点意思。比如,用户想找“如何快速搭建一个高可用的API服务”,传统…...

终极指南:RevokeMsgPatcher中的NuGet包管理最佳实践

终极指南:RevokeMsgPatcher中的NuGet包管理最佳实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/…...

加密领域系统性分析框架:四层模型与工具链实战指南

1. 项目概述:一个加密领域从业者的“景观审视”技能包在加密领域摸爬滚打这些年,我越来越觉得,面对这个日新月异、信息爆炸的行业,最核心的竞争力往往不是对某个单一技术的深度钻研,而是一种系统性的“景观审视”能力。…...

EasyExcel终极指南:百万级社交媒体数据处理与可视化报告生成全流程

EasyExcel终极指南:百万级社交媒体数据处理与可视化报告生成全流程 【免费下载链接】easyexcel 快速、简洁、解决大文件内存溢出的java处理Excel工具 项目地址: https://gitcode.com/gh_mirrors/ea/easyexcel 在当今数据驱动的时代,社交媒体平台每…...

xgmem:XGBoost稀疏数据预测性能优化利器

1. 项目概述与核心价值最近在折腾一些需要处理大规模稀疏数据的机器学习项目,比如推荐系统里的用户-物品交互矩阵,或者自然语言处理里高维度的词袋模型。这类数据的特点是维度极高,但大部分元素都是零,用传统的密集矩阵存储和处理…...