GitHub Action使用杂记

GitHub Action

这是GitHub推出的一个类似Azure Pipeline的工具。GitHub Action
这里记录在初次使用GitHub Action时的一些小技巧。

设置环境变量

目前的GitHub Action的环境变量,若是在stage里进行export等操作,那么该环境变量是不会继承到下一个stage里的。若需要一个全局环境变量,则要按下面的方式进行设置。

设置GOPATH

在官方默认的GO环境中,仅设置了GOROOT环境变量,而我们常用的GOPATH并不存在。针对这个情况,我们可以手动设置GOPATH环境变量:

name: Go
on:
  schedule:
  - cron: 0 0 * * 3
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    - name: Set up Go 1.12
      uses: actions/setup-go@v1
      with:
        go-version: 1.12
      id: go
    - name: Set GOPATH
      run: |
        echo "##[set-env name=GOPATH;]$(dirname $GITHUB_WORKSPACE)"
        echo "##[add-path]$(dirname $GITHUB_WORKSPACE)/bin"
      shell: bash

关键点就在Set GOPATH这个step,通过set-env操作设置GOPATH

其他环境变量

针对其他环境变量,我们也可以使用类似的语句进行设置:

echo "##[set-env name=TAG_NAME;]$(date +%Y%m%d)"
echo "##[set-env name=NAME;]$(date +%Y%m%d)"

GitHub Secrets

在工作流中,我们不免需要设置一些敏感的token, password等数据,这时候就可以使用Github提供的Secrets功能。
当我们在Secrets里设置了所需的数据之后(注意:现在的Secret名称不支持以GITHUB_开头,如GITHUB_TOKEN),就可以在配置文件中通过${{ secrets.TOKEN }}的形式进行引用。

发布Release

目前我有两个项目需要每周定时构建,进行一次Release并发布数据文件。而GitHub Action官方暂时没有支持Release操作的容器,我们需要在Marketplace搜索合用的Action
我常用的一个Release相关的Actionopspresso/action-release。而这个Action有个问题,它自己的Docker镜像缺少了file命令,因此我fork了一份并替换了基础镜像。Ricky-Hao/action-release

使用方法

    - name: Release
      uses: Ricky-Hao/action-release@master
      env:
        GITHUB_TOKEN: ${{ secrets.TOKEN }}
        ASSET_PATH: release
        TAG_NAME: Latest
        NAME: Latest

只要在最后加上一个如上的Release step就行。其中:
* GITHUB_TOKENToken-Github,若token仅需要发布Release,那么只要给public repos权限即可。
* ASSET_PATH:发布的文件目录
* TAG_NAME:发布的Tag名称
* NAME:发布的Release名称

Action还有其他环境变量选项:
* TARGET_COMMITISH:设置创建Tag的特定commit,默认是master
* BODY:描述Tag的文本
* DRAFT:设置为true,则该次发布为草稿形式,默认为false
* PRERELEASE:设置为true,则该次发布为预发布形式,默认为false

发布到PYPI

我有个V2ray.Stats项目,是用于记录V2Ray的流量信息并定期发送邮件的。该项目每个版本会发布在PYPI,因此我需要一个Action进行自动发布。
在这里,有一个很好用的Actionross/python-actions,它内置了twine,可以根据PYPI的用户名和密码进行自动发布。

    - name: Publish
      uses: ross/python-actions/twine@master
      env:
        TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
        TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }}
      with:
        args: "upload --skip-existing ./dist/*"

这里的args参数就是指定运行该Action时的CMD(每个Action其实都是一个Docker容器)。

GitHub Action Budget

GitHub还提供了Action的Budget给我们使用。

[![Actions Status](https://github.com/Ricky-Hao/V2Ray.Stats/workflows/Build/badge.svg)](https://github.com/Ricky-Hao/V2Ray.Stats/actions)

Actions Status

创建Action

每个GitHub Action其实都是一个Docker镜像,通过Dockerfile设定好运行环境,提供一个entrypoint.sh就可以运行。
其中,step.with.args这个参数其实就是提交给容器的CMD,因此不能在这里使用bash命令。

参考文档

GitHub Action使用杂记》有一个想法

  1. 你好,我使用action设定它每隔15分钟执行一次,但是它实际上是隔一个小时左右才执行一次,执行并不准时而且还有小幅波动。这种应该怎么办?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据