如何在github action中获取到仓库的secrets
最近在研究使用github action,这个问题困扰了我挺久,我在github action的官方指南中也没找到方法。
经过对别人代码的研究和google,我还是最终找到了三种方法
一、通过os的环境变量获取(推荐)
github action其实就是创建了一个新的虚拟机供我们使用,而在普通的系统中,用python的os模块也是能获取环境变量的,所以在github action中也同理。
环境变量
在操作系统中定义的环境变量,全部保存在os.environ
这个变量中,可以直接查看:
1 2 3
| >>> import os >>> os.environ environ({'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'TERM_PROGRAM_VERSION': '326', 'LOGNAME': 'michael', 'USER': 'michael', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin', ...})
|
我们一般的系统里面环境变量很多,一般不用这种方式去获取变量,更多使用文件读取的方式获取变量,但基于github action的特殊性(大家基本上都用公开的仓库,而使用secrets可以加密我们的变量,使用就使用读取环境变量的方法来读取密钥或者密码之类的)
要获取某个环境变量的值,可以调用os.environ.get('key')
或者使用os.environ['key']
1 2
| >>> os.environ.get('PATH') '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin'
|
secrets
在这里填写对应的Name和Value

配置yml文件
用这个文件举例,我们添加的一个变量SCKEY是sever酱(一个微信推送服务)的SCKEY
字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| name: 'GitHub Actions LeetCode Weekly Bot'
on: push: branches: - master schedule: - cron: '0 2 * * 0'
jobs: leetcode-weekly: runs-on: ubuntu-latest steps: - name: 'Checkout' uses: actions/checkout@v2 - name: 'Set up Python' uses: actions/setup-python@v1 with: python-version: 3.7 - name: 'Install requirements' run: pip install -r leetcode-weekly/requirements.txt - name: 'Working' env: SCKEY: ${{ secrets.SCKEY }} run: python leetcode-weekly/main.py
|
其中,在 Working
步骤中,指定了环境变量 SCKEY
,并将它的 value 设为 secrets.SCKEY
python中获取环境变量
1 2 3 4
| import os
if __name__ == '__main__': SCKEY = os.environ["SCKEY"]
|
二、使用EOF直接读进去
这是我从别人的代码里面直接看来的,直接上yml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| name: clock
on: push: branches: [ master ] pull_request: branches: [ master ] schedule: - cron: 20 3 * * *
jobs: bot: runs-on: ubuntu-latest steps: - name: 'Checkout codes' uses: actions/checkout@v1 - name: 'Set up Python' uses: actions/setup-python@v1 with: python-version: '3.7' - name: 'Install requirements' run: | pip install -r requirements.txt - name: Run run: | python3 main.py <<EOF ${{secrets.USERS}} EOF
|
可以看到最后之类,直接把USERS这个环境变量用EOF读了进去,这个其实就相当于是用了命令行里面的输入。
在python中读取直接用input()就行了
1 2
| def main(): users = input()
|
三、使用python命令后面的参数
python是可以在命令后面加入参数使用的,这种方法也能把变量读进去,上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| name: Auto_Attendance_GitHub_Action
on: workflow_dispatch: push: schedule: - cron: '05 23 * * *'
jobs: build:
runs-on: ubuntu-latest strategy: matrix: python-version: [3.8]
steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Run app env: username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} run: | python3 auto.py --username=$username --password=$password
|
可以看到这个代码里面,最后几行,直接吧secrets提供的环境变量当成python的参数读进去了
python里面用argparse库就好了
1 2 3 4 5 6 7 8 9 10
| import argparse
if __name__ == "__main__": parser = argparse.ArgumentParser(description='manual to this script') parser.add_argument('--username', type=str, default=None) parser.add_argument('--password', type=str, default=None) args = parser.parse_args() print("用户信息:", args) main(args.username, args.password)
|
总结
我个人最推荐第一种方法,因为可以传入最多的变量,后面两种变量多了就不好写了。
第一种方法我看到还有人把一整个yml文件放在value里面,然后去python里面读写,这样可以传入好多的变量哈哈哈哈。
参考链接:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017623135437088
https://blog.csdn.net/sculpta/article/details/106474324
https://docs.github.com/cn/free-pro-team@latest/actions/reference/environment-variables
https://docs.python.org/zh-cn/3/howto/argparse.html