借助 Jenkins 持续部署的能力,只需要一次配置构建部署流程,即可实现构建部署流程自动化。

作者将本地更新推送到 Gitea 后会触发构建部署流程,自动将构建结果上传到腾讯云对象存储,将源码推送到 Github 实现备份。

[TOC]

生成站点目录

在当前目录下生成站点目录 blog

docker run --rm -v %cd%/blog:/usr/site -w /usr/site ruby:3.0 sh -c "gem install --source https://gems.ruby-china.com/ bundler jekyll && jekyll new ."

Linux 用户将 %cd% 换成 $(pwd)

启动容器

启动 Gitea 和 Jenkins 服务

拉取 docker-compose.yml

git clone https://github.com/liaozibo-dev/jekyll-ci-docker.git
cd jekyll-ci-docker

启动容器:

docker compose up -d

配置 SSH 和上传工具

配置 Git SSH:

docker ps
docker exec -it <container-id> bash
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keyscan gitea >> ~/.ssh/known_hosts
ssh-keyscan github.com >> ~/.ssh/known_hosts
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

查看 SSH 公钥:

cat /var/jenkins_home/.ssh/id_ed25519.pub

查看 Jenkins 管理员密码:

cat /var/jenkins_home/secrets/initialAdminPassword

获取腾讯云密钥:https://console.cloud.tencent.com/cam/capi

生成腾讯云对象存储命令行工具配置文件:

输入 SecretId 和 SecretKey 即可, SessionToken 不用输入

存储桶配置请见:配置腾讯云对象存储

coscli config init

将配置文件复制到 jenkins 目录下:

mkdir /var/jenkins_home/config
cp /var/jenkins_home/.cos.yaml /var/jenkins_home/config

配置 Gitea

http://localhost:3000

配置 SSH:

生成 Windows SSH 密钥:

ssh-keygen -t ed25519 -C "your_email@example.com"
type C:\Users\liaoz\.ssh\id_ed25519.pub

新建 Gitea 仓库:

配置 Github

配置 SSH:

配置腾讯云对象存储

https://console.cloud.tencent.com/cos/bucket

开启静态网站:

查看存储桶配置:

配置 Jenkins

http://localhost:8080

新建 Item:

配置构建触发器,可以使用 1password 生成 Token:

配置构建过程:

触发地址:http://jenkins:8080/job/blog/build?token=xxx (jenkins 是 docker 内部主机名 )

配置 git remote

if 
    ! git remote | grep origin 
then
    git clone git@gitea:liaozibo/blog.git .
fi

if 
    ! git remote | grep github 
then
    git remote add github git@github.com:liaozibo-dev/blog.git
fi

Gitea 仓库地址:将 localhost 改成 gitea (docker 内部主机名)

Github 仓库地址:

拉取 Gitea 代码:

git pull origin master

构建 Jekyll:

jekyll build

将构建结果上传到腾讯云对象存储:

coscli sync -c $JENKINS_HOME/config/cos.yaml -r $WORKSPACE/_site cos://blog
rm coscli.log

将代码推送到 Github:

git push github master:main

配置匿名用户具有访问权限:

配置 Gitea Webhook

在 Gitea 容器目录下配置允许 Webhook:

[webhook]
ALLOWED_HOST_LIST = jenkins

重启 Gitea 容器:

docker ps
docker restart <container-id>

第一次部署

因为 docker 将 Gitea SSH 默认端口(22 端口)映射到主机的 222 端口,所以需要对主机的 SSH 进行配置:C:\Users\liaoz\.ssh\config

Host gitea
  HostName localhost
  User liaoz
  Port 222

liaoz 是 Windows 的用户名,可以使用以下命令查看:

echo %USERNAME%

进入站点目录 E:\blog,执行第一次提交:

e:
cd blog
git init
git add .
git commit -m "init"
git remote add origin git@gitea:liaozibo/blog.git
git push -u origin master

提示是否继续连接时,输入 yes

域名配置

其他

docker-compose.yml 内容:

version: '3.7'

# 将当前目录下的 ./docker/gitea 目录挂载到 gitea 容器
# 将当前目录下的 ./docker/jenkins 目录挂载到 jenkins 容器

services:
  gitea:
    image: gitea/gitea:1.17.3
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    ports:
      - 222:22
      - 3000:3000
    volumes:
      - ./docker/gitea:/data
  jenkins: 
    image: liaozibo/jenkins:ruby
    restart: always
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./docker/jenkins:/var/jenkins_home

不使用 Gogs 的原因:Gogs 容器会出现 error: kex_exchange_identification 问题

参考