引言
语雀webhook
触发构建的流程如下:

而当时腾讯云函数对个人使用还是在一定条件下免费的,本着能白嫖就白嫖的心态就用它做中转服务调用了。结果从上个月开始,腾讯云函数涨价了,而且费用也不便宜,我看了下账单,一个月差不多要快 10 块钱了,这我可忍不了。 所以就打算自己搭建一个node
服务,自己调用Github Actions
的API
触发构建。流程如下:

部署流程

搭建 Node 服务
搭建记录请看Midway 项目搭建
开通腾讯云容器镜像服务(可选)
目前腾讯云容器镜像服务对个人还是免费的,我就先用这个,不免费了再说。也可以直接推送到Docker Hub
实操过程中发现:由于 Github Actions 使用的机器都是美国的,所以选择在香港/海外新建会快很多很多!

具体开通流程和快速入门请直接移步腾讯云容器镜像服务个人版快速入门
配置 Github Actions
编写 workflows 流程
在 Node 项目的根目录新建.github/workflows/docker-build-deploy.yml
文件
name: Docker Image CI & CD
on: # 在直接推送/pr到Master分支时触发 push: branches: [ "master" ] pull_request: branches: [ "master" ]
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: 构建镜像 # 选择推送到香港的镜像仓库会快很多 run: docker build --file Dockerfile --tag hkccr.ccs.tencentyun.com/命名空间/镜像名称 . - name: 登录腾讯的 docker 镜像仓库 run: echo "${{ secrets.TENCENT_REGISTRY_PASSWORD }}" | docker login hkccr.ccs.tencentyun.com --username=用户名 --password-stdin - name: 把构建好的镜像推送到腾讯仓库 run: docker push hkccr.ccs.tencentyun.com/命名空间/镜像名称
deploy: runs-on: ubuntu-latest steps: - name: 初始化ssh并执行sh启动镜像 run: | eval $(ssh-agent -s) echo "${{secrets.SERVER_SSH_PRIV_KEY}}" > deploy.key mkdir -p ~/.ssh chmod 0600 deploy.key ssh-add deploy.key echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config ssh root@${{secrets.SERVER_IP}} "cd /home/deploy && sh deploy.sh" # 在build结束后才会运行deploy needs: build
Github Secrets
上面 yml 文件中的 secrets.XXX
是一些秘钥,Github
为了保护你的秘钥,提供了使用变量的办法,我们可以在仓库的 Settings -> Secrets
中定义变量,然后按照 ${{ secrets.XXX }}
的格式,即可拿到变量值。
连接云服务器
secrets.SERVER_SSH_PRIV_KEY
是用来访问远程服务器的私钥,具体:
- 在本地服务器生成密钥对,一个公钥,一个私钥
- 在远程服务器上添加步骤 1 的公钥 (将公钥添加到服务器的 ~/.ssh/authorized_keys 文件中)
- 在 Github 仓库设置
secrets.SERVER_SSH_PRIV_KEY
为步骤 1 的私钥 (Settings > Secrets)
secrets.SERVER_IP
是远程服务器地址
deploy.sh
docker pull hkccr.ccs.tencentyun.com/命名空间/镜像名称docker stop 镜像名称docker rm 镜像名称docker run -d --name 镜像名称 -p 7001:7001 hkccr.ccs.tencentyun.com/命名空间/镜像名称
配置 DockerFile
Dockerfile
在 Node 项目的根目录新建Dockerfile
文件
FROM node:12 AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
FROM node:12-alpine
WORKDIR /app
COPY --from=build /app/dist ./distCOPY --from=build /app/bootstrap.js ./COPY --from=build /app/package.json ./
RUN apk add --no-cache tzdata
ENV TZ="Asia/Shanghai"# 只安装生产的包RUN npm install --production
# 暴露端口号EXPOSE 7001# 使用pm2启动项目RUN npm install pm2 -gCMD [ "pm2-runtime", "npm", "--", "start" ]
上述相关的 npm 命令需要根据自己实际命令修改。
.dockerignore
在 Node 项目的根目录新建.dockerignore
文件,可以将.gitignore
中的配置复制过去
Done!
接下来就可以推送代码到 master 分支,就会自动部署项目了!
