CI加成下的jekyll博客写作

前言 一直搭建jekyll以来只在线下使用,仅仅使用git放在服务器上作为远程仓库帮忙管理,
主要是jekyll部署时候比较麻烦(除直接使用jekyll serve,但这样会带来安全上的隐患),
所以一直都没有更新线上的jekyll博客。
由于最近需要把相当部分的代码加入CI,顺便着把jekyll也纳入其中。
由于本身需求的服务并不多,加上并不想将个人博客丢在第三方git平台,
git仓库跟CI均使用能自行部署的组件,所以这就用了这老三样:

  • Docker
  • Jenkins CI
  • Gogs
选择各组件理由
  • Docker:虽然现在云服务器支持使用k3s进行容器管理,但资源消耗来说还是docker swarm更低些。
  • Jenkins CI: 经典的CI/CD组件,虽然跟后期之秀比性能消耗比较大,但是插件够多,就CI来说性能影响并不大。
  • Gogs:轻量级的git管理工具,如果不想起Mairadb服务使用Sqlite也合适,自身还带Webhook等功能。
开整 安装Docker
这里使用系统本身的包管理器安装docker即可,亦可使用Docker官方给的教程添加Docker第三方源安装最新版。
[Docker 官方安装文档]
使用Docker部署Gogs和Jenkins服务
Gogs.yml
version: '3' services: gogs: image: gogs/gogs:latest restart: always container_name: gogs ports: - "${ssh-port}:22" - "${web-port}:3000" networks: - default - database - jenkins external_links: - mariadb - jenkins-master volumes: - "${gog-data}:/data" - "${gog-repo}:/data/git/gogs-repositories" networks: default: external: name: gogs jenkins: external: name: jenkins

Jenkins.yml
version: '3' services: jenkins-master: image: jenkinsci/blueocean:latest privileged: true restart: always user: root ports: - ${web-port}:8080 - ${agent-port}:50000 container_name: jenkins-master volumes: - ${data}:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker - /etc/docker:/etc/dockernetworks: default: external: name: jenkins

给jekyll项目添加Dockerfile
这里使用预先编译好的_site文件夹,若果有需求可以在Dockerfile加上build的部分
FROM nginx COPY ./_site /usr/share/nginx/html/ COPY ./nginx.conf /etc/nginx/nginx.confEXPOSE 80

Jenkins配置Gogs Webhook
  1. 首先,在Jenkins插件管理里边搜索Gogs,并安装,参照[Jenkins配置Gogs webhook插件]。
  2. 在Gogs建立仓库后,找到webhook选项并配置推送动作,参照[Jenkins配置Gogs webhook插件]。
  3. 建立Jenkins 项目, 填写流水线脚本如下:
    pipeline { agent any stages { stage('Git') { steps { git 'http://xianzelin.top/bidaya0/jekyll_blog.get' } } stage('build') { steps { sh 'docker build -t my_jekyll_blog:latest .' } } stage('deploy') { steps { sh 'docker stop jekyll_blog || true && docker rm jekyll_blog || true' sh 'docker run -it -d --name jekyll_blog -p 80:80 my_jekyll_blog:latest' } } } post { cleanup { deleteDir() } } }

    这里用|| true 是为了兼容容器不存在时返回错误导致自动构建停止
测试访问
在Gogs的webhook界面点击测试,查看项目是否正常构建。
改进点
  • 现在只采用了docker的容器部分,可以考虑使用swarm的设置
  • 可以对Dockerfile改进,让编译部分在云端进行。
参考文章 [Using Docker-in-Docker for your CI or testing environment? Think twice.]
[Docker 官方安装文档]
[jenkins 官方镜像]
[Gogs 官方镜像]
【CI加成下的jekyll博客写作】[Jenkins配置Gogs webhook插件]
本文由博客一文多发平台 OpenWrite 发布!

    推荐阅读