Jenkins部署hexo-blog项目
使用Docker安装Jenkins
本文在腾讯云轻量级服务器上,使用Docker搭建了Jenkins,并将使用了hexo的框架的博客部署在服务器上,通过CI/CD流程实现自动化部署项目。
配置需求
参考官网的最小资源配置:
Minimum hardware requirements:
- 256 MB of RAM
- 1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container)
部署方案
进入服务端控制台
创建一个桥接网络jenkins:
docker network create jenkins
为了在Jenkins节点内执行Docker命令,请使用以下docker run命令下载并运行docker:dind Docker映像:
1
2
3
4
5
6
7
8
9
10
11
12
13docker run \
--name jenkins-docker \
--rm \
--detach \
--privileged \
--network jenkins \
--network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 \
docker:dind \
--storage-driver overlay2在指定的目录位置创建一个Dockerfile文件,写入以下内容,如果遇到下载网络卡顿无法下载,多执行几次。
1
2
3
4
5
6
7
8
9
10
11
12FROM jenkins/jenkins:2.462.2-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"启动docker container,注意参数配置!此处和ngnix配置不一致会导致404或者302跳转过多等问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18docker run \
--name jenkins \
--restart=on-failure \
--detach \
--network jenkins \
--env DOCKER_HOST=tcp://docker:2376 \
--env DOCKER_CERT_PATH=/certs/client \
--env DOCKER_TLS_VERIFY=1 \
--env JENKINS_OPTS="--prefix=/jenkins" \
--env JENKINS_ARGS="--prefix=/jenkins" \
--publish 8082:8080 \
--publish 50000:50000 \
--user root \
--env TZ="Asia/Shanghai" \
--volume {{local_pos}}:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
--volume {{local_position}}:/www/hexo \
myjenkins-blueocean:2.462.2-1修改openresty中的nginx配置,增加以下内容,注意和docker配置的前缀保持一致。
1
2
3
4
5
6location /jenkins/ {
proxy_pass http://127.0.0.1:8082/jenkins/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}重启openresty
第一次启动需要初始密码,初始密码的位置在:
/var/jenkins_home/secrets/initialAdminPassword
,使用命令docker exec -it {{container_id}} /bin/bash
进入docker内部,访问指定路径上的文件获取密码即可。
Jenkins部署hexo-blog项目
由于项目发布的目录在挂载卷/www/hexo
,结合openresty的nginx配置情况,采用使用内置nodejs + pipeline的部署方式。
部署流程
- Jenkins 从 GitLab 拉取 Hexo 项目代码。
- Jenkins 构建 Hexo 项目,生成静态文件。
- 将静态文件拷贝到
/www/hexo
文件夹中。
Node插件安装
这个插件自带Nodejs运行环境,可选择不用的安装版本,配合在pipeline脚本中使用。配置操作步骤如下:
系统管理 -> 全局工具配置 -> NodeJS 安装 -> 点击新增
配置完成后参考:
注意Nodejs官方源下载受网络影响,最好实用镜像代替,如使用阿里镜像源:
https://mirrors.aliyun.com/nodejs-release/
。有其他需要可以安装cnpm or yarn等其他包管理工具。这里起一个别名,脚本会使用到。
安装完成后,进入系统设置,选择
Managed files
如图:
选择新建一个配置
Add a new Config
-> 然后选择Npm config file
,然后点击Next
。如图:
参考如下图配置:
保存后node插件就安装完成了。
配置 Jenkins Pipeline
接下来,配置 Jenkins 来拉取GitHub上的Hexo项目代码、构建并发布到服务器的 /www/hexo
目录中。
新建一个Pipeline(流水线)项目:在Jenkins UI 中,点击 “新建任务” 选择 “流水线” 类型,然后给你的项目命名。
添加配置Github基本项配置:
配置构建触发器,这里可以使用webhook来做,由于这块配置出现问题卡主了暂时列为TODO,后续有研究成果后再添加。
添加流水线脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59pipeline {
agent any
tools {
nodejs "node-20-17-0" // 使用你在 Jenkins 中配置的 Node.js 版本名称
}
environment {
GITHUB_REPO = 'git@github.com:xxxxx/hexo-blog.git' // GitHub 仓库地址
DEPLOY_DIR = '/www/hexo' // 发布目录
}
stages {
stage('Clone Repository') {
steps {
// 克隆 GitHub 项目
git branch: 'main', url: "${GITHUB_REPO}", credentialsId: '{{credentialsIds}}'
}
}
stage('Configure npm Registry') {
steps {
// 切换 npm 的 registry 为阿里云镜像
sh 'npm config set registry https://registry.npmmirror.com'
// 验证 npm registry 设置
sh 'npm config get registry'
}
}
stage('Install Dependencies') {
steps {
script {
// 安装 Node.js 项目的依赖
sh 'npm install'
sh 'npm install hexo-cli -g'
}
}
}
stage('Build Hexo Site') {
steps {
script {
// 生成 Hexo 静态文件
sh 'hexo generate'
}
}
}
stage('Deploy to Local Directory') {
steps {
script {
// 将生成的静态文件复制到 /www/hexo 目录
sh "cp -r public/* ${DEPLOY_DIR}"
}
}
}
}
}
配置 GitHub SSH 凭证
获取SSH秘钥
如果已存在,从
.ssh/id_rsa
中获取私钥如果没有现成的 SSH 密钥
1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
然后将公钥添加到 GitHub 仓库的
Settings -> Deploy keys
。在 Jenkins 中配置 SSH 凭证:
打开Jenkins的”凭据管理”,添加SSH私钥凭证,用于从GitHub拉取代码。
测试 Jenkins Pipeline
- 手动触发 Jenkins Pipeline 构建,确认项目能正确拉取、构建,并将静态文件发布到
/www/hexo
目录。 - 确保
/www/hexo
目录有正确的静态文件,并配置 Nginx 或 Apache 指向这个目录。
关于部署踩坑问题
Q: Pipeline过程中: npm: not found
A: 脚本中没有指定:credentialsId: '{{credentials_id}}'
Q: 发生错误stderr: fatal: unable to access 'https://github.com/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.
A: 这个错误表明 Jenkins 在拉取 GitHub 仓库时遇到了 TLS 连接的问题。通常这是由于 Jenkins 容器或环境中缺少某些网络或 SSL/TLS 库引起的。解决方案是使用ssh方式拉取代码。
Q:/www/hexo
没有权限,导致cp -R 操作失败,无法复制。
A: 权限提权问题,尝试了多种方案后,只能在docker run启动时,增加 –user root 参数配置,让jenkins使用root权限进行操作。唯一的缺点是安全方面有隐患,如果个人使用其实还好。
参考文章
- Jenkins部署官方文档
- linux环境下docker中搭建 jenkins 及自定义访问路径,利用nginx反向代理
- docker 启动 jenkins 挂载目录权限问题 Permission denied
- Docker+Jenkins 入门教程 (包含自己遇到的一些坑跟解决方法)
- CI/CD 工具Jenkins的基本使用(Hexo为例)
- Docker+Jekins+GitHub 持续集成配置(详细操作过程)
- Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台(持续集成部署Hexo博客Demo)
- Jenkins自动部署前端项目