gitgitaction

阮一峰的 GitHub Actions 入门教程

说明:

  1. 物料仓库被推送代码时,可以触发 github 的钩子(webhook)
  2. 钩子触发工作流程(workflow)(如果仓库中有设置)
  3. 工作流程(workflow)是一段脚本,它会运行在 github 官方的免费云服务器上(公网 ip),你可以在流程里干任何事情
  4. 一般用法是将工作流程(workflow)用于持续集成服务(Continuous Integration,简称 CI),如: push 后自动构建,自动部署到 github 的 page 服务(可以是物料仓库本身或者是别的仓库),甚至自动部署到阿里云的 OSS 服务

实践:

以push代码后:自动构建自动部署github-page为例。 这里的源代码仓库(物料仓库)和github-page服务仓库分开,即不是同一个仓库。

1. 准备工作

  1. 在 github 创建一个 private token (第三方推送代码到你仓库需要此凭据)。
    • 路径是:我的头像settingDeveloper setttingsPersonal access tokensGenerate new token勾选有效期、在Select scopes中勾选workflow的权限。
    • 创建完之后一定要手动保存下来,后续会用到,token内容只会展示一次。
  2. 进入物料仓库,添加 secrettoken。(workflow中推送代码到指定仓库需要用到)。
    • 点击仓库的settingSecretsAdd a new secret
    • secret添加名字(名字随便填,这里填ACCESS_TOKEN作为例子),secret内容则是第一步中创建的token

2. 编写工作流程,构建github-page示例:

  1. 还是在物料仓库,编写 workflow 文件。

    • 路径是固定的,仓库根目录创建此文件夹:.github/workflows
    • 在此文件夹中创建任意yml后缀的文件。如main.yml
    name: CI
    # 什么时候执行
    on:
    # 这里设置成push时,还可以进一步设置监听什么分支的push
    push:
    	branches: [main]
    pull_request:
    	branches: [main]
     
    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:
     
    jobs:
    # 当前工作流的任务,一般有test、build、deploy。但是一般看别人都是一个build包括了打包和发布。
    build:
    # 初始环境选择
     runs-on: ubuntu-latest
     steps:
    	# name是指定显示在任务面板上的名字
     - name: checkout
    	# uses就是使用github官方action仓库的一些action
       uses: actions/checkout@master
     - name: install & build
       # run 是具体要执行的脚本
       run: |
         node ./scripts/build.js
     - name: deploy
       # 继续使用官方仓库的一个action,注意看版本号
       # 每个版本的参数名可能不一样,所以得去action的仓库查阅对应版本文档
       uses: JamesIves/github-pages-deploy-action@4.1.4
       # with指定参数,有时候是env,具体要看action的文档,这里的参数名大小写好像不敏感,因具体action而异。
       with:
         FOLDER: dist # 当前物料仓库的构建产物所在目录,一般是打包出口如dist
         token: ${{ secrets.ACCESS_TOKEN }} # 物料仓库的secret设置,此例中secret token的命名为ACCESS_TOKEN, 有了这个,github action才有权限推送构建产物到你指定的仓库。
         repository-name: Carnia/page # 目标仓库名字(注意格式,不是http链接),不填的话默认就是物料仓库本身。你甚至可以推送到别人的仓库,只要你有他的secret token。
         GIT_CONFIG_NAME: carnia
         GIT_CONFIG_EMAIL: carnia@github.com
         BRANCH: gh-page # 目标仓库目标分支
         target-folder: static # 目标仓库文件目录
  • 推送代码到物料仓库的main分支,git action就会开始自动运行构建、部署。最后会将dist目录下的产物推送到Carnia/page仓库里的gh-page分支(如果没有此分支则会自动创建)的static文件夹内。

3. 在对应的仓库开启github的page服务

rsync 同步构建产物到服务器示例

  • 部署服务端。正常情况下可以直接在服务器pull代码再构建,但是能白嫖git action的服务器去构建何乐而不为呢,下面这个例子用到了rsync,需要在服务器上安装rsync,并开启对应的文件同步路径。流程是git action构建,然后同步文件到服务器,然后启用服务。
    name: Deploy site files
     
    on:
      push:
    	branches:
    	  - master # 只在master上push触发部署
    	paths-ignore: # 下列文件的变更不触发部署,可以自行添加
    	  - README.md
    	  - LICENSE
     
    jobs:
      deploy:
    	runs-on: ubuntu-latest # 使用ubuntu系统镜像运行自动化脚本
     
    	steps: # 自动化步骤
    	  - uses: actions/checkout@v2 # 第一步,下载代码仓库
     
    	  - name: Deploy to Server # 第二步,rsync推文件
    		uses: AEnterprise/rsync-deploy@v1.0 # 使用别人包装好的步骤镜像
    		env:
    		  DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # 引用配置,SSH私钥
    		  ARGS: -avz --delete --exclude='*.pyc' # rsync参数,排除.pyc文件
    		  SERVER_PORT: "22" # SSH端口
    		  FOLDER: ./ # 要推送的文件夹,路径相对于代码仓库的根目录
    		  SERVER_IP: ${{ secrets.SSH_HOST }} # 引用配置,服务器的host名(IP或者域名domain.com)
    		  USERNAME: ${{ secrets.SSH_USERNAME }} # 引用配置,服务器登录名
    		  SERVER_DESTINATION: /home/fming/mysite/ # 部署到目标文件夹
    	  - name: Restart server # 第三步,重启服务
    		uses: appleboy/ssh-action@master
    		with:
    		  host: ${{ secrets.SSH_HOST }} # 下面三个配置与上一步类似
    		  username: ${{ secrets.SSH_USERNAME }}
    		  key: ${{ secrets.DEPLOY_KEY }}
    		  # 重启的脚本,根据自身情况做相应改动,一般要做的是migrate数据库以及重启服务器
    		  script: |
    			cd /home/fming/mysite/
    			python manage.py migrate
    			supervisorctl restart web