使用docker快速部署Jenkins v1.23.x

371 阅读5分钟

牢骚

这几年因为工作忙碌原因,自己写的博客一直断断续续,很是内疚。其实真的一直想将自己工作以来学习的新技术和经验分享给大家,因为在工作中发现有很多朋友一直以来的工作都是做一些重复性的事情,不知不觉就会浪费自己很多时间,导致自己学的的技术一直深入不下去;也有一些朋友一直喜欢活在自己的舒适圈,吃老本,对于新技术的发展不上心,总感觉自己用的技术其实就是“世界上的最棒的技术或语言了”,其实这种心理是很要不得的,这只会给自己在日新月异的技术发展中设了一栋栋高墙,让你渐渐被技术这一行淘汰;很多大厂都说做技术的IT人一定要衷于“拥抱变化”,其实不只是业务需求需要拥抱变化,技术和个人的视野也需要拥抱变化,很多技术自己没有实操过玩过,只听网上的一些对比总结帖就说这个没用,那个用起来太麻烦,那个大而全,这个很多功能都没有...只有自己真正实操过和钻研过的技术,你才知道它们各自的优缺点和针对的应用场景,没有任何一个技术是真正意义上的银弹,真正的银弹我觉得应该是培养好自己的技术人文化,开阔自己的技术视野,勤于动手尝试新的技术,并加深对技术的原理剖析,这样你才能在技术这条路上走的更好。

简述

哈哈,扯远了,先回到今天的主题:使用docker快速部署Jenkins,其实写这篇部署Jenkins指南是因为我发现网上很多的Jenkins部署教程都是比较旧,而且所解决的问题都很零散,所以想在这里写一篇对我来说比较全而且快速部署的指南。这次要部署的是Jenkins blue ocean v1.23.2,如果你要部署的版本比这个版本要后的话,就建议参考下本文即可,不过大体上的部署方式应该都是大同小异的。

问题:jenkins的blue ocean是什么版本来的?

其实blue ocean是jenkins官方为了让更多新手更容易去学习使用jenkins而新推出的一个更简易、可读性强、方便使用的jenkins皮肤插件:

dashboard

可以看出有blue ocean插件对于使用jenkins的DevOps人员来说可以更快地写出自己想要的ci流水线,其实就是通过界面交互的方式动态生成jenkins能识别的jenkinsfile并下发到jenkins的source control中。

基于官方文档的初衷,本文使用的blue ocean版本是官方推荐直接用于生产环境的版本,所以我会以官方文档的前提下,优化了一些部署中的过程,让你可以更快更好地搭建整个jenkins。

预安装环境及组件

支持docker的操作系统

docker-ce v18.06.3+
docker-compose

安装步骤(以linux系统为例)

  • 创建部署文件夹并进入文件夹
mkdir jenkins_deploy && cd jenkins_deploy
  • 创建hudson.model.UpdateCenter.xml文件,用来给容器预映射到jenkins指定文件中,实现jenkins初始化就能提速插件更新,文件内容如下
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
  • 创建docker-compose.yml文件,并将以下内容复制到docker-compose.yml中

这里还是用了内置docker-dind,这个服务可以直接给jenkins使用docker来部署流水线。这个部署配置文件我是根绝官方的docker部署改写过的,以降低部署难度。

version: "3"

services:
  docker:
    image: docker:19.03.8-dind
    container_name: jenkins-docker
    hostname: docker
    privileged: true
    restart: always
    environment:
      - DOCKER_TLS_CERTDIR=/certs
    ports: 
      - 2376:2376
    volumes: 
      - TZ=Asia/Shanghai
      - "jenkins-docker-certs:/certs/client"
      - "jenkins-data:/var/jenkins_home"
    networks: 
      jenkins:
        aliases: 
          - docker
  jenkins:
    image: jenkinsci/blueocean:1.23.2
    container_name: jenkins-blueocean
    restart: always
    networks: 
      jenkins:
    environment:
      - TZ=Asia/Shanghai
      - DOCKER_HOST=tcp://docker:2376
      - DOCKER_CERT_PATH=/certs/client
      - DOCKER_TLS_VERIFY=1
      - JENKINS_UC_DOWNLOAD=https://mirrors.tuna.tsinghua.edu.cn/jenkins/
    ports: 
      - 8080:8080
      - 50000:50000
    volumes: 
      - "./hudson.model.UpdateCenter.xml:/var/jenkins_home/hudson.model.UpdateCenter.xml"
      - "jenkins-data:/var/jenkins_home"
      - "jenkins-docker-certs:/certs/client:ro"
    depends_on: 
      - docker

volumes: 
  jenkins-docker-certs:
  jenkins-data:

networks: 
  jenkins:
  • 启动容器
docker-compose up -d
  • 先不要访问web界面,先通过命令docker-compose logs -f jenkins查看容器日志,等待jenkins生成初始化的admin密码,如看到类似以下输出时就证明密码生成成功,记录下这个初始密码

  • 密码生成成功后,新建以下脚本文件,原因是新建的jenkins环境用的插件缓存还仍然是国外的下载地址,这样更新插件还是会异常缓慢,所以需要这个脚本来批量修改这些地址转换为国内的更新地址
# modify_jenkins_urls.sh
#!/bin/bash
#
# Modify the features source urls in jenkins

set -u
set -e

docker exec jenkins-blueocean sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/jenkins_home/updates/default.json
docker exec jenkins-blueocean sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/jenkins_home/updates/default.json
  • 修改脚本的执行权限并执行(注意:必须需要等jenkins初始化好密码后方可执行此脚本)
chmod +x modify_jenins_urls.sh
bash ./modify_jenins_urls.sh

# 如执行后失败就再执行多几次,直到执行成功为止
  • 最后可以开始访问jenkins的web uihttp://127.0.0.1:8080,使用刚刚记录下来的初始密码登录jenkins,并开始初始化所需的插件了,你会发现jenkins下载插件的速度已经快了很多,并且进入jenkins主界面后不需要再改什么访问地址了

总结

其实以上这个方法大家应该也很容易就写出来的,我只是一个技术的搬运工而已哈哈,如果以上部署步骤有什么疑问错误或改进的话可以跟我说,我再作改进。