You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Github Actions定时运行JupyterHub的Notebook脚本并安全访问凭证?

用GitHub Actions替代Jupyter Scheduler的解决方案

1. 设置Cron定时调度

在GitHub Actions的工作流YAML中,直接通过schedule字段配置cron表达式即可实现定时任务。注意GitHub Actions默认使用UTC时区,需根据你的需求转换时间。

比如要每天北京时间0点执行,对应UTC的16点,配置如下:

on:
  schedule:
    - cron: '0 16 * * *'  # UTC时间16:00 = 北京时间00:00
  workflow_dispatch:  # 增加手动触发选项,方便测试

2. 运行Jupyter Notebook脚本

分两种场景处理,按需选择:

场景A:在GitHub Actions Runner中运行

把JupyterHub里的Notebook克隆到GitHub仓库后,在Actions的runner环境中执行,步骤如下:

  1. 从JupyterHub导出依赖列表(比如pip freeze > requirements.txt或conda env export > environment.yml),提交到仓库。
  2. 在工作流中配置匹配的Python环境,安装依赖,用nbconvert或papermill执行Notebook。

示例工作流片段:

jobs:
  run-notebook:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码仓库
        uses: actions/checkout@v4

      - name: 配置Python环境
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'  # 匹配JupyterHub中的Python版本

      - name: 安装依赖
        run: |
          python -m pip install --upgrade pip
          pip install jupyter nbconvert papermill
          pip install -r requirements.txt

      - name: 执行Notebook
        run: |
          jupyter nbconvert --to notebook --execute your_prod_notebook.ipynb --output executed_notebook.ipynb

场景B:远程在JupyterHub服务器上运行

如果Notebook依赖JupyterHub的特定环境或本地资源,可让GitHub Actions通过SSH连接到服务器执行脚本,避免环境不一致问题:

  1. 生成SSH密钥对,将公钥添加到JupyterHub服务器的~/.ssh/authorized_keys文件中。
  2. 将私钥、服务器地址、用户名存入GitHub仓库的Secrets中。
  3. 在工作流中用SCP复制Notebook到服务器,再通过SSH执行。

示例工作流片段:

jobs:
  remote-exec:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码仓库
        uses: actions/checkout@v4

      - name: 复制Notebook到JupyterHub
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.JUPYTERHUB_HOST }}
          username: ${{ secrets.JUPYTERHUB_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          source: "your_prod_notebook.ipynb"
          target: "/home/your_jupyter_user/notebooks/"

      - name: 在JupyterHub上执行Notebook
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.JUPYTERHUB_HOST }}
          username: ${{ secrets.JUPYTERHUB_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /home/your_jupyter_user/notebooks/
            source /home/your_jupyter_user/miniconda3/bin/activate your_prod_env  # 激活生产环境
            jupyter nbconvert --to notebook --execute your_prod_notebook.ipynb

3. 安全访问凭证

方案A:转移凭证到GitHub Secrets

将JupyterHub系统中的敏感凭证(如数据库密码、API密钥)添加到GitHub仓库的Secrets中(仓库设置→Secrets and variables→Actions),然后在工作流中通过环境变量传递给脚本:

在工作流中配置环境变量:

- name: 执行Notebook
  env:
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    API_KEY: ${{ secrets.API_KEY }}
  run: |
    papermill your_prod_notebook.ipynb output.ipynb -p db_pwd "$DB_PASSWORD" -p api_key "$API_KEY"

在Notebook中读取环境变量:

import os
db_password = os.environ.get("DB_PASSWORD")
api_key = os.environ.get("API_KEY")

方案B:保留凭证在JupyterHub(推荐远程执行场景)

如果不想转移凭证,采用场景B的远程执行方式,脚本直接使用JupyterHub系统中已存储的凭证(比如环境变量、本地配置文件),无需额外处理——因为脚本是在JupyterHub服务器上运行的。

GitHub Actions与JupyterHub的通信方式

  • 拉取式:将Notebook同步到GitHub,Actions在自己的runner环境中执行,通过Secrets传递凭证,适合环境可复制的场景。
  • 远程执行式:Actions通过SSH或JupyterHub API连接到服务器,直接在JupyterHub环境中运行脚本,适合依赖本地资源或不想转移凭证的场景。

内容的提问来源于stack exchange,提问作者cc_hey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:33:32