GitHub Actions 实现CI/CD自动部署
刚接触CI/CD这一块,虽然以前用过Jenkins 但是并非是我配置的,我也仅仅是会用。 现在尝试配置github Actions + workflow来实现自动化部署的功能
原因
我的云服务器太垃圾了,在服务器执行next build直接就卡死动不了,其实之前也有遇到过,但是一直都没改。趁现在有时间赶紧看看github ci/cd是怎么做的,以后构建就不通过服务器这孱弱的性能来打包构建了!
前置
使用git把你需要自动部署的仓库拉下来放到自己想要放的位置,一般还是放/var/www这个文件夹里比较规范些
在你的服务器上获取你的密钥文件,由于我生成的密钥文件是比较现代的ed25519,所以我的密钥文件在~/.ssh/id_ed25519这里,输入cat ~/.ssh/id_ed25519
此时会输出类似
-----BEGIN OPENSSH PRIVATE KEY-----
AAAAC3NzaC1lZDI1NTE5AAAAIE...
...
-----END OPENSSH PRIVATE KEY-----
这样的内容,把输出的整个内容都复制下来(包括begin/end)
配置GitHub Actions
进入GitHub,进入你需要部署的仓库,点击Settings,找到Security下的Secrets and variables下的Actions。
默认选中的tab是Secrets 找到下面Repository secrets里绿色的名为New repository secret 按钮 点击进入到表单添加页面,
此时表单只有名为Name和Secret的这两个表单项,自行填入对应的值,后面配置workflow会用到这些变量。
| Name | Secret |
|---|---|
| SERVER_KEY | 复制的密钥 |
| SERVER_HOST | 服务器地址 |
| SERVER_USER | 自动化部署时的用户,没创建额外的用户那就是root |
到这里该配置的都已经配置好了
配置workflow自动化部署脚本
进入到你本地clone的GitHub仓库代码里,在项目根目录新建.github/workflows/deploy.yml文件
配置自动化部署的步骤:
name: Deploy
on:
push:
branches:
- main # 或你的分支名
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22.14.0
- name: Install deps
run: npm install
- name: Build
run: npm run build
- name: Add SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SERVER_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
- name: Add known hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan -t rsa ${{ secrets.SERVER_HOST }} > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
- name: Deploy via rsync
run: |
rsync -avz --delete .next/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/var/www/frontend/blog/.next/
rsync -avz --delete public/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/var/www/frontend/blog/public/
rsync -avz --delete package.json ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/var/www/frontend/blog/
- name: Restart pm2
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} '
export NVM_DIR="$HOME/.nvm";
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh";
pm2 restart blog || pm2 start npm --name blog -- start
'
可以看到我这里的脚本使用了刚配置的哪些变量,这里自动化部署容易出错,要有耐心调试,比较容易出问题的是与服务器认证,以及我的服务器使用nvm安装了node 并使用npm i -g全局安装了pm2,我同时又在最后调用pm2来重启我的项目,在workflow里是读不到我bash里的pm2路径的,所以这里我写死了nvm脚本的位置让其调用pm2执行相关逻辑。
从现在开始,我的这个博客系统是自动化构建部署的!!
后续会更新将pm2注册到全局,这样Restart pm2这里就不用这么写了!
放弃了 直接docker不香吗,拥抱更现代的容器化部署方案。
明天出踩坑过程
再次反转 docker香是香,但是我的服务器真的带不动。 因为docker本身也是需要在服务器里构建的,我的一开始的初衷就是服务器压力大吃不消本地构建 虽然docer也能拉构建好的镜像的方式免于构建,我没法白嫖 还是回到pm2部署了