惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
博客园_首页
量子位
博客园 - 司徒正美
S
SegmentFault 最新的问题
J
Java Code Geeks
小众软件
小众软件
博客园 - 【当耐特】
The Register - Security
The Register - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
T
Tailwind CSS Blog
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
Cyberwarzone
Cyberwarzone
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
F
Full Disclosure
D
DataBreaches.Net
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
Check Point Blog
T
Threatpost
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
W
WeLiveSecurity
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
Last Week in AI
Last Week in AI
T
Tor Project blog
T
Troy Hunt's Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security Affairs
SecWiki News
SecWiki News

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(10)-利用Github Action 自动化部署 docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡 docker学习(8)-从 Windows 开发到 Linux 部署 docker学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子 docker学习(2)-安装 docker学习(1)-基本概念 github创建分支 + Pull Request 合并 Git Rebase vs Git Merge:深入理解与实战选择 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
Github 使用 Self-hosted Runner 实现服务器自动化部署
xiashengwang · 2026-04-15 · via 博客园 - xiashengwang

2026-04-15 17:54  xiashengwang  阅读(53)  评论()    收藏  举报

整体流程

  • 在服务器上使用 myoung34/github-runner 镜像运行自托管 Runner
  • 在 GitHub 仓库中配置 Secrets(Docker Hub 凭证)
  • 编写工作流文件:build-and-push 使用 ubuntu-latest 构建镜像并推送到 Docker Hub,deploy 使用 self-hosted 拉取镜像并运行容器

推送代码自动触发部署

第一步:在服务器上运行自托管 Runner

1.1 创建持久化目录

mkdir -p /home/runner/config_data

1.2 获取 GitHub Runner 令牌
打开你的 GitHub 仓库 https://github.com/你的用户名/flask-ci-demo

进入 Settings → Actions → Runners → New self-hosted runner

选择 Linux、x64,复制页面中显示的一次性令牌(例如 AABBCCDD...)

1.3 运行容器(使用 myoung34/github-runner)

docker run -d --name github-runner --restart always \
  -e REPO_URL="https://github.com/你的用户名/flask-ci-demo" \
  -e RUNNER_TOKEN="上面复制的令牌" \
  -e RUNNER_NAME="my-runner" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/runner/config_data:/runner/data \
  myoung34/github-runner:latest
  • RUNNER_LABELS="self-hosted,linux,x64,production" 这个可以带上标签,
    在deploy文件runs-on: [self-hosted,production]可以指定同时满足这些标签。是AND(与)的关系,这样可以区分不同的环境。
  • 这里一定要用myoung34/github-runner:latest这个三方集成镜像,用官方的镜像,浪费很多时间还不成功的。

1.4 验证 Runner 在线

docker logs github-runner

看到 Listening for Jobs 表示成功。回到 GitHub 仓库的 Runners 页面,状态应变为 Idle。
image

第二步:配置 GitHub Secrets

在仓库 Settings → Secrets and variables → Actions 中添加以下 Secrets:

Name Value
DOCKERHUB_USERNAME 你的 Docker Hub 用户名
DOCKERHUB_TOKEN 你的 Docker Hub Access Token(需有读写权限)

第三步:编写 GitHub Actions 工作流文件

在项目根目录下创建 .github/workflows/deploy.yml,内容如下:

name: Deploy Flask App to Server

on:
  push:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build-and-push:
    name: Build and Push Docker Image
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest

  deploy:
    name: Deploy to Server
    runs-on: self-hosted          # 关键:使用自托管 Runner
    needs: build-and-push
    steps:
      - name: Pull and run container
        run: |
          docker pull ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest
          docker stop flask-app || true
          docker rm flask-app || true
          docker run -d --name flask-app -p 5000:5000 ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest

说明:

  • build-and-push 任务在 GitHub 官方 Ubuntu 环境中运行(速度快,无需担心网络)
  • deploy 任务在您的自托管 Runner(服务器)上执行,直接拉取镜像并启动容器
  • 不再需要 appleboy/ssh-action,因为 Runner 已经运行在目标服务器上

第四步:提交并推送工作流文件

git add .github/workflows/deploy.yml
git commit -m "Add CI/CD with self-hosted runner"
git push origin main

推送后,GitHub Actions 会自动运行。您可以在 Actions 标签页观察:

  • build-and-push 任务在 ubuntu-latest 上构建并推送镜像
  • deploy 任务在您的服务器上拉取镜像并启动容器

第五步:测试自动化更新

修改本地 app.py 中的返回内容,例如:

    return f'{greeting} from Docker and CI! (Auto deployed with self-hosted runner)'

提交并推送:

git add app.py
git commit -m "Update message"
git push origin main

再次观察 Actions,完成后访问 http://你的服务器IP:5000 查看更新。