通过 Github Action 发布项目到 Aliyun 阿里云 ECS,非常适合团队项目或是个人的小项目,操作简单、便于维护。
本文将通过最详细的描述,从每个步骤的源头开始讲起,保证小白也能成功。
通过 Github 的 Action 发布到 ECS 有几个关键点:
- 项目构建环境的初始化,以及项目的编译
这一步可以利用 Action 的构建模板,选择合适的基础环境,然后再定制化编译脚本完成初始化和编译流程。
- Action 的编译环境,如何安全的连接到 ECS 完成发布
项目完成编译后,需要把文件上传到服务器,并完成服务的重启,此时需要通过 SSH 等服务。
本文以 SSH 为主进行介绍,SSH 链接到 ECS,建议通过密钥形式,安全性更高。
下面是一份我的个人项目中的一份脚本,供大家参考:
name: Build And Deploy To Aliyun ECS
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
ref: master
submodules: true
- name: Install and Build
run: |
yarn install
yarn build
- name: Deploy to aliyun server
uses: easingthemes/ssh-deploy@v2.0.7
env:
SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
ARGS: "-avzr --delete"
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
REMOTE_USER: "root"
TARGET: "/root/web"
分部分介绍:
第一部分:
name: Build And Deploy To Aliyun ECS
这个是任务的名称,参考作用。
第二部分:
on:
push:
branches: [ master ]
这部分是触发器,当发生哪些行为时,触发 Github Action 的执行。
如上配置,则是当 master 分支,发生 push 时,触发执行。
你同样可以切换到其他的分支或其他的行为,比如新 tag 的 push 等等,具体请参考:
https://docs.github.com/cn/free-pro-team@latest/actions/reference/events-that-trigger-workflows
第三部分
jobs:
这里就开始正式的构建项目了,jobs 就是工作流程,工作流程运行包括一项或多项作业。 作业默认是并行运行。
我们这里定义了一项作业,即 build。
runs-on: ubuntu-latest
steps:
这里定义了我们这项作业的运行环境,机器可以是 GitHub 托管的运行器或自托管的运行器。
可选的 GitHub 运行器有 windows、ubuntu 和 macos,你也可以构建自托管的运行器,满足您高度的自定义运行环境需求。
我的项目是 NodeJS 编写的,默认的 ubuntu 运行器包含 NodeJS 环境,所以我这里直接采用了 GitHub 提供的运行器。
steps 则是作业的步骤,每个步骤可以是运行命令或是其他操作。
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
ref: master
submodules: true
这是我们作业的第一个步骤,这个步骤的任务是把我们的源码 checkout 下来,此处选择的分支是 master。
- name: Install and Build
run: |
yarn install
yarn build
这是作业的第二个步骤,NodeJS 项目的构建环境初始化和编译。
- name: Deploy to aliyun server
uses: easingthemes/ssh-deploy@v2.0.7
env:
SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
ARGS: "-avzr --delete"
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
REMOTE_USER: "root"
TARGET: "/root/web"
这是作业的最后一个步骤,项目编译完成后,将会在项目目录的 dist 下生成最终文件,我们只需要把这个目录下的所有问题发布到 ECS 即可。
这里使用的是 SSH 链接到了 ECS。
先详细介绍一下几个关键参数:
ARGS: "-avzr --delete"
SOURCE: "dist/"
TARGET: "/root/web"
这三个参数,将本地的 dist 目录下的所有文件覆盖到了云端的/root/web 目录
SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
REMOTE_USER: "root"
这三个参数是 SSH 的链接参数,user 即链接服务的用户名(阿里云一般是 root),host 即服务器地址(可以是 IP 也可以是域名)
SSH_PRIVATE_KEY 链接私钥
其中 HOST 和 KEY 两个我们采用了环境变量的方式引用,对应 secrets 的环境变量,你可以在项目的如下图所示位置进行配置:
我们配置了两个参数,HOST 比较简单,关于私钥的配置,请参考如下步骤:
(其实是 SSH 免密码登录的配置,熟悉的同学可以掠过)
- 我们需要创建一个私钥
我们可以利用阿里云控制台进行操作(同样,也可以用 linux 的命令行进行操作)
进入阿里云的 ECS 控制台,在左侧菜单找到 < 网络与安全 > < 密钥对 >
点击创建密钥对,如下填写,名称和其他信息可以随意:
创建成功后,就会自动下载私钥文件,我们保存到本地即可。
- 利用私钥生成公钥
Windows 可以使用 WSL,Linux 的进入终端
输入如下命令,即可生成公钥
ssh-keygen -y -f /path/to/private_key > /path/to/public_key.pub
- 将公钥写入.ssh
将生成的公钥里面的内容,追加到 ECS 的~/.ssh/authorized_keys 中即可。
- 更新 ssh 配置,允许 root 登录
编辑/etc/ssh/sshd_config
修改如下配置:
PermitRootLogin yes
然后执行:
service sshd restart
应用配置
- 更新 GitHub 配置
进入 Secrets 配置,点击,如下图所示填写
名称填写我们在脚本里写的变量名:ALIYUN_SERVER_ACCESS_TOKEN
值,填写私钥的内容。
创建完成后,记得删掉私钥,并清空回收站,不要让任何人获取到私钥内容。
至此,一切大功告成!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于