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

推荐订阅源

Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LangChain Blog
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园_首页
T
Tailwind CSS Blog
P
Proofpoint News Feed
雷峰网
雷峰网
D
Darknet – Hacking Tools, Hacker News & Cyber Security
IT之家
IT之家
V
Vulnerabilities – Threatpost
阮一峰的网络日志
阮一峰的网络日志
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs
S
Schneier on Security
Security Archives - TechRepublic
Security Archives - TechRepublic
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
The Register - Security
The Register - Security
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
Project Zero
Project Zero
博客园 - 叶小钗
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
Latest news
Latest news
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
L
LINUX DO - 最新话题
Google DeepMind News
Google DeepMind News
P
Privacy International News Feed
I
InfoQ
F
Fortinet All Blogs
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Threatpost
T
Tenable Blog
B
Blog RSS Feed

文章列表 - 她和她的猫

使用小鹤双拼一个月 折腾 Hugo PaperMod 主题 去长鹿旅游休博园 1Password 自动化登录堡垒机 深入 Hyperf:Inject 注解是如何工作的? 译|理解容器镜像层 使用 Rust 实现高性能预写日志(Write Ahead Log) 译|使用 Linux 命名空间隔离系统 深入 Hyperf:HTTP 服务是如何处理请求的? Linux 文件权限学习笔记 译|了解 Bitcask:基于日志结构的 KV 存储引擎 还原 SM2 压缩公钥的几种方法 深入 Hyperf:HTTP 服务启动时发生了什么? 一次 Hyperf 注解失效问题分析 将博客迁移到又拍云 译|PHP 7 新的 Hashtable 实现 排查 ES 查询问题:深入了解 json_encode() 函数 浅析 Redlock 分布式锁实现原理 Yar 源码阅读笔记:RPC 服务端 Yar 源码阅读笔记:客户端的并行调用 Yar 源码阅读笔记:客户端的同步调用 Yar 源码阅读笔记:数据传输模块 Yar 源码阅读笔记:消息编码模块 Yar 源码阅读笔记:RPC 通信协议 Yar 源码阅读笔记:开篇 PHP 8 新特性介绍 基于 OpenSSL 实现国密 SM4 加解密 PHP 源码阅读笔记:编译与调试 PHP 什么是惊群问题 大端模式和小端模式 基于 GitHub Actions 定时推送网址到百度站长平台 聊聊五种 I/O 模型 Workerman 源码分析:文件上传 浅入浅出 HTTP 协议 PHP 网络编程:构建 MySQL 蜜罐获取攻击者微信 ID 使用 Workerman 接入 Bilibili 直播弹幕协议 什么是二进制安全 【转载】PHP 程序员进阶之路 优化 Workerman 检查主进程是否存活的逻辑 基于 Redis 实现分布式锁 《PHP 实现 Base64 编码/解码》笔记 PHP 多进程下载必应壁纸 基于 Redis 实现延迟队列 【转载】PHP 实现 Base64 编码/解码 使用 MySQL FIELD() 函数自定义排序规则 Laravel 的 Facades 实现原理 C语言单链表实现约瑟夫环 数据结构学习笔记:顺序栈和链栈(C语言) 使用 QueryList + Redis 下载壁纸 在 Laravel 登录/注册中使用 mews/captcha 扩展包 使用 mews/captcha 扩展包为 Laravel 应用添加图片验证码 给 YOURLS 短网址系统编写插件《批量生成短网址》 给 YOURLS 短网址系统编写插件《Hello World!》 PHP 7.1 使用 json_encode 函数造成浮点类型数据出现精度问题 Laravel 授权策略(Policy)的基本使用 Ubuntu 系统下 WiFi 频繁掉线解决方法 Laravel 应用部署到 Nginx 服务器上的第一个坑 Ubuntu 16.04 LST 安装 Redis 和 Composer PHP 采集逐浪小说章节列表 Nginx 环境 SSL 强制 HTTP 301 跳转到 HTTPS 【工作&生活】第一周 ServiceStack.Redis 与多线程 Count the number of Duplicates C# Base64 加密及解密 ASP.NET MVC 使用动态类型传递数据 Django 使用 order_by() 对数据进行排序操作 ASP.NET + jQuery + AJAX 实现用户登录 ASP.NET 从客户端中检测到有潜在危险的 Request.Form 值 ASP.NET 使用 FormData 实现 AJAX 上传图片 Python 使用 BeautifulSoup 抓取网页 贪心算法之字符串的完美度 一言不和就造轮子之 CookieHelper ASP.NET 上传图片 DBHelper 类 C# 捕获屏幕源码 用 JavaScript 做一些有趣的事情 第一篇文章 好久不见。 如何防止非法调用 PHP 文件 清明小记。 PHP 生成随机字符串 Z-Blog PHP 程序做 301 跳转 PHP 处理数组常用的几个函数 Sublime Text 3 快捷键总结 PHP 使用 file_get_contents() 函数实现采集网页 使用 C# 编写学生信息管理系统 终于到了。 zblog报错: magic_quotes_gpc 和 safe_mode 世事无常。 如何使用 PHP 上传文件 安卓手机编写和运行 PHP 程序的软件 使用 AJAX 刷新、验证 PHP 图片验证码 PHP 生成图片验证码 PHP 之 session 的使用方法 PHP 之 cookie 的使用方法 PHP 实现分页原理详解 Thinkphp 框架中系统常量在 Js 文件中不解析的解决方法
使用 GitHub Actions 自动部署 Hexo
她和她的猫 · 2021-03-30 · via 文章列表 - 她和她的猫

目前部署 Hexo 的操作比较麻烦,先在本地执行 hexo clean && hexo d 生成博客静态文件并发布到 GitHub 上,然后通过 XShell 登录到服务器,切换到博客站点目录下 git pull 拉取最新的代码,最近网络也不太不稳定,拉取代码也经常超时,更新的时候还得看运气。

有两种方案可以自动更新:GitHub WebHook 和 GitHub Actions。

WebHook 是一种比较简单且常见的方式,在仓库配置一个回调地址并指定需要回调的事件类型即可。

比如指定了 push 事件,往该仓库 push 代码时,GitHub 就会请求配置的回调地址并携带一些信息,通过这些信息就可以检查请求是否合法、是哪个仓库的谁提交了代码,从而决定是否需要更新服务器端的代码。

详情可以看官方的文档:https://docs.github.com/cn/developers/webhooks-and-events/about-webhooks

Actions 是 GitHub 新推出来(快两年,也不算新了)的一种持续集成的方案,将上面这些操作变成一个个的任务(Job)组成工作流,当发生指定事件后触发该工作流,也可以用别人写好的工作流。

更详细的内容可以看 官方文档 和阮老师的 GitHub Actions 入门教程

话不多说,直接贴 GitHub Actions 的配置。

# 工作流的名称
name: Hexo Blog CI

# 指定触发的条件,这里是打标签才触发该工作流,你也可以改成 on: push,只要提交代码就触发
on:
  push:
    tags:
    - 'v*'

jobs:
  build: 
    runs-on: ubuntu-latest 
        
    steps:
    
    # 检查工作流是否可以访问 actions
    - name: Checkout Repository master branch
      uses: actions/checkout@master 
      
    # 安装 NodeJs
    - name: Setup Node.js 12.x 
      uses: actions/setup-node@master
      with:
        node-version: "12.x"
    
    # 安装 Hexo 的依赖库
    - name: Setup Hexo Dependencies
      run: |
        npm install hexo-cli -g
        npm install
    
    # 设置 Hexo 部署的私钥
    - name: Setup Deploy Private Key
      env:
        HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
      run: |
        mkdir -p ~/.ssh/
        echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa 
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan github.com >> ~/.ssh/known_hosts
    
    # 设置 Git 信息
    - name: Setup Git Infomation
      run: | 
        git config --global user.name "Git 用户名" 
        git config --global user.email "Git 邮箱"

    # 部署 Hexo 静态文件到博客所在的分支
    - name: Deploy Hexo 
      run: |
        hexo clean
        hexo generate 
        hexo deploy

    # 部署到服务器
    - name: Deploy Server
      uses: appleboy/ssh-action@master
      env: 
        SITE_DIR: 站点目录(如:/var/www/blog
      with:
        host: ${{ secrets.SERVER_IP }}
        port: ${{ secrets.SERVER_PORT }}
        username: ${{ secrets.SERVER_USERNAME }}
        key: ${{ secrets.SERVER_PRIVATE_KEY }}
        envs: SITE_DIR
        script: |
          cd $SITE_DIR
          sudo git config --global pull.rebase true
          sudo git pull origin master --allow-unrelated-histories

其中 Git 用户名Git 邮箱站点目录 都要替换成你自己的。

首先打开 https://github.com/用户名/仓库名/settings/secrets/actions 新增几个 Action secret,在上面的执行工作流的时候会用到。

需要新增以下几项:

NameValue
SERVER_IP服务器 IP
SERVER_PORT服务器端口号
SERVER_USERNAME用户名
SERVER_PRIVATE_KEY服务器私钥(服务器的 ~/.ssh/id_rsa)
HEXO_DEPLOY_PRIVATE_KEY部署私钥(本地的 ~/.ssh/id_rsa)

前三项就不多说,主要讲下后面两项怎么设置。

HEXO_DEPLOY_PRIVATE_KEY 是为了在工作流中能够提交代码到 GitHub,SERVER_PRIVATE_KEY 是为了能在工作流中登录到服务器上执行命令。

工作流被触发后,先生成博客的静态文件,并通过 hexo deploy 提交到博客所在的分支(由 Hexo 配置文件中的 deploy.branch 指定),这里涉及到提交代码,所以要配置 SSH Key。

查看电脑上是否已经生成了密钥对。

$ ll ~/.ssh
# 输出: id_rsa  id_rsa.pub  known_hosts

如果为空则执行以下命令,一路回车就可以了:

$ ssh-keygen -t rsa -C "你的邮箱"

这时候电脑上就会有两个文件:~/.ssh/id_rsa、~/.ssh/id_rsa.pub,分别是是私钥和公钥。

id_rsa 文件的内容就是 HEXO_DEPLOY_PRIVATE_KEY 的 Value。

然后打开 https://github.com/settings/ssh/new,将 id_rsa.pub 的内容填到 Key 里面,Title 可以随便去,然后保存。

接下来就是 SERVER_PRIVATE_KEY,登录到服务器拿到密钥对,步骤跟上面差不多,没有的话就生成。

服务器中 ~/.ssh/id_rsa 文件的内容就是 SERVER_PRIVATE_KEY 的 Value,然后将 ~/.ssh/id_rsa.pub 的内容追加到 ~/.ssh/authorized_keys 文件中。

需要注意:

  • 服务器中必须已经存在 SITE_DIR 目录,且已经将仓库 clone 下来了。
  • 在服务器上可以免密执行 git pull。

更新博客时只需要打标签,然后将标签推送到云端就会触发工作流。

$ git tag v1.0.0
$ git push origin v1.0.0

GitHub Actions Log