## 摘要
本文基于本地已搭建好了 hexo+github pages 的环境下使用 Jenkins 构建持续集成到自己的阿里云服务器上,实现本地发布博客后同时部署到 GitHub 和个人的阿里云服务器上。
虽说利用 github pages 服务能够对外发布博客,但是作为一个码农还是希望有自己的域名博客,但是我比较懒,不想手动发布博客。我想自动化地既发布到 github 也能同时发布到个人网站。所以决定采用 CICD 的方法,CICD 工具使用开源的 jenkins,jenkins 也搭建在阿里云个人服务器上。
其他的 CI 方法:
配合 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 安装
参考资料:
生成 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. 创建用户并配置其仓库,执行如下命令
参考资料:
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 -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,执行如下命令
参考资料:
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 文件
参考资料:
先启动是否安装成功,执行如下命令
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
参考:
配置 jenkins
在 jenkins 页面提示目录中找到默认密码,输入 jenkis 域名,登陆 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.com
,Credentials
点击 Add 添加,Kind
选择Secret Text
, 具体如下图所示。
设置完成后,点击Test Connection
, 提示Credentials verified for user UUserName, rate limit: xxx
, 则表明有效。
创建一个 freestyle 任务
- General 设置
填写 GitHub project URL, 也就是你的项目主页 eg.https://github.com/your_name/your_repo_name
项目名称自定义。
- 配置源码管理
这里有几点要注意:
(1)要加入一个有写权限的账号,点击 Add 后选择创建用户
创建完需要去 系统管理 --- 全局安全配置 ---- 项目矩阵授权策略
里分配用户需要的写权限。
具体可以参考:
(2)要监听的 Branch 根据自己需要填写
- 构建触发器,构建环境
- 构建
构建脚本
将上图的构建脚本替换如下:
cd /var/www/blog(hexo 目录)
git pull
hexo clean
hexo g -d
- 构建后操作
- 构建前 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 对这个目录没有权限,导致最后纠结了好久。