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相关的Action是opspresso/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_TOKEN
:Token-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进行自动发布。
在这里,有一个很好用的Action叫ross/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)
创建Action
每个GitHub Action其实都是一个Docker镜像,通过Dockerfile
设定好运行环境,提供一个entrypoint.sh
就可以运行。
其中,step.with.args
这个参数其实就是提交给容器的CMD
,因此不能在这里使用bash
命令。
你好,我使用action设定它每隔15分钟执行一次,但是它实际上是隔一个小时左右才执行一次,执行并不准时而且还有小幅波动。这种应该怎么办?