在使用Hugo发布个人博客内容时,每次都需要将写好的md文件拷贝到contents/posts目录下,图片等静态资源拷贝到static目录下,然后还需要人工执行hugo命令,比较麻烦,而且写好的md文件也不易管理。鉴于以上问题,我们可以使用git管理博客文件,然后使用jenkins自动发布博客。

创建Git项目

我们可以在gitee(开源中国)或者是github上创建博客项目,至于git如何使用,怎么在上述平台创建项目不在本文的讨论范围以内,读者可以自行解决。

配置Jenkins项目

Jenkins的安装也不在本文的讨论范围内,读者可自行解决安装问题。

创建一个自由风格的Jenkins项目

自由风格

配置内容来源

由于我们使用git进行源文件的管理,所以Source Code Management配置中我们选择Git。然后分别配置 Repository URL`,Credentials,Branch Specifier` 这三项内容:

Source Code Management

Repository URL 表示我们的git项目路径。

Credentials 表示我们访问git项目的凭证,此项我们需要在凭据->系统下添加域,并配置域的访问凭证。

添加域

填写完成域名称以及描述之后会出现如下页面:

配置域凭证

需要填写用户名和密码,其他保持默认就可以了。如果我们使用的是gitee,就需要填入gitee的账号、密码了。

配置好访问凭证之后,在Credentials的选择框里就会出现刚才配置的域名称了。

Branch Specifier 表示我们使用哪个分支作为内容来源。当出发构建时,会从这个分支下拉去内容。

配置构建触发机制

常见的构建触发机制包括定时,人工,远程钩子等,这里我们选择远程钩子触发,这种方式需要git平台支持。

Auth Token

Authentication Token表示触发钩子需要的凭证,这里可以随便填一个字符串,此字符串在配置gitee平台时会用到。接下来我们配置gitee平台:

web hook

URL根据Jenkins平台的地址进行配置,Token和Password需要填写之前在Jenkins平台里配置的Authentication Token字段。

配置构建环境

Build Envirement

SSH Server需要我们先配置需要远程连接的服务器(也就是最终博客文件存在的服务器)。向服务器上传文件我们需要通过Publish over SSH插件来实现,读者可以自行安装,安装完成后在Jenkins的全局配置中做如下配置:

Publish over SSH

Passphrase填写服务器的登录密码

SSH Servers.Name填写服务器的名称

SSH Servers.Hostname服务器IP地址

SSH Servers.UserName登录服务器使用的用户名,需要和上边的密码配套。

SSH Servers.Remote Directory文件存在目录,上传来的文件都会放置在这个目录下。

Transfers.Source files通过通配符配置需要传输的文件,这里我们配置为**表示传输所有内容。

Transfers.Remote directory 文件存放的路径,相对于SSH Servers.Remote Directory里配置的路径。

发布博客

这里我们选择通过ssh远程执行脚本的方式发布博客:

remote script

SSH site这里的远程服务器需要提前在Jenkins的全局配置里配置,配置内容如下:

Remote Server

Hostname 远程服务器的IP地址

Port SSH链接需要的端口,一般为22

Credentials 登录凭证,需要参考上边的方式配置域,然后配置域访问凭证。

Command 需要执行的命令,这里我们选择执行脚本/home/ubuntu/scripts/blog.sh,命令如下:

sh /home/ubuntu/scripts/blog.sh

blog.sh脚本的内容如下:

#!/bin/bash
echo "start publish..."
echo "remove old posts md files"
rm -rf /websitepath/content/posts/*.md
cd /home/ubuntu/temp/blog
echo "copy new md files to posts"
cp -rf ./*.md /websitepath/content/posts
echo "copy images to static/images"
cp -rf ./images/* /websitepath/static/images
cd /websitepath
echo "publish website"
/home/ubuntu/software/hugo/hugo
echo "publish end."

基本流程就是拷贝md和图片资源文件,然后执行hugo发布博客。详细过程可以参看echo的输出内容。

websitepath为实际的Hugo项目目录

错误解决方法

在整个流程中遇到了两个异常,异常内容以及解决方法如下:

1.[Jenkins]Error:403 No valid crumb was included in the request

错误的原因是因为 jenkins 默认安全设置里面开启了防止款站点请求伪造, 取消勾选这一项就可以了,位置: Jenkins > 全局安全配置 > CSRF Protection

csrf

2.Error 403 Authentication required

<!--
You are authenticated as: anonymous
Groups that you are in:
Permission you need to have (but didn't): hudson.model.Hudson.Read
... which is implied by: hudson.security.Permission.GenericRead
... which is implied by: hudson.model.Hudson.Administer
-->

错误的原因是因为 jenkins 默认安全设置里面不允许匿名用户进行任何操作,允许就可以了, 位置: Jenkins > 全局安全配置 > Enable security > Allow anonymous read access

csrf