如何测试github action

本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com

  1. 前言

在编写github action的时候, 我们经常需要测试action 的代码,这就需要我们不断的进行 push 提交触发 workflow 进行测试,这样操作非常繁琐。 利用 act 我们可以在本地直接运行 action 进行测试,极大的提高了效率。

本文主要的内容就是对 act 使用做一个记录,偏于以后参考

  1. 环境

环境: macOS12.4

  1. 安装

3.1 安装 Docker

brew install docker

3.2 安装 act

brew install act

3.3 Repo 配置

我们把action 所在的repo克隆到本地,我们直接在此repo下创建 workflow 进行测试

其中比较重要的是我们需要让 workflow 运行我们的当前需要测试action

调整yml 文件下的uses: 配置

name: Continuous Deploy 
on: [push] 

jobs:
  deploy_job:
    runs-on: ubuntu-latest  
    name: sftp
    steps:
      - name: Checkout    
        uses: actions/checkout@v2 

      - name: deploy file to server
        uses:  ./  #这里要注意我们直接引用此repo下的action
        with:  
            .....
  1. 使用 act

cd到 repo 目录下,如果只 intel 芯片的 mac 我们直接运行 act 命令

如果是 M 系列的 mac,请运行 act --container-architecture linux/amd64

首次运行我们可以根据需要选择我们需要安装的docker image

  1. Act 使用的一些参数

5.1 Secret

github action可以读取保存在 repo 中的secret ,但是我们使用 act 的时候不能读取到这些secret

我们可以在 mac 本地创建一个名为act_secret_file保存密码 (这里名称你可以自己定义),格式为键值对就行。

SERVER_IP="xxxxxx"
SSH_PRIVATE_KEY="xxxxxx"

在运行的时候我们带上文件路径

act --secret-file /Users/wl/act_secret_file

action 中的 secret 就可以正常被读取了

  1. Rebuild(推荐)

直接运行 act 命名有时候不能执行到最新的代码,我们可以添加 rebuild 参数

这样确保我们运行的是最新的代码

act --rebuild --secret-file /Users/wl/act_secret_file

X. 最后

  1. 以前写的 SFTP-Deploy-Action 就是用 Act 进行测试的,避免了每次都要上传测试的麻烦

https://github.com/wlixcc/SFTP-Deploy-Action

  1. 遇到executable file not found in $PATH, out: 问题,可以参考下面这个回答

https://stackoverflow.com/questions/65896681/exec-docker-credential-desktop-exe-executable-file-not-found-in-path

  1. 如果遇到下面这个问题
Error: failed to start container: Error response from daemon: error while creating mount source path '/host_mnt/Users/xxx/.docker/run/docker.sock': mkdir /host_mnt/Users/xxx/.docker/run/docker.sock: operation not supported

我们需要把--container-daemon-socket - 这行添加到~/.actrc这个文件下保存,然后在运行 act 命令。

https://github.com/nektos/act/issues/2239

  1. action中的Dockerfile中我们可以提前安装一些需要的包
RUN apk update
RUN apk add --no-cache rsync sshpass openssh