基于Astro开发的Fuwari静态博客模版配置CICD流程

前言

同往常一样,上班摸鱼的时候,就喜欢逛逛随机逛逛别人的博客,然后有一个博客的主题让我有点心动。

我自己也是部署了博客的,我目前的博客网站是:ZY的博客,已经安稳运行了800多天。不过我的博客有个缺点就是加载很慢,主要原因呢是因为静态资源的关系,虽然有一小部分我使用了七牛云的cdn服务,但还是无法解决访问慢的问题。加上本身的服务器带宽也不大,只有3M的带宽。种种原因导致我的博客访问很慢,然后就遇到了今天要说的这个博客,这是一个静态博客,访问起来速度会快很多。

这个博客是基于Astro开发的一个博客主题模版,GitHub上叫fuwari

先来放一张博客的图片,我觉得这个主题还是很好看的。

在线访问

目前我的新博客也已经部署到服务器上了,地址为:

欢迎大家访问我的新博客!

博客的不足

如果拿这个博客和我目前的博客对比,我认为的不足点有以下几点:

  • 评论功能还未完成;(已集成)
  • 没有友情链接功能;

fuwari的开发者不知道什么时候会更新评论功能,不过我在翻阅Pull requests时,发现有一个关于评论的合并请求:https://github.com/saicaca/fuwari/pull/406。

我也是花了时间去实验了一下,发现我还得重新注册个域名,总的来说还是比较麻烦的。后面发现他这种办法是针对于没有服务器的博主,我有自己的服务器完全可以找一个开源的评论系统集成到fuwari中去就行了。

后续我在博客集成了Twikoo评论系统,后面我再单独出一篇文章讲如何集成评论系统。

总之我觉得Astro的自由度很高,支持很多语言如:ReactPreactSvelteVueSolid等,可扩展性很高,完全可以根据自己的想法去修改博客的内容。

如何部署

下面来讲一讲如何部署一个这个博客,Astro的文档很详细,这里就拿部署到GitHub上来作为例子。

部署文档:部署你的 Astro 站点至 GitHub Pages | Docs https://docs.astro.build/zh-cn/guides/deploy/github/

部署文档里面说的很清楚,我这里就不再复述了,如果只是单纯的部署到GitHub Pages上,跟着官方文档去做,一般不会出现问题。

使用自己的域名

总所周知,Github Pages部署后会给你一个Github.io域名,如果想使用自己的域名则需要做一点修改。

首先修改代码中的astro.config.mjs文件,将site指向你的域名,要注意的是不要为 base 设置值。

import { defineConfig } from 'astro/config'

export default defineConfig({
site: 'https://example.com',
})

域名解析

代码改完之后,需要为你的域名添加域名解析,以阿里云域名为例。

顶级域名:需要添加A类解析,将你的顶级域名指向Github.io域名的ip地址,获取ip地址,本地控制台ping一下github.io域名即可。

如果是二级域名,比如我的blog.pljzy.top,那么则需要添加的是CNAME类型的解析,将blog.pljzy.top域名直接解析到Github.io上去就行了。

Github配置

如图所示:

Source选择GitHub ActionsCustom domian填入自己的域名,然后强制HTTPS打开。

如何创建文章

部署完成后,如果上传文章呢,我之前的博客是在后台管理系统中上传文章,这个静态博客当然是不存在后台管理系统的,所以上传文章就需要手动去讲文章放到posts目录下。

注意分为带展示图的文章和不带展示图的文章。

posts指代Src->Content->posts

带展示图

posts目录下创建文章目录guidecover.jpeg就是首图,index.md就是文章。

guide/
├── index.md
└── cover.jpeg

不带展示图

不带展示图的文章就只需要在posts下创建md文件即可。

posts/
└── index.md

注意

需要注意的是,md文件需要再开头添加上标识,用于展示文章的标题、时间、首图、分类、标签等信息。

---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
lang: jp # Set only if the post's language differs from the site's language in `config.ts`
---、

步入正题CICD

CICD简述

CI/CD(持续集成/持续交付或持续部署)是一种自动化软件开发和交付流程。

  • 持续集成(CI):开发者提交代码后,自动触发构建和测试(单元测试、代码扫描等)。
  • 持续交付(CD):生成可部署的产物(如Docker镜像),等待人工确认发布。

简言之,CI/CD通过自动化实现从代码提交到发布的快速、可靠流程。

deploy.yml

上面扯了很多,还没有开始讲CICD。部署到GitHub Pages时,Astro官方文档给了一个通用的Github Action模版。

使用这个模版就可以完成简单的CICD流程,我们只需要在本地的Src->Content->posts中创建文章,或者把文章目录移入该目录下,然后commit提交,push推送,GitHub Action会自动帮我们完成打包+部署。

name: Deploy to GitHub Pages

on:
# 每次推送到 `main` 分支时触发这个“工作流程”
# 如果你使用了别的分支名,请按需将 `main` 替换成你的分支名
push:
branches: [ main ]
# 允许你在 GitHub 上的 Actions 标签中手动触发此“工作流程”
workflow_dispatch: # 允许 job 克隆 repo 并创建一个 page deployment
permissions:
contents: read
pages: write
id-token: write jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout your repository using git
uses: actions/checkout@v4
- name: Install, build, and upload your site
uses: withastro/action@v3
# with:
# path: . # 存储库中 Astro 项目的根位置。(可选)
# node-version: 20 # 用于构建站点的特定 Node.js 版本,默认为 20。(可选)
# package-manager: pnpm@latest # 应使用哪个 Node.js 包管理器来安装依赖项和构建站点。会根据存储库中的 lockfile 自动检测。(可选) deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

使用自己的服务器

考虑到Github Pages的访问速度时好时坏,非常的不稳定,想部署到自己的服务器上。部署的方式有很多种,直接将打包后的文件丢入Nginx中,或者使用Docker构建容器去部署。

这样做都行,但是我每次添加文章,都要重新去build代码,然后上传到服务器,很麻烦。

聪明的网友已经发现解决办法了,上面我们是不是讲过GitHub Action流程可以完成简单的CICD,即本地编写文章-push代码-GitHub自动构建打包部署

那我们只需要稍微修改一下deploy.yml文件,然后在Github配置一下连接服务器的ssh私钥即可。

  • SERVER_IP:服务器外网ip地址
  • SSH_USERNAME:登录用户名
  • SSH_PRIVATE_KEY:ssh私钥

打包后的文件直接丢进服务器的Nginx目录下

使用这份deploy.yml文件就行了,根据自己的实际情况修改挂载目录和端口。

name: Deploy with Volume Mount

on:
push:
branches: [main]
workflow_dispatch: jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4 - name: Install and Build (Astro)
uses: withastro/action@v3 - name: Upload Files to Server
uses: appleboy/scp-action@v0.1.6
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "dist/*"
target: "/www/wwwroot/default/newblog" # 直接上传到挂载目录 - name: Start/Restart Container
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# 直接运行Nginx容器并挂载目录
docker stop astro-app || true
docker rm astro-app || true
docker run -d \
--name astro-app \
-p 4321:80 \
-v /www/wwwroot/default/newblog:/usr/share/nginx/html:ro \
nginx:alpine

使用Docker部署到服务器

使用Docker相对来说麻烦一点,使用这份deploy.yml文件就行了,然后需要常见DockerFiledocker-compose.ymldefault.conf这3个文件,博主就是采用的这种方式。同样注意根据自己服务器的实际情况修改目录和端口。

deploy.yml

name: Docker Compose Deploy

on:
push:
branches: [main]
workflow_dispatch: jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4 - name: Install and Build (Astro)
uses: withastro/action@v3 - name: Debug file existence
run: |
ls -la
ls -la dist/ || echo "dist/ not found"
ls -la docker/ || echo "docker/ not found"
test -f docker-compose.yml && echo "docker-compose.yml exists" || echo "docker-compose.yml missing" - name: Upload Files to Server
uses: appleboy/scp-action@v0.1.6
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "dist/*,docker/*,docker-compose.yml"
target: "/www/wwwroot/default/newblog" - name: Deploy with Docker Compose
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /www/wwwroot/default/newblog
docker-compose down
docker-compose up -d --build
docker system prune -f

DockerFile

FROM nginx:alpine

# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf # 复制自定义配置
COPY ./nginx/default.conf /etc/nginx/conf.d/ # 复制构建好的静态文件(由CI/CD流程完成)
WORKDIR /usr/share/nginx/html # 暴露端口
EXPOSE 4321

docker-compose.yml

version: '3.8'
services:
web:
build: ./docker
ports:
- "4321:4321"
volumes:
- /www/wwwroot/default/newblog/dist:/usr/share/nginx/html:ro
restart: unless-stopped

default.conf

server {
listen 4321;# 配置端口
server_name 0.0.0.0; # 修改为docker服务宿主机的ip location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

无论采用上述那种方式,我们只需要在本地创建文章然后提交到git上就能自动上传到服务器完成构建并运行重新项目。

吐槽一下

Github Action调试起来还是挺费劲的,博主整整调试了10几次才完成CICD,有各种原因会导致部署失败。

效果演示

修改代码后直接提交git,就能完成构建部署。

Github Action页面可以看到有3个流程,分别是代码检查、构建检查、以及最后的推送到服务器构建,代码检查和构建检查是fuwari模版自带的无需修改。

相关链接

基于Astro开发的Fuwari静态博客模版配置CICD流程的更多相关文章

  1. Django基于Pycharm开发之四[关于静态文件的使用,配置以及源码分析](原创)

    对于django静态文件的使用,如果开发过netcore程序的开发人员,可能会比较容易理解django关于静态文件访问的设计原理,个人觉得,这是一个middlerware的设计,但是在django中我 ...

  2. 基于mkdocs-material搭建个人静态博客

    基于mkdocs-material搭建个人纯静态博客,没有php,没有mysql 如果你只是想安安静静的放一些技术文章,发布到个人站点或github-pages,mkdocs-material很适合你 ...

  3. 开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程

    目录 基本原理 方法1 - 本机Windows下建站 (力荐) 下载安装node.js 用管理员权限打开命令行,安装hexo-cli和hexo 下载安装git 初始化hexo 使用hexo gener ...

  4. 在windows下创建基于github的hexo静态博客

    最近边上的人都突然买起了域名搭起了个人网站,渣渣的我介于期末没事干也跟风搭了个静态博客.虽说博客基本不更新T T,嘛嘛回归正题. 首先准备工作: 1)安装nodejs 2)安装msysgit(虽然现在 ...

  5. 基于Hexo搭建静态博客

    关于静态博客 通常来讲,建立个人博客有2种方式: 第一,直接在第三方博客平台注册博客空间,如:博客园,简书,CSDN等,这种方式建立的博客,所有数据都存放在博客平台. 第二,自建博客系统,这种方式就是 ...

  6. Github、Jekyll 搭建及优化静态博客方法指南

    尝试自己写 Blog 的人,一般会经历三个阶段. 第一阶段,刚接触 Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉 ...

  7. Hexo快速搭建静态博客并实现远程VPS自动部署

    这篇文章将如何搭建hexo,以及如何通过git webhooks实现远程vps的自动部署 这篇文件适合的条件: 简单的用于个人博客.公司博客展示,hexo的定位是静态博客,要实现动态服务器的功能并不适 ...

  8. 【一】Ubuntu14.04+Jekyll+Github Pages搭建静态博客

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  9. django开发的社区和博客

    社区 线上地址:http://codetheme.sinaapp.com/ Githubhttps://github.com/BeginMan/codetheme 由于利用两周下班时间熬夜做的,难免有 ...

  10. hexo —— 简单、快速、强大的Node.js静态博客框架

    hexo是一款基于Node.js的静态博客框架.目前在GitHub上已有1375 star 和 219 fork. 特性 风一般的速度 Hexo基于Node.js,支持多进程,几百篇文章也可以秒生成. ...

随机推荐

  1. 网络编程:reactor反应堆_TCP字节流处理和HTTP协议实现

    buffer对象 buffer对象:顾名思义,就是一个缓冲区对象,缓存了从套接字接收来的数据以及需要发往套接字的数据. 如果是从套接字接受来的数据,事件处理回调函数在不断地往buffer对象增加数据, ...

  2. 2.2.net core 工作流WorkFlow流程(流程设计)

    流程设计 WikeFlow官网:http://www.wikesoft.com WikeFlow学习版演示地址:http://workflow.wikesoft.com WikeFlow学习版源代码下 ...

  3. IDEA主题下载仓库地址

    拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme

  4. 全网第二细致的Verl GRPO实现拆解讲解

    全网第二细致的Verl GRPO实现拆解讲解 标题党致歉,纯引流 观前提示,内含大量注释代码,善用左侧目录跳过可改善阅读体验 本篇文章是在锝人的报告下继续撰写,主要着重于讲解verl实现中一些GRPO ...

  5. 【公众号搬运】React-Native开发鸿蒙NEXT(2)

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. WAAP对提升网站访问速度有什么作用?

    本文分享自天翼云开发者社区<WAAP对提升网站访问速度有什么作用?>,作者:amber WAAP(Web Application and API Protection)对提升网站访问速度具 ...

  7. GPU开启持久化模式

    GPU开启持久化模式 GPU驱动内存常驻模式,也称为GPU驱动持久模式.linux 系统下,在 persistence 模式是 enabled 状态时, GPU 驱动一直处于加载状态, 减少运行程序时 ...

  8. 树结构Tree

    树结构 平衡顺序二叉树 通过平衡顺序二叉树查数据的时候,也就等同于二分查找的操作 Binary Search 2,3树 二三树 二三树有 node2 和 node3 两种节点,树的规则如图 2-3-4 ...

  9. 2023年成都.NET线下技术沙龙即将到来!

    MASA技术团队联合成都.NET俱乐部,将在成都市举办一场.NET线下技术沙龙,为.NET开发者创造一次交流学习的契机,我们邀请到的几位技术大咖,将会围绕各自的主题向大家分享他们的技术心得. 本场沙龙 ...

  10. 极大提高项目部署的生产力!分享一个半自动化的CICD实现方案

    前言 完全自动化的 CICD 确实好,代码提交后就自动构建自动发布新版本,实现不停机更新的情况下,还能随时回滚,这搁谁不喜欢啊~ 但理想很丰满,现实往往很骨感,不是所有开发/生产环境都具备部署 CIC ...