前言
在以前,我们发布代码都是在本地先将代码编译打包压缩好好,然后借助 xshell 等工具登录服务器,将压缩好的代码拷贝到服务器目录,解压执行。但是这种方式是繁琐低效的。而且,直接登录服务器进行操作有很大的风险。随着 DevOps 的兴起,出现了持续集成,持续交付(CI/CD)和持续部署的新方法,开发人员只需要通过工具定义好整个软件打包发布的流水线(Pipeline)就可以实现自动化。
那么,通过什么软件去定义这个流水线,就是下面我要介绍的 github 提供的 Actions 模块功能。
actions 配置文件
actions 的配置文件存放在代码仓库的.github/workflows
目录。是一个yml
文件,名字可以自定义。
配置字段
name:工作流(Workflows)的名字,你可以定义多个流水线,名字可以帮助你区分。
on:Workflows 触发的时机,一般是 push 和 pr 到指定分支时触发。
runs-on:工作流执行的虚拟机环境。
job:任务,一个 Workflows 可由一个或多个 job 组成。
step:步骤,每个 job 可由一个或多个 step 组成。
use:在执行 step 时,你可以使用别人定义好的 actions
run:在执行 step 时,执行 run 对应的 shell 命令
下面是我目前配置的 Workflows
name: vpBlog# Controls when the action will run. Triggers the workflow on push or pull request# events but only for the master branchon: push: branches: [master] pull_request: branches: [master]# A workflow run is made up of one or more jobs that can run sequentially or in paralleljobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - name: Install Node.js uses: actions/setup-node@v1 with: node-version: "10.x" - name: install dependencies run: npm install # Runs a single command using the runners shell - name: build project run: npm run build - name: Deploy to Server uses: easingthemes/ssh-deploy@v2.1.1 env: # 以下为参数 SSH_PRIVATE_KEY: ${{ secrets.DEPLOY_SSH_KEY }} ARGS: "-rltgoDzvO --delete" REMOTE_USER: ${{ secrets.DEPLOY_USER }} # 为了用户信息安全对敏感数据可以在secrets中配置 REMOTE_HOST: ${{ secrets.DEPLOY_HOST }} SOURCE: ".vuepress/dist" TARGET: "/usr/share/nginx/html
secrets 配置
上面配置中你一定很好奇secrets.DEPLOY_SSH_KEY
是如何获取的。下面就可以解答你的疑惑。
相信秘钥,服务器地址这些敏感信息,你一定不希望被别人看到。所以 github 也贴心的提供了 secrets 模块配合 actions 使用。
具体配置方法可以看下图
工作流配置
每个人在发布前可能会执行 eslint 检查,或者跑单元测试,然后在执行 build,这里不展开讲了。最终的目的是要将代码发布到指定的服务器上。下面就来说下这步怎么做。
其实也不复杂,是借助了easingthemes/ssh-deploy
这个开源的 action,其原理也是使用rsync
这个工具实现数据传输。
- name: Deploy to Server uses: easingthemes/ssh-deploy@v2.1.1 env: # 以下为参数 SSH_PRIVATE_KEY: ${{ secrets.DEPLOY_SSH_KEY }} ARGS: "-rltgoDzvO --delete" REMOTE_USER: ${{ secrets.DEPLOY_USER }} REMOTE_HOST: ${{ secrets.DEPLOY_HOST }} SOURCE: '.vuepress/dist' TARGET: '/usr/share/nginx/html'
服务器配置
由于rsync
是借助秘钥实现通过 ssh 进行传输。所以在服务器上需要做一些配置。
创建秘钥
ssh-keygen -m PEM -t rsa -b 4096
在服务器上安装公钥
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
编辑 /etc/ssh/sshd_config 文件,开启服务器允许通过秘钥登录
RSAAuthentication yesPubkeyAuthentication yes
因为我是直接使用 root 账号,所以还要开启允许 root 通过 ssh 登录
PermitRootLogin yes
重启 ssh 服务器
service sshd restart
最后将私钥(id_rsa )中的内容保存到 secrets
总结
因为都是静态文件所以直接拷贝到 nginx 目录就可以直接运行了,所以相对比较简单。如果是服务端还需要涉及到执行重启等功能。
下面放一个执行成功的 actions