前言

最近接触了一下Github Actions,不得不说,在国内这个网络环境下,这个功能真的给了很多方便的功能。

  1. 首先它能够实现在线调试、编译、和测试开发代码。
  2. 其次它部署简单,仅用一个脚本文件就能执行起代码的调试编译,而且脚本文件的编写也很简单,在网站上也有模板。
  3. 再来它的官方文档有简体中文,这个真的大大方便了中国大陆用户的学习。
  4. 最后它用起来很舒服,它和docker一样,它每次执行都是独立的,不会在同一个容器执行,不会影响之前的执行情况,在调试脚本的时候真的很好用。它还能直接上传编译出来的文件。

Github Actions真的很香。今天就写个文章来记录一下使用Github Actions的一些事情。

正文

简单使用

Github Actions的使用,主要由一个yaml脚本支撑起来。yaml脚本的内容实际上就是一个工作流的指示文件,意思是说,这个脚本把一个工作流程都给一一列举出来,Github Actions会根据这个脚本来执行代码操作。说白了,yaml就是一个工作流程的指示文件,Github Actions根据文件的指示来操作。脚本模板如下:

name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Setup Go environment
      uses: actions/setup-go@v2.1.0
   
    - name: download code
      run: |
          wget xxxxxxx
          wget xxxxxxxx
    

这是一个很简单的模板,这个模板使用了golang环境,就是说在执行Actions的时候它会自动安装并配置golang的使用环境。同时它使用的是ubuntu系统,当然这些都可以更改,下面就解释一下一些关键字。
name:此处包含模板的所有name,这个字段的内容均可以随意更换,实际上就是命名,没有什么其他用途,只是用于可视化中进行识别。
on:字段指定触发 workflow 的条件,通常是某些事件。例如上面的pushpull_request事件,详情可查阅官方文档。触发工作流程的事件
jobs:这个字段就是工作流程了,里面主要是描述整个工作流程,可以拥有多个jobs,但是所有jobs都是并行的,如果需要有顺序执行,可以在每个jobs的开始输入needs关键字,例如:

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

在此示例中,job1 必须在 job2 开始之前成功完成,而 job3 要等待 job1 和 job2 完成。
此处注意到:build,这个不是关键字,这个是jobs_id,属于唯一标识符,上面的needs例子中,job1就是一个jobs_id,这个id是可以随意自定义的,但是这代表了这一个job的一个唯一标识。
runs-on:github actions托管器,说白了就是系统,和docker容器里面的系统是一样的。可参考官方文档里面有什么系统,官方文档末尾提供。
steps:执行步骤,步骤按顺序执行。
uses:这一步骤需要先调用哪个Action,其实相当于调用已有的Actions库里面的脚本,这个可以直接快速配置相关环境。
run:这里输入执行的命令代码,值得注意的是,如果想要输入多条命令用换行分割的情况下,可以像示例一样加一条|
用到这里,Github Actions最基础的用法和写法就完成了,后面解释一些可能会用到的内容。

补充内容

1.上传文件到artifact
代码示例

- name: upload
    uses: actions/upload-artifact@v2
    with:
      name: aaa
      path: path/to/aaa

此处nameuses就不多赘述了,参考上面,主要是讲下with
with:接上面传入uses的库的参数。
示例后面接着两个参数,参数内容在actions/upload-artifact@v2库里面是指定的,所以只有namepathname代表上传文件的名字,path代表需要上传的文件所在的路径,而不是上传到github上面的路径,是Actions容器里面需要上传的文件的路径,需要自己去查阅自己编译的文件在哪里。

2.jobs和steps的单独环境变量配置
jobs的环境是可以单独配置的,代码如下:

jobs:
  job1:
    env:
      GOROOT: /etc

这里相当于GOROOT环境变量设置到了/etc。而steps同理,代码如下

steps:
- uses: actions/checkout@v2

- name: Setup Go environment
  uses: actions/setup-go@v2.1.0
   
- name: download code
  env: GOROOT: /etc
  run: |
      wget xxxxxxx
      wget xxxxxxxx
  

3.if判断
表达式通常在工作流程文件中与条件性 if 关键词一起用来确定步骤是否应该运行。当 if 条件为 true 时,步骤将会运行。
您需要使用特定语法指示 GitHub 对表达式求值,而不是将其视为字符串。

${{ <expression> }}

在 if 条件下使用表达式时,可以省略表达式语法 (${{ }}),因为 GitHub 会自动将 if 条件作为表达式求值。

总结

目前研究内容较少,所以只是初体验,以后有其他内容再写一篇文章补充吧。这里算是最简单的了。已经测试过通过了,比写bash脚本还简单。在国内,拉取github代码过于缓慢的环境下,github actions真的提供了很多方便。以后有什么需要的软件可以直接在github actions上面编译下载了。

参考资料

1.官方文档:GitHub 操作的工作流程语法
2.官方文档:GitHub 操作的上下文和表达式语法
3.官方文档:使用构件持久化工作流程数据(文件上传参考)
4.最后的一只章鱼猫 —— GitHub Actions 实现编译打包 Golang 到 Docker 镜像
5.编写自己的 GitHub Action,体验自动化部署
6.GitHub Actions 入门教程