GitHub Actions 秘密未注入 Python 环境变量

-1 投票
1 回答
57 浏览
提问于 2025-04-14 18:24

我在使用GitHub Actions时遇到了一个意想不到的问题,我的Python脚本无法获取到秘密值。虽然我在GitHub仓库中正确设置了秘密,并尝试通过 os.environ.get("SECRET_NAME") 来访问它们,但返回的结果却是 None。下面是我在GitHub Actions工作流中设置环境变量的方式:

这是我的Python代码片段:

from pymongo import MongoClient
import os

try:

    user = os.environ.get("MONGO_USER")
    password = os.environ.get("MONGO_PASSWORD")
    host = os.environ.get("MONGO_HOST")
    dbname = os.environ.get("MONGO_DBNAME")
    collection_name = os.environ.get("MONGO_COLLECTION_NAME")
    app_name = os.environ.get("MONGO_APP_NAME")
    uri = f"mongodb+srv://{user}:{password}@{host}/{dbname}?retryWrites=true&w=majority&appName={app_name}&tls=true"

    print(uri)
    client = MongoClient(uri)

    client.admin.command('ping')
    print("Pinged your deployment. You successfully connected to MongoDB!")
    # Complétez cette liste avec les symboles réels
    symboles = ["MC.PA", "RMS.PA", "OR.PA", "CDI.PA", "TTE.PA", "AIR.PA", "SU.PA", "SAN.PA", "AI.PA", "EL.PA", "SAF.PA",
                "CS.PA", "DG.PA", "BNP.PA", "DSY.PA", "KER.PA",
                "BN.PA"]
except Exception as e:
    print(e)

main.yml


on:
  workflow_dispatch:  # Permet le déclenchement manuel
  schedule:
    - cron: '0 9 * * *'  # Exécute tous les jours à 9h00 UTC

build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'
    - name: Update SSL Certificates
      run: sudo apt-get update && sudo apt-get install -y ca-certificates

    - name: Update certifi
      run: pip install --upgrade certifi

    - name: Install dependencies
      run: |
        pip install pymongo
        pip install yfinance
        # Ajoutez ici d'autres dépendances si nécessaire


    - name: Testing Secrets
      run: |
        echo "$MONGO_USER"
        echo "$MONGO_PASSWORD"
        echo "$MONGO_HOST"
        echo "$MONGO_DBNAME"
        echo "$MONGO_COLLECTION_NAME"
        echo "$MONGO_APP_NAME"
      env:
        MONGO_USER: ${{ secrets.MONGO_USER }}
        MONGO_PASSWORD: ${{ secrets.MONGO_PASSWORD }}
        MONGO_HOST: ${{ secrets.MONGO_HOST }}
        MONGO_DBNAME: ${{ secrets.MONGO_DBNAME }}
        MONGO_COLLECTION_NAME: ${{ secrets.MONGO_COLLECTION_NAME }}
        MONGO_APP_NAME: ${{ secrets.MONGO_APP_NAME }}

    - name: Execute update_data.py
      run: python API/update_data.py

data.py

import os
print("MONGO_USER:", os.environ.get("MONGO_USER"))

我的变量 我的变量

我的秘密

    Traceback (most recent call last):
  File "/home/runner/work/bourses/bourses/API/update_data.py", line 19, in <module>
    client = MongoClient(uri)
MONGO_USER: None
             ^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/pymongo/mongo_client.py", line 771, in __init__
    res = uri_parser.parse_uri(
          ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/pymongo/uri_parser.py", line 557, in parse_uri
    dns_resolver = _SrvResolver(fqdn, connect_timeout, srv_service_name, srv_max_hosts)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/pymongo/srv_resolver.py", line 81, in __init__
    raise ConfigurationError(_INVALID_HOST_MSG % (fqdn,))
pymongo.errors.ConfigurationError: Invalid URI host: none is not a valid hostname for 'mongodb+srv://'. Did you mean to use 'mongodb://'?
Error: Process completed with exit code 1.

尽管进行了这些配置,user 最终还是变成了 None。有没有人遇到过这个问题?我该如何确保我的Python脚本能够正确访问秘密值呢?

1 个回答

0

问题

如果你只测试了自己之前的简单例子,你就能发现这个问题了。

之前你有这样的代码:

    - name: Execute update_data.py
      env:
        MONGO_USER: ${{ secrets.MONGO_USER }}
      run: python API/update_data.py

这个是可以正常工作的。

现在你的完整例子相当于这个:

    - name: Testing Secrets
      run: |
        echo "$MONGO_USER"
      env:
        MONGO_USER: ${{ secrets.MONGO_USER }}

    - name: Execute update_data.py
      run: python API/update_data.py

如果你只在一个步骤中提供了 env,那么它只在那个步骤中有效。每个以 - name 开头的块(更准确地说,是以 - 开头的)都是一个新的步骤。

解决方案

选项 1:把 env 移到构建层级

jobs:
  build:
    runs-on: ubuntu-latest

    env:
      MONGO_USER: ${{ secrets.MONGO_USER }}

    steps:
      ...
    - name: Execute update_data.py
      run: python API/update_data.py

选项 2:把 env 移到正确的步骤

    steps:
      ...
    - name: Execute update_data.py
      env:
        MONGO_USER: ${{ secrets.MONGO_USER }}
      run: python API/update_data.py

撰写回答