title:
author: leazhi
tags:

categories:

date: 2024-04-08 18:47:50
cover:
discription:
keywords:
password:
message:

gitlab web 端配置

编写流水线脚本 .gitlab-ci.yml

1.登录 gitlab web 端,找到要自动发布的项目并点击进入。然后点击项目首页下面的 CI/CD 配置 ,如图:
20240321002

2.进入到 流水线编辑器 页面后,在下面的 编辑 模板栏中修改内容为:

1
2
3
4
5
6
7
8
9
stages: 
- deploy
deploy-job: # This job runs in the deploy stage.
stage: deploy # It only runs when *both* jobs in the test stage complete successfully.
environment: production
script:
- echo "Deploying application..."
- echo "Application successfully deployed."
- /home/gitlab-runner/dep.sh

如图:
20240321002

最后点击下提交更改!

获取 runner 安装和注册信息

1.回到项目主页,点击左侧导航栏中的 设置 —> CI/CD,如下图:
20240321001

2.进入 CI/CD 设置 页面后,找到下面的 Runner 配置项,点击后面的 展开 安就,然后在 项目 runner 下面点击 新建项目 runner 旁的三个点,接着在谈出的 注册令牌 窗口点击 显示 runner 安装和注册说明:
20240321002

上图中可以看到第3步旁边有个 runner ,那是我之前创建过了的

3.接着就在弹出的 安装 Runner 窗口得到 runner 安装的命令及注册的 token 信息,如下:
20240321003

远端 hexo 服务器

以下操作都是在 hexo 服务器上以 root 身份执行

Runner 安装

1.执行命令安装 runner:

1
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

2.赋予 gitlab-runner 命令可执行权限:

1
chmod +x /usr/local/bin/gitlab-runner

3.创建运行 runner 的用户(注意:需要创建它的家目录和允许登录系统):

1
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

4.安装 runner 并指定工作目录:

1
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner    # working-direcotry: 项目克隆或打包后文件存放的目录

注意: 这里先不要启动 gitlab-runner 服务(也就是先不要执行 gitlab-runner start 命令)

5.创建 gitlab-runner 的启动脚本文件 /lib/systemd/system/gitlab-runner.service,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat << 'EOF' > /lib/systemd/system/gitlab-runner.service
[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/bin/gitlab-runner

After=syslog.target network.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "gitlab-runner"
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner

[Install]
WantedBy=multi-user.target
EOF

Runner 注册

1.接上面的,继续执行注册命令:

1
gitlab-runner register --url https://gitlab.lxxxxxr.com/ --registration-token GR1348941AiRUeB6TXzy7xKUXUq_9

注意: 如果在注册的过程中,出现了下面这样的错误,那么请将 http 修改成 https 即可(首先,确保你访问 gitlab 是使用的 https)!

1
2
ERROR: Verifying runner... failed                   runner=xs_3R4MHy status=GET https://gitlab.lxxxxxr.com/api/v4/runners/verify: 401
PANIC: Failed to verify the runner. # 报这个错是因为使用的 http 协议,将其修改成 https 协议注册即可!

2.启动 gitlab-runner 服务:

1
systemctl start gitlab-runner.service

如果你的 gitlab 服务器放在一个没有公网 IP 的内网环境,且使用 Frpc 做了代理访问,那么就需要注意下面的配置。当然了,如果你的 gitlab 服务器有公网,那就略过这部分!

由于我的 gitlab 是在内网环境,加上联通又没有给单独配置公网 IP,所以,只能依靠自己搭建内网穿透服务进行内网映射!

1.编辑 /etc/gitlab-runner/config.toml 文件。将其修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "hexo"
url = "https://gitlab.linuser.com"
clone_url = "https://gitlab.linuser.com" # 主要是加这一行(使用代理的配置)
id = 10
token = "glrt-xs_3R4MHyu_x_rcaiVV7"
token_obtained_at = 2023-07-17T10:24:13Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "shell"
[runners.cache]
MaxUploadedArchiveSize = 0

2.删除 gitlab-runner 家目录下的 .bash_logout.sh 文件:

1
rm /home/gitlab-runner/.bash_logout

不删该文件会导致自动发布失败,报错信息为:

1
2
3
4
5
6
7
8
Running with gitlab-runner 16.1.0 (b72e108d)
on hexo xs_3R4MHy, system ID: s_78501ab433a4
Preparing the "shell" executor
00:00
Using Shell (bash) executor...
Preparing environment
00:00
ERROR: Job failed: prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

声明
gitlab-runner 安装配置好后,它默认会将项目的代码自动克隆到定义的 work-direcotry 目录里面,无需我们再次手动去获取代码或者打包

添加 hexo 管理脚本

1.创建 hexo 的启动脚本文件 /lib/systemd/system/hexo.service,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat << 'EOF' > /lib/systemd/system/hexo.service
[Unit]
Description=Hexo Blog Service
After=network.target

[Service]
Type=simple
#User=gitlab-runner
#Group=gitlab-runner
Environment=PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/nodejs/bin
WorkingDirectory=/data/hexo/blog
ExecStart=/usr/local/nodejs/lib/node_modules/hexo-cli/bin/hexo server -p 80
ExecReload=/bin/kill -HUP $MAINPID
#ExecReload=/bin/kill -SIGINT $MAINPID
#ExecReload=/usr/local/nodejs/lib/node_modules/hexo-cli/bin/hexo server -p 80
ExecStop=/bin/kill -SIGINT $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
EOF

2.执行命令加载脚本

1
systemctl daemon-reload

赋予 gitlab-runner 用户 systemctl 权限

编辑 /etc/sudoers ,在该文件中添加一行配置内容(这一行内容最好放在 root 用户配置那一行的上面),如下:

1
gitlab-runner   ALL=(ALL) NOPASSWD:/usr/bin/systemctl

创建发布脚本

1.在开始之前,别忘记了修改 hexo 网站根目录的所属主和组为 gitlab-runner:

1
chown -R gitlab-runner:gitlab-runner /data/hexo

2.先切换到 gitlab-runner 用户下

1
su - gitlab-runner

以下操作以 gitlab-runner 身份执行

3.在该用户的家目录下创建脚本文件 dep.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat << EOF > ~/dep.sh
#!/usr/bin/env bash

# gitlab-runner 会自动将 gitlab 上的 Hexo 项目克隆到 gitlab-runner 安装时指定的 work-directory 目录下(由于我的项目只需要动到 source 目录,所以这里直接指定要变动的目录)
work_dir="$(find ~/builds/* -type d -iname source |head -n 1)"

# hexo 站点静态文件存放目录(即文章和图片上传的目录)
blog_dir='/data/hexo/blog/source'

# 判断下 \${blog_dir} 是否存在,存在的话,直接删除里面所有内容
if [ -d \${blog_dir} ]; then
rm -rf \${blog_dir}/*
fi

# 重新复制
cp -rf \${work_dir}/* \${blog_dir}/

# 进入 hexo 站点根目录:
cd /data/hexo/blog

# 重启 hexo
sudo systemctl reload hexo.service
EOF

自动发布测试

接下来就将项目拉到本地,然后在项目 source/_post 目录下创建 .md 文件,编辑完内容后进行提交。稍等几秒,看看创建的内容是否能被访问!