如何用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环境中执行,步骤如下:
- 从JupyterHub导出依赖列表(比如
pip freeze > requirements.txt或conda env export > environment.yml),提交到仓库。 - 在工作流中配置匹配的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连接到服务器执行脚本,避免环境不一致问题:
- 生成SSH密钥对,将公钥添加到JupyterHub服务器的
~/.ssh/authorized_keys文件中。 - 将私钥、服务器地址、用户名存入GitHub仓库的Secrets中。
- 在工作流中用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
相关产品推荐
相关产品推荐

