手拉手教你:定制jenkins的docker镜像

235 阅读4分钟

该定制化镜像的特点

  • jenkins 版本为2.361 LTS 版本(可在制作镜像前就用新版本代替,也可在jekins管理界面,手动升级)
  • 镜像中直接包含jdk,maven,node,gradle,node,pnpm且版本较新
  • 全部已配置到环境变量,所以,可以不用在jenkins中配置maven,node,jdk,gradle,node

开始定制

Dockerfile

FROM ubuntu:focal

#修改国内源,清华大学的
RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list

#安装apt工具、vim、git、curl、unzip等常用工具,并添加中文语言包
RUN apt-get update && apt-get install -y apt-utils; \
    apt-get install -y vim curl unzip git fontconfig  && apt-get auto-clean; \
    apt-get install -y language-pack-zh-hans language-pack-zh-hans-base

#工作目录设置,相当于设置相对路径,没以/开头的路径都在/usr/local下
WORKDIR /usr/local

#创建jdk node gradle jenkins的war目录,以及npm全局安装位置与缓存
RUN mkdir -p jdk maven node gradle jenkins /root/data/.npm_global /root/data/.npm_caches /root/data/jenkins_workspace /root/data/.maven_store

#分别将gradle、jdk、node、jenkins.war、shell脚本放到刚才建好的目录中
#ADD与COPY的区别在于ADD会解压tar.gz、xz等linux下的压缩包,COPY仅是复制
ADD ./gradle-8.3.tar gradle/
ADD ./jdk-17_linux-x64_bin.tar.gz jdk/
ADD ./node-v20.11.1-linux-x64.tar node/
ADD ./apache-maven-3.9.4.tar maven/
COPY ./jenkins.war jenkins/
#启动容器中的Jenkins脚本,这个脚本后边给出
COPY ./docker-entrypoint.sh /

#设置容器运行时变量
ENV JAVA_HOME=/usr/local/jdk/jdk-17.0.10 \
    MAVEN_HOME=/usr/local/maven/apache-maven-3.9.4 \
    GRADLE_HOME=/usr/local/gradle/gradle-8.3 \
    NODE_HOME=/usr/local/node/node-v20.11.1-linux-x64 \
    NPM_CACHE_PATH=/root/data/.npm/.npm_caches \
    NPM_GLOBAL_PATH=/root/data/.npm/.npm_global \
    PNPM_CACHE_PATH=/root/data/.pnpm/.pnpm_cache \
    PNPM_STORE_PATH=/root/data/.pnpm/.pnpm_store \
    JENKINS_WAR_HOME=/usr/local/jenkins \
    JENKINS_WORKSPACE=/root/data/jenkins_workspace \
    TZ=Asia/Shanghai \
    LANG=zh_CN.UTF-8 \
    LANGUAGE=zh_CN:zh:en_US:en \
    LC_ALL=zh_CN.UTF-8

#暴露端口
EXPOSE 8008

#容器入口,执行上边复制到/的脚本
ENTRYPOINT [ "/bin/bash", "/docker-entrypoint.sh" ]

# 构建方式: docker build -t jekins:ubuntu-focal .

docker-entrypoint.sh

#!/bin/bash
#自定义Jenkins工程入口脚本
#@author panzy
 
#取/etc/profile最后一行的值,默认为fi,当其值变为export说明这是此容器非第一次启动,初始化操作可免
env_export=$(tail /etc/profile -n 1)
result=$(echo $env_export | grep "export")
if [[ "$result" == "" ]]
then
	#gradle的zip压缩包用ADD复制也没有被解压……手动解压吧
    echo "正在设置环境变量......"
    #这里取了上边的环境变量值,写入到/etc/profile中,令配置全局生效
    echo "export PATH=$JAVA_HOME/bin:$GRADLE_HOME/bin:$NODE_HOME/bin:$NPM_GLOBAL_PATH/bin:$PATH:${MAVEN_HOME}/bin" >> /etc/profile
    #向 /root/.bashrc 追加脚本, 使得每次容器启动,都能刷新系统配置,使环境变量生效
    echo "source /etc/profile" >> /root/.bashrc
    source /etc/profile
    #设置npm全局缓存目录
    npm config set cache "$NPM_CACHE_PATH"
    #设置npm全局安装目录,防止npm install -g 某软件 后无法直接执行
    npm config set prefix "$NPM_GLOBAL_PATH"
    #设置npm仓库镜像
    npm config set registry https://registry.npmmirror.com
    #全局安装pnpm
    npm install -g pnpm@8.8
else
	#非初次进入容器,需要手动刷新下环境变量,不然无效
    source /etc/profile
fi

# 设置pnpm的存储相关路径
pnpm config set store-dir /root/data/.pnpm/.pnpm_cache
pnpm config set cache-dir /root/data/.pnpm/.pnpm_store

echo "正在启动jenkins......"
#直接启动jenkins,其实本来打算不输出日志的,用的nohup,但是吧,它直接就退出容器了……
java -DJENKINS_HOME=$JENKINS_WORKSPACE -jar $JENKINS_WAR_HOME/jenkins.war --httpPort=8008

docker-compose.yml

version : '3.9'
services:
  jenkins:
    user: root
    restart: always
    image: jekins:ubuntu-focal
    container_name: jenkins
    ports:
      - 8008:8008
    volumes:
      - ./jenkins_workspace:/root/data/jenkins_workspace
      - ./NPM:/root/data/.npm
      - ./MAVEN_STORE:/root/data/.maven_store
      - ./PNPM:/root/data/.pnpm

# 运行方式: docker-compose up -d

构建镜像

docker build -t jekins:ubuntu-focal .

完整镜像文件

pan.baidu.com/s/16gE2HDUa…

4kyr

处理插件安装失败

在处理插件安装失败之前,请先看下一节,加快jenkins插件下载,再来处理插件安装失败

Docker 安装 Jenkins (保姆级教学——以及推荐插件安装不上问题解决)_jenkins推荐插件没装-CSDN博客

加快jenkins插件下载

在首次安装完毕之后,不要安装任何插件,然后进入jenkins,设置插件镜像,然后再安装插件

一般需要安装的插件如下

  • git
  • maven
  • nodejs
  • folder
  • pipeline
  • Pipeline: Stage View
  • build user vars (用于在pipeline中获取执行job的用户信息)

Jenkins插件管理切换国内源地址_jenkins国内源-CSDN博客

jenkins插件镜像

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

jenkins占用内存优化

Jenkins 内存优化问题 - 掘金 (juejin.cn)

找回jenkins密码

Jenkins忘记密码解决方法 windows/Linux - 简书 (jianshu.com)

参考资料

解决java.lang.UnsatisfiedLinkError: /usr/local/jdk17/lib/libfontmanager.so: libfreetype.so.6_failure:/opt/openjdk-17/lib/libfontmanager.so: err-CSDN博客

linux中创建一次创建多个目录或创建多级目录_在该目录下新建两个子目录-CSDN博客

docker-compose up -d和docker-compose up --build的补充_docker compose up -d-CSDN博客