Github Action自托管Runner中Secrets无法传递至Go程序的问题
自托管Runner的环境隔离设置
自托管Runner默认可能有更严格的环境变量隔离规则,不像Github托管Runner会自动继承Job级的env配置。比如有些自托管Runner启动时加了参数限制环境变量传递,或者配置文件里设置了env过滤,导致你定义的Secrets变量没传到Go进程。Go程序执行Shell时没传环境变量
你用os.exec调用Shell指令时,如果没显式把当前进程的环境变量传过去,新启动的Shell可能不会继承这些Secrets变量。默认os/exec的Cmd.Env如果为空,会用系统默认环境,但自托管环境的默认环境和托管Runner不一样。检查下Go代码里是不是漏了传递环境变量:cmd := exec.Command("your-shell-cmd") cmd.Env = os.Environ() // 显式把当前进程的环境变量传给Shell自托管VM的安全模块限制
自托管VM可能开了SELinux、AppArmor这类安全模块,它们可能阻止环境变量从Runner进程传到Go程序,或者限制Go程序读取环境变量。可以临时关掉这些模块测试,或者查系统日志找相关报错。系统环境变量同名覆盖
自托管VM本身的系统环境里可能已经有ACCESS_KEY或SECRET_KEY这两个变量,而且是空值,导致Job里设置的变量被系统环境覆盖。可以先在Job里加一步打印环境变量确认:- name: 检查环境变量 working-directory: ${{ env.working-directory }} run: | echo $ACCESS_KEY echo $SECRET_KEY如果这里能打印出值,问题就在Go程序或Shell执行环节;如果打印不出来,就是Runner没拿到Secrets。
自托管Runner版本过旧
旧版本的自托管Runner可能存在环境变量传递的bug,和Github托管Runner版本不兼容导致问题。检查下自托管Runner的版本,更新到和当前托管Runner一致的版本试试。
内容的提问来源于stack exchange,提问作者Ymi

