likes
comments
collection
share

CI加成下的jekyll博客写作

作者站长头像
站长
· 阅读数 59

前言

一直搭建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/docker

networks:
  default:
    external:
        name: jenkins

给jekyll项目添加Dockerfile

这里使用预先编译好的_site文件夹,若果有需求可以在Dockerfile加上build的部分

FROM nginx
COPY ./_site /usr/share/nginx/html/
COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 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 官方镜像]

[Jenkins配置Gogs webhook插件]

本文由博客一文多发平台 OpenWrite 发布!