Fork me on GitHub

Hexo 使用 jenkins 自动部署到阿里云

## 摘要
本文基于本地已搭建好了 hexo+github pages 的环境下使用 Jenkins 构建持续集成到自己的阿里云服务器上,实现本地发布博客后同时部署到 GitHub 和个人的阿里云服务器上。

虽说利用 github pages 服务能够对外发布博客,但是作为一个码农还是希望有自己的域名博客,但是我比较懒,不想手动发布博客。我想自动化地既发布到 github 也能同时发布到个人网站。所以决定采用 CICD 的方法,CICD 工具使用开源的 jenkins,jenkins 也搭建在阿里云个人服务器上。

其他的 CI 方法:

使用 Git Hook 自动部署 Hexo 到个人 VPS

配合 TRAVIS CI,将 HEXO 博客自动部署到你的服务器上

注:个人觉得使用 Travis 不太方便,还是 Jenkins 的 WEB 页面配置来得直观,纯属个人观点

下载并运行 jenkins

注意端口使用的是默认 8080

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins

安装完成之后运行如下命令启动

systemctl start jenkins

git 环境搭建

git 安装

参考资料:

廖雪峰老师的 git 教程

git 官网下载

生成 ssh 认证,执行如下命令

参考资料:

Git 提交时报错 warning: LF will be replaced by CRLF in

git config --global user.name "yourname"
git config --global user.email youremail@example.com
ssh-keygen -t rsa -C "youremail@example.com"
git config --global core.autocrlf false  // 禁用自动转换,这个不设置后面上传时会出现警告,如下

最后获取到的 ssh 认证在 C:\Users\yourname\.ssh

服务器端配置

搭建远程 Git 私库

1. 登录到远程服务器,建议使用Xshell 5

2. 安装 git,执行如下命令

git --version // 如无,则安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install -y git

3. 创建用户并配置其仓库,执行如下命令

参考资料:

使用 Git Hook 自动部署 Hexo 到个人 VPS

useradd git
passwd git // 设置密码
su git // 这步很重要,不切换用户后面会很麻烦
cd /home/git/
mkdir -p projects/blog // 项目存在的真实目录
mkdir repos && cd repos
git init --bare blog.git // 创建一个裸露的仓库
cd blog.git/hooks
vi post-receive // 创建 hook 钩子函数,输入了内容如下(原理可以参考上面的链接)


#!/bin/sh
git --work-tree=/home/git/projects/blog --git-dir=/home/git/repos/blog.git checkout -f

添加完毕后修改权限,执行如下命令

chmod +x post-receive
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

4. 测试 git 仓库是否可用,在 Windows 端另找空白文件夹,执行如下命令

git clone git@server_ip:/home/git/repos/blog.git

如果能把空仓库拉下来,就说明 git 仓库搭建成功了

5. 建立 ssh 信任关系,在本地电脑,执行如下命令

参考资料:

ssh-copy-id 帮你建立信任

ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip
ssh git@server_ip // 测试能否登录

注:此时的 ssh 登录 git 用户不需要密码!否则就有错,请仔细重复步骤 3-4

6. 如果第 5 步能成功,为了安全起见禁用 git 用户 的 shell 登录权限,从而只能用 git clone,git push 等登录,执行如下命令

参考资料:

Git Server - 限制 Git 用户使用 SSH 登陆操作

cat /etc/shells // 查看 `git-shell` 是否在登录方式里面,有则跳过
which git-shell // 查看是否安装
vi /etc/shells
添加上 2 步显示出来的路劲,通常在 /usr/bin/git-shell

修改 /etc/passwd 中的权限,将原来的

git:x:1000:1000::/home/git:/bin/bash

修改为

git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell

搭建 nginx 服务器

1. 下载并安装 nginx,执行如下命令

参考资料:

Nginx 源码安装和简单的配置

Nginx 配置 HTTPS 服务器

cd /usr/local/src
wget http://nginx.org/download/nginx-1.15.2.tar.gz
tar xzvf nginx-1.15.2.tar.gz
cd nginx-1.15.2
./configure // 如果后面还想要配置 SSL 协议,就执行后面一句!
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make && make install
设置开机自启动
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid 
ExecStartPre=/usr/local/nginx/sbin/nginx -t 
ExecStart=/usr/local/nginx/sbin/nginx 
ExecReload=/bin/kill -s HUP /usr/local/nginx/logs/nginx.pid 
ExecStop=/bin/kill -s QUIT /usr/local/nginx/logs/nginx.pid 
PrivateTmp=true 

[Install] 
WantedBy=multi-user.target


启动 nginx
systemctl enable nginx.service
systemctl restart nginx.service
systemctl status nginx.service
ss -lntup

2. 配置 nginx 文件

参考资料:

Linux 中 nginx 基本操作命令

先启动是否安装成功,执行如下命令

nginx // 直接来!浏览器查看 server_ip,默认是 80 端口

配置文件,执行如下命令

nginx -s stop // 先停止 nginx
cd /usr/local/nginx/conf
vi nginx.conf
修改 root 解析路径,如下图
同时将 user 改为 root 如下图,不然 nginx 无法访问 /home/git/project/blog
nginx -s reload

参考:

带你跳过各种坑,一次性把 Hexo 博客部署到自己的服务器

配置 jenkins

在 jenkins 页面提示目录中找到默认密码,输入 jenkis 域名,登陆 jenkins。

安装 jenkins 社区推荐的插件

注意:到这一步会有一个坑,简直是神坑,因为 Jenkins 自身的原因,导致默认安装一到这一步就会报错:Jenkins 是离线状态,这是因为伟大的墙导致的。具体解决方法可以看我的另一篇博客:

jenkins 实例似乎已离线问题

配置 github

获取 sercret text

登陆 github 网站,进入 github->Settings->Developer settings-> Generate new token,点击生成完毕一定记录下下面的secret text
secret text 一定要记住,忘记的话只能重新生成。

GitHub webhooks 设置

进入 GitHub 上指定的项目(hexo 仓库) –> setting --> WebHooks&Services --> add webhook –> 输入刚刚部署 jenkins 的服务器的 IP

图片中标红区域是变化的,后缀都是一样的为github-webhook

jenkins 中的 github 配置

配置 GitHub Plugin

系统管理 –> 系统设置 –> GitHub –> Add GitHub Sever

API URL 输入 https://api.github.comCredentials点击 Add 添加,Kind选择Secret Text, 具体如下图所示。

设置完成后,点击Test Connection, 提示Credentials verified for user UUserName, rate limit: xxx, 则表明有效。

创建一个 freestyle 任务

    1. General 设置

填写 GitHub project URL, 也就是你的项目主页 eg.
https://github.com/your_name/your_repo_name

项目名称自定义。

    1. 配置源码管理

这里有几点要注意:
(1)要加入一个有写权限的账号,点击 Add 后选择创建用户

创建完需要去 系统管理 --- 全局安全配置 ---- 项目矩阵授权策略 里分配用户需要的写权限。

具体可以参考:

jenkins 配置记录(1)–添加用户权限

(2)要监听的 Branch 根据自己需要填写

    1. 构建触发器,构建环境

    1. 构建

构建脚本

将上图的构建脚本替换如下:

cd /var/www/blog(hexo 目录)
git pull
hexo clean
hexo g -d
    1. 构建后操作

    1. 构建前 clone hexo

将 hexo 初始代码拉取到 /var/www/blog 目录中,以后 jenkins 会监控 github 的 push 操作,一旦发现 push 会自动更新。

cd /var/www

git clone https://github.com/dumingcode/dumingcode.github.io.git blog

nginx 反向代理 hexo

hexo 为静态网站,所以直接用 nginx 反向代理即可,nginx 脚本如下:注意 root 指向的是 hexo 部署目录。

server
{
listen 80;
server_name blog.buyasset.club;
index index.html index.htm index.php default.html default.htm default.php;
root  /var/www/blog;  

#error_page   404   /404.html;
location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf)$
{
    access_log   off;
    expires      1d;
}

location ~ .*\.(js|css|txt|xml)?$
{
    access_log   off;
    expires      12h;
}

location / {try_files $uri $uri/ =404;}

}

测试 CICD 效果

进入本地 hexo 目录,修改发布的博客,然后执行 hexo g -d,登陆 jenkins 发现 jenkins 已经获取到了 push 操作,并且执行了自动构建任务。以下为 jenkins 的变更记录

Site updated: 2018-04-21 13:35:51 (commit: 76f3c53) (details)
Commit 76f3c530d077782fd66a8ca375afaa17cd188286 by duming
Site updated: 2018-04-21 13:35:51
 (commit: 76f3c53)

当配置完成测试构建时如果碰到 Jenkins 控制台报错:error: cannot open .git/FETCH_HEAD: Permission denied, 可先登录服务器查看 .git/FETCH_HEAD 文件的权限是否正确,

我最后的解决方法是:

[root@blog var]# cd /var/www/
[root@blog www]# ll
total 4
drwxr-xr-x 17 root root 4096 Sep 30 15:04 blog
[root@blog www]# chown -R jenkins.jenkins blog

因为最开始创建这个目录使用的 root 创建,Jenkins 对这个目录没有权限,导致最后纠结了好久。

参考链接

手把手教你搭建 Jenkins+Github 持续集成环境

Jenkins+Github 持续集成

Jenkins 最佳实践

hexo 自动部署

基于 Hexo 的全自动博客构建部署系统

赞赏是最好的支持与鼓励!
-------------本文结束感谢您的阅读-------------