搭建Hexo博客

环境

  1. > node -v
  2. v16.15.0
  3. > npm -v
  4. 8.5.5

安装Hexo CLI

  1. # 在你的博客文件夹根目录下下执行
  2. npm install -g hexo-cli
  3. hexo init blogname
  4. cd blogname
  5. hexo s
  6. # 打开http://localhost:4000 即可浏览

安装主题hexo-theme-bamboo

hexo-theme-bamboo

我们不使用npm安装,直接将主题download到themes文件夹下

github安装

  1. git clone https://github.com/yuang01/hexo-theme-bamboo.git

gitee安装

  1. git clone https://gitee.com/yuang01/hexo-theme-bamboo.git

修改hexo根目录下的站点配置文件_config.yml,把主题改为hexo-theme-bamboo,通过主题文件夹下的config.yml配置主题即可,然后在\themes\hexo-theme-bamboo\删除.git文件夹

然后根据https://yuang01.github.io/或者作者博客地址来配置对应的样式或者widget

修改博客名称等信息

_config.yml\themes\hexo-theme-bamboo\_config.yml中将自己博客名称、网址信息等进行替换

添加github action发布

1. 在github中创建自己的博客仓库

然后在Settings/Secrets/ActionsNew repository secret , 其中docker信息是在阿里云容器仓库中创建了一个个人实例(创建之后需要去/个人实例/访问凭证设置固定密码),当然,你也可以使用其他的docker仓库,不过第2步的Login to Aliyun Container Registry (ACR)需要进行修改

2. 设置Secrets

表格

Name Value 说明 举例
DOCKER_USERNAME your docker username docker仓库登陆用户名 spatxos
DOCKER_PASSWORD your docker pwd docker仓库固定密码 spatxospwd
HOST your server ip 服务器IP 101.10.11.121
HOST_USERNAME your server username 服务器ssh登陆账户名 spatxosdocker
HOST_PASSWORD your server pwd 服务器ssh登陆密码 spatxosdockerpwd
HOST_PORT your server ssh port 服务器ssh端口 22
DOCKER_REGISTRY docker registry docker仓库地址 registry.cn-hongkong.aliyuncs.com
DOCKER_REGISTRY_REGION docker registry region id docker仓库区域id cn-hongkong
CNBLOGS_ISDOWN Whether to pull blogs from cnblogs 本次执行是否从cnblogs拉取博客 true或false
CNBLOGS_COOKIE cnblogs of cookie cnblogs的cookie __gads=ID=bbfxxxxxxxxxx
BLOG_NAME blog of name 博客的名称,发布到docker或者服务器上创建的文件夹都将使用这个 spatxos

3. 在/.github/workflows/下添加一个yml文件,可以进行自定义

我写好了一个yml,是将hexo发布到阿里云的docker仓库,然后进行服务器部署,后期将会添加发布到github pages的yml

  1. name: Build Docker Image
  2. on:
  3. push:
  4. tags:
  5. - "v*.*.*" # 后面每次更新提交,只有打上tag之后才会进行发布更新,减少actions执行次数
  6. workflow_dispatch:
  7. jobs:
  8. build:
  9. env:
  10. CNBLOGS_ISDOWN: ${{secrets.CNBLOGS_ISDOWN}}
  11. CNBLOGS_COOKIE: ${{secrets.CNBLOGS_COOKIE}}
  12. runs-on: ubuntu-latest
  13. steps:
  14. - name: Checkout source
  15. uses: actions/checkout@v2
  16. with:
  17. ref: master
  18. - name: Setup Node.js
  19. uses: actions/setup-node@v1
  20. with:
  21. node-version: '16.15.0'
  22. - name: Set up Go 1.18.3
  23. if: ${{ env.CNBLOGS_ISDOWN == 'true' }} # 是否从博客园下载,可通过更改CNBLOGS_ISDOWN的值进行提交时的下载控制
  24. uses: actions/setup-go@v1
  25. with:
  26. go-version: 1.18.3
  27. id: go
  28. - name: Pull blogs from cnblogs
  29. if: ${{ env.CNBLOGS_ISDOWN == 'true' }} # 是否从博客园下载,可通过更改CNBLOGS_ISDOWN的值进行提交时的下载控制
  30. run: |
  31. cd source/_posts/
  32. echo $env.CNBLOGS_COOKIE |wc -L
  33. echo ${{env.CNBLOGS_COOKIE}} |wc -L
  34. go run downmyblogs.go -cookie ${{env.CNBLOGS_COOKIE}}
  35. ls -la
  36. - name: Setup Hexo
  37. run: |
  38. npm install hexo-cli -g
  39. npm install hexo-generator-search --save
  40. npm install hexo-generator-feed --save
  41. npm i hexo-wordcount
  42. npm install
  43. # get image tag name
  44. - name: Get Image Tag Name
  45. run: |
  46. if [ x${{ github.event.inputs.tag }} == x"" ]; then
  47. echo "TAG_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
  48. else
  49. echo "TAG_NAME=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
  50. fi
  51. - name: Login to Aliyun Container Registry (ACR)
  52. uses: aliyun/acr-login@v1
  53. with:
  54. login-server: "${{ secrets.DOCKER_REGISTRY }}"
  55. region-id: "${{ secrets.DOCKER_REGISTRY_REGION }}" # 3
  56. username: "${{ secrets.DOCKER_USERNAME }}"
  57. password: "${{ secrets.DOCKER_PASSWORD }}"
  58. - name: Deploy and Build Image
  59. run: |
  60. hexo clean
  61. hexo deploy
  62. ls -la
  63. pwd
  64. docker build -t "${{ secrets.DOCKER_REGISTRY }}/${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}}" -f Dockerfile .
  65. - name: Push Image
  66. run: |
  67. docker images
  68. docker push "${{ secrets.DOCKER_REGISTRY }}/${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}}"
  69. # Docker 自动部署
  70. deploy-docker:
  71. needs: [build]
  72. name: Deploy Docker
  73. runs-on: ubuntu-latest
  74. steps:
  75. # get image tag name
  76. - name: Get Image Tag Name
  77. run: |
  78. if [ x${{ github.event.inputs.tag }} == x"" ]; then
  79. echo "TAG_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
  80. else
  81. echo "TAG_NAME=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
  82. fi
  83. - name: Deploy
  84. uses: appleboy/ssh-action@master
  85. with:
  86. host: ${{ secrets.HOST }} # 服务器ip
  87. username: ${{ secrets.HOST_USERNAME }} # 服务器登录用户名
  88. password: ${{ secrets.HOST_PASSWORD }} # 服务器登录密码
  89. port: ${{ secrets.HOST_PORT }} # 服务器ssh端口
  90. script: |
  91. docker info
  92. echo $(docker ps -aqf "name=${{secrets.BLOG_NAME}}-blog")
  93. docker stop $(docker ps -aqf "name=${{secrets.BLOG_NAME}}-blog")
  94. docker container rm ${{secrets.BLOG_NAME}}-blog
  95. docker rmi ${{secrets.BLOG_NAME}}-blog
  96. echo 查看是否成功删除${{secrets.BLOG_NAME}}-blog
  97. docker ps -a
  98. echo harbor拉取docker镜像
  99. chmod 777 /root/${{secrets.BLOG_NAME}}-blog/html/
  100. docker pull ${{ secrets.DOCKER_REGISTRY }}/${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}}
  101. docker tag ${{ secrets.DOCKER_REGISTRY }}/${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}} ${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}}
  102. docker run -it --rm -d -p 80:80 --name ${{secrets.BLOG_NAME}}-blog ${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog
  103. docker cp ${{secrets.BLOG_NAME}}-blog:/usr/share/nginx/html /root/${{secrets.BLOG_NAME}}-blog/html
  104. docker system prune -f
  105. echo docker容器启动成功

另一种办法,直接fork

现在我已经把仓库创建好并且上传到了github,仓库地址https://github.com/spatxos/spatxos-blog,可以直接进行fork,然后去阿里云容器仓库中创建一个个人实例,购买或者使用一个云服务器,在github仓库中填写一下Secrets表格中Secrets即可

从博客园拉取之间创建的博客到新建的hexo

在Secrets表格中设置好CNBLOGS_ISDOWNtrue,然后去登陆博客园,F12,随便找一个xhr类型的请求,查找对应的cookie,然后到/source/_posts下执行一下go run convertcnblogbookie.go -cookie "替换成你的cookie"将会获得一个输出的新cookie,将新的cookie作为CNBLOGS_COOKIE的value写入进去(github action中使用secrets时,不能包含某些特殊字符,否则会被截断,所以这次执行其实是对特殊字符的替换,后面拉取博客时再替换回来)

在每次执行提交时,将会把docker里面的hexo静态页面映射到服务器的/root/${{BLOG_NAME}}-blog/html文件夹下,首次拉取博客园的文章之后,如何博客园文章未进行更新,我们可以更改一下CNBLOGS_ISDOWNfalse,那么就不会从博客园拉取了,原本的文件还会存在,不会进行覆盖

遇到的问题

1.阿里云登陆和docker push 时tag错误,问题描述参见docker tag error,解决办法参见GitHub Actions持续集成阿里云容器镜像服务(ACR),我后面这么写的

docker build -t "${{ secrets.DOCKER_REGISTRY }}/${{secrets.BLOG_NAME}}/${{secrets.BLOG_NAME}}-blog:${{env.TAG_NAME}}" -f Dockerfile .

2.go传入参数和secrets截断问题

  1. go传入参数使用conf来做,secrets截断问题通过先替换掉会截断的字符,然后使用时替换回去

博客github地址

使用github action发布hexo博客到云服务器的更多相关文章

  1. 如何优雅地发布Hexo博客

    前言 就目前而言,我所知道的发布Hexo的博客有如下几种: 1.原始方式,也就是在服务器上编写md文件,然后利用hexo g来生成,详见:hexo从零开始到搭建完整: 2.利用github+hook来 ...

  2. 使用 GitHub Actions 实现 Hexo 博客自动部署

    一.Hexo 相关知识点 静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步: hexo clean hexo g -d // 相当于 hexo g + hexo d 如果考虑到同步源文件,还需要 ...

  3. 在Github上面搭建Hexo博客(一):部署到Github

    什么是Hexo Hexo是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在Github和Heroku上.并且有很多人为其制作了很多优秀的主题(theme),你可以根据自己的喜好进行设 ...

  4. 在github上搭建hexo博客

    准备工作 安装git 系统是win10家庭版,采用git v1.9.5版本,比较简单,一路next直到finsh完成安装. 安装node.js hexo是基于node.js驱动的一款快速.简单且功能强 ...

  5. github page 配置hexo 博客 的常见错误

    缘起 最近看到好多的公众号作者推荐大家搭建自己的博客,自己手痒也搭建了一个个人博客lumang,具体过程就是一开始上网搜索一番教程,按照教程开始搭建,由于是windows的环境,同时教程也有很多的老旧 ...

  6. GitHub上搭建私人hexo博客操作教程

    GitHub上搭建hexo博客 安装GitGit:主要用于上传博客页面到github和命令操作安装NodeNode.js:Hexo的运行环境安装HexoHexo:博客程序打开安装Git后的生成的右键菜 ...

  7. [Node.js] 3、搭建hexo博客

      一.安装新版本的nodejs和npm 安装n模块: npm install -g n 升级node.js到最新稳定版 n stable   二.安装hexo note: 参考github,不要去其 ...

  8. w10环境下Hexo博客搭建

    w10使用hexo+github手把手搭建自己的第一个博客 对一个程序员来说,博客的重要性不言而喻,不但可以积累知识,还可以更好的给别人分享自己的心得.今天就以时下比较流行的hexo博客搭建属于自己的 ...

  9. Hexo博客(Snail主题)搭建回顾概览

    Hexo博客(Snail主题)搭建回顾概览 笔者搭建博客地址:https://saltyfishyjk.github.io 目录 Hexo博客(Snail主题)搭建回顾概览 Part 0 前言 写作背 ...

随机推荐

  1. 修改Docker容器默认时区

    运行docker容器默认时区为0区 # 运行一个nginx服务器 docker run -d -p 80:80 --name nginx nginx # 进入容器shell docker exec - ...

  2. 好客租房25-react中的事件处理(事件对象)

    3.2事件对象 可以通过事件处理程序的参数 React中的事件对象叫做:合成事件(对象) 合成事件:兼容所有浏览器 //导入react     import React from 'react'   ...

  3. Fail2ban 配置详解 监禁配置(jail.conf)

    ### # 包含配置 ### [INCLUDES] # after = # 在加载本配置文件之后再加载指定的独立配置文件. before = paths-debian.conf # 在加载本配置文件之 ...

  4. JNPF移动办公解决方案

    市场背景 随着办公自动化系统的普及,电子化.数据化的办公方式已进入越来越多的企业和政府单位,信息化的办公系统在企事业内部编织起一套高效.畅通的信息互联体系,极大推动了企事业单位生产力的发展.但与此同时 ...

  5. 联发科 (MTK) sensor bring up

    MT6768平台 1.添加驱动文件 2.添加硬件配置支持 3.添加硬件配置 4.添加编译配置 5.分配空间(非必要,当代码量超过当前空间大小时将会报错,根据报错log改大小即可.) 6.兼容配置 7. ...

  6. Spring bean到底是如何创建的?(上)

    前言 众所周知,spring对于java程序员来说是一个及其重要的后端框架,几乎所有的公司都会使用的框架,而且深受广大面试官的青睐.所以本文就以常见的一个面试题"spring bean的生命 ...

  7. JS基础6--逻辑运算符

     &&与  ||或   !非      如果对一个值进行两次取反,它不会变化      如果对一个非布尔值进行取反,则会将其转换为布尔值,再取反      所以我们可以利用该特点.来将 ...

  8. Jmeter基础入门应用举例

    举例当然应该有接口下面以常用的百度搜索接口为例: 1.接口地址: http://www.baidu.com/s?ie=utf-8&wd=jmeter性能测试 2.请求参数 ie:编码方式,默认 ...

  9. 介绍python和库文件管理

    一.Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读:Python代码定义的更清晰. 3.易于维护:Python的成功 ...

  10. 【NOIP2017 提高组正式赛】列队 题解

    题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...