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

推荐订阅源

Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
博客园_首页
U
Unit 42
T
Tailwind CSS Blog
G
GRAHAM CLULEY
F
Full Disclosure
V
Vulnerabilities – Threatpost
T
Tenable Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
K
Kaspersky official blog
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
P
Proofpoint News Feed
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
罗磊的独立博客
S
Security Affairs
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
美团技术团队
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
Visual Studio Blog

博客园 - 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 查看更新。