1436 字
7 分钟

Astro 博客 CI/CD 自动部署教程:使用 GitHub Actions 实现服务器自动发布

0. 准备工作#

你需要准备

  • 一台有公网IP的Linux服务器
  • 一个可以运行的Astro项目

1. Linux上的部署#

在Linux服务器上依次执行如下步骤:

1. 创建角色#

创建Github部署时登录的角色

TIP

推荐创建一个用户专门用于Github的CI/CD,不建议使用root角色进行CI/CD;
如果使用root需要配置Root的远程登录

Terminal window
sudo adduser github-ci

2. 创建文件夹#

创建放置部署文件的文件夹并给CI角色赋权

Terminal window
mkdir /var/www/releases
chown -R github-ci:github-ci /var/www/releases

3. 安装openssh-server服务#

先检查服务器上是否安装了ssh server

Terminal window
which ssh
which sshd

如果显示:

Terminal window
root@:~/.ssh# which ssh
/usr/bin/ssh
root@:~/.ssh# which sshd
/usr/sbin/sshd

表示已经安装了SSH服务,请跳转到;
如果未显示一个路径地址,则表示没有安装,需要安装,步骤如下:

  • Ubuntu / Debian

    Terminal window
    # 安装服务
    sudo apt update
    sudo apt install -y openssh-server
    # 设置自启
    sudo systemctl enable ssh
    # 启动服务
    sudo systemctl start ssh
  • CentOS / RHEL

    Terminal window
    # 安装服务
    sudo yum install -y openssh-server
    # 设置自启
    sudo systemctl enable sshd
    # 启动服务
    sudo systemctl start sshd

4. 权限配置#

Terminal window
# 先切换到CI角色
su - github-ci
# 生成SSH的公钥和私钥
chmod 700 ~/.ssh
ssh-keygen -t ed25519
# 查看~/.ssh文件夹下有没有authorized_keys文件,如果没有,则创建authorized_keys并赋权
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 将公钥(~/.ssh/id_ed25519.pub)的内容添加到 ~/.ssh/authorized_keys
grep "$(cat ~/.ssh/id_ed25519.pub)" ~/.ssh/authorized_keys || cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

5. 安装Nginx服务#

先查看服务器有没有安装Nginx

Terminal window
nginx -v

如果提示:command not found,则表示未安装Nginx,安装步骤如下:

  • Ubuntu / Debian
    Terminal window
    # 安装服务
    sudo apt update
    sudo apt install -y nginx
    # 设置自启
    sudo systemctl enable nginx
    # 启动服务
    sudo systemctl start nginx
  • CentOS / RHEL
    Terminal window
    # 安装服务
    sudo yum install -y nginx
    # 设置自启
    sudo systemctl enable nginx
    # 启动服务
    sudo systemctl start nginx

验证安装情况:

Terminal window
systemctl status nginx

如果显示下列内容,则表示已经安装并启动了Nginx:

Terminal window
github-ci@:~/.ssh$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2026-03-23 15:58:11 CST; 1 week 2 days ago
Docs: man:nginx(8)
Process: 2379804 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
Main PID: 2330136 (nginx)
Tasks: 3 (limit: 1834)
Memory: 10.2M
CPU: 18.277s
CGroup: /system.slice/nginx.service
├─2330136 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─2379805 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
└─2379806 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

6. 配置Nginx#

修改Nginx的配置文件

/etc/nginx/nginx.conf
user www-data;
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name _;
root /var/www/current/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
}

修改完成后,运行检查:

Terminal window
sudo nginx -t

如果显示下列内容,则显示配置文件没有问题:

Terminal window
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

另外,需要为CI用户添加配置允许无密码执行 nginx reload:
执行:sudo visudo 在文件尾部添加如下内容

Terminal window
github-ci ALL=(ALL) NOPASSWD:/bin/systemctl reload nginx

添加完成后键入:ctrl+o
显示 File Name to Write: /etc/sudoers,然后按Enter保存

2. Github上的配置:#

根据如下路径配置Github远程登录服务器相关内容: GitHub Actions Secrets 配置界面

配置项及描述如下

配置项描述
HOST服务器的公网IP
USER1-1中创建的角色名,示例为github-ci
SSH_KEY1-4中生成的SSH私钥

3. 编写deploy.yml#

在项目的根目录下,在.github/workflows/下创建deploy.yml,如果没有则创建。
deploy.yml文件内容如下:

name: Astro deploy
on:
push:
branches:
- main # 这里是分支名称
jobs:
build:
runs-on: ubuntu-latest # 编译运行的平台
steps: # 编译运行的步骤
- name: 拉代码
uses: actions/checkout@v4
- name: Node环境
uses: actions/setup-node@v4
with:
node-version: 20
- name: 安装 pnpm
uses: pnpm/action-setup@v3
with:
version: 9
run_install: false
- name: 安装依赖
run: pnpm install --no-frozen-lockfile
- name: 构建
run: pnpm build
- name: 上传文件
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
source: "dist/"
target: "/var/www/releases/${{ github.run_id }}"
- name: 部署
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
mkdir -p /var/www/releases/${{ github.run_id }}
ln -sfn /var/www/releases/${{ github.run_id }} /var/www/current
systemctl reload nginx

4. 编写博文#

在src/content/post文件夹下,创建一个新的Markdown文件,或者在控制台运行下列命令生成新的文件

Terminal window
pnpm new-post <filename>

在其中编写你的博文内容后,将markdown文件commit并push到Github后,在Github中查看编译运行情况: 如何在Action页面查看每次CI/CD

左侧的Astro Deploy是deploy.yml中的name键的值
点击右侧的Commit Message可以查看这次Push对应的Action详情

如何在Action页面查看某次CI/CD 这里可以看到每一步操作的日志信息,如果出现错误则进行对应的处理后重新部署

TIP

如果你修改了服务器配置或者Github相关配置,没有修改代码但是又需要重新触发CI/CD,你有如下两种方案

    1. 在Action左侧选择Astro Deploy,在右侧单击最后一次Push,然后在右侧点选Re-run all jobs
      如何重新触发CI/CD
    1. 你可以通过Commit并Push一次空的提交来触发CI/CD
      命令为:git commit --allow-empty -m <commit message>

5. 回滚版本#

你可以通过如下的命令将发布的版本回退到指定的版本:

Terminal window
ln -sfn /var/www/releases/旧版本ID /var/www/current

这个旧版本ID为github执行CI/CD的run-id
github.run_id 是 GitHub Actions 为每次 workflow run 自动生成的唯一整数 ID,用于区分不同部署版本。
这一项是在deploy.yml中写到的:mkdir -p /var/www/releases/${{ github.run_id }}
在Action中,找到你需要回退到的那一次Push,在详情页面的URL可以找到这次CI/CD对应的run-id
服务器上的run-id github中的run-id

Astro 博客 CI/CD 自动部署教程:使用 GitHub Actions 实现服务器自动发布
https://yuumiblog.com/posts/blogbuild/blogbuildnote03/
作者
悠米的开发笔记
发布于
2025-10-15
许可协议
CC BY-NC-SA 4.0