Github Action中python获取仓库的secrets

如何在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

image-20201222202646815

配置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:
# 07:05 everyday in UTC+8, 23:05 everyday in UTC+0
- 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


Github Action中python获取仓库的secrets
http://example.com/2020/12/22/2020-12-22-Github-Action中python获取仓库的secrets/
Author
Neko kiku
Posted on
December 22, 2020
Licensed under