Jenkins 动态 Slave
-
背景
Jenkins日常工作中在代码编译、打包、部署等一系列操作,都是以 Job 的形式进行,而 Job 的承载是 Jenkins 所在的主机,当面临 Jenkins 扩展、迁移等操作时,需要安装大量的依赖软件来支持 Job的运行。所以本篇文章记录 使用 Docker Cloud 的方式,远端自动拉起 Jenkins Slave 容器进行 Job 的运行,从而大大的增加 Jenkins Job 迁移的快速、敏捷。闲话不多说,接下来让我们来实现它!
-
制作自定义 Jenkins Slave 镜像
根据 docker hub 上 jenkins slave 的镜像制作规则更改
- 完整
Dockerfile
FROM magic-harbor.magic.com/library/centos:7.8.2003 LABEL maintainer="xxxxx@xxxxx.com.cn" LABEL version="1.0" LABEL description="This Jenkins slave" ARG AGENT_WORKDIR=/root/agent # java ENV JAVA_HOME=/usr/local/jdk1.8.0_144 ENV JRE_HOME=${JAVA_HOME}/jre ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib ENV PATH=${JAVA_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/docker ENV AGENT_WORKDIR=${AGENT_WORKDIR} # System repo RUN rm -rf /etc/yum.repos.d/ COPY epel.repo /etc/yum.repos.d/ COPY Private-Base.repo /etc/yum.repos.d/ RUN yum clean all && yum makecache \ && yum -y install make bzip2 bzip2-devel unzip gcc gcc-c++ git openssl-devel sqlite-devel python3 python3-devel java-1.8.0-openjdk \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && localedef -c -f UTF-8 -i en_US en_US.UTF-8 \ && echo 'LANG="en_US.UTF-8"' > /etc/locale.conf \ && source /etc/locale.conf \ && yum clean all \ && rm -rf /var/cache/yum/* \ && rm -rf /tmp/* \ && mkdir -p /usr/share/jenkins COPY jenkins-agent /usr/local/bin/jenkins-slave COPY remoting.jar /usr/share/jenkins/agent.jar ADD docker-19.03.9.tgz /usr/local/ RUN chmod +x /usr/local/bin/jenkins-slave \ && chmod 755 /usr/share/jenkins \ && chmod 644 /usr/share/jenkins/agent.jar \ && pip3 install --no-cache-dir cython==0.28.2 RUN mkdir /root/.jenkins && mkdir -p ${AGENT_WORKDIR} COPY ssh /root/.ssh RUN chown -R root:root /root/.ssh USER root ENTRYPOINT ["jenkins-slave"]
注: 此
Dockerfile
实现docker
内clone code
、compile code
、docker in docker
、scp file
。-
jenkins-agent
: 使用 github 提供的最新版即可 访问地址 -
remoting.jar
: 访问已经存在的本地 Jenkins url 下载即可,例如:http://Your Jenkins Url/jnlpJars/remoting.jar
最重要的点: 需要自行根据
jenkins-slave
中最后一行 使用 jar 包名称进行更改。 - 完整
-
Jenkins Docker Cloud 配置
-
远端 Docker 启动 API 调用
# 新建 /etc/default/docker DOCKER_OPTS="-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock" # /usr/lib/systemd/system/docker.service 做如下更改 [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify EnvironmentFile=-/etc/default/docker # 新增启动读取配置文件,-目的忽略报错 ExecStart=/usr/bin/dockerd -b=docker0 --iptables=false $DOCKER_OPTS # 此处增加定义的变量$DOCKER_OPTS ExecStartPost=/bin/bash -c "/usr/bin/permission" ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target # 重启并验证服务 $ sudo systemctl daemon-reload && sudo systemctl restart docker $ docker -H tcp://192.168.1.68:2367 version Client: Docker Engine - Community Version: 19.03.9 API version: 1.40 Go version: go1.13.10 Git commit: 9d988398e7 Built: Fri May 15 00:22:47 2020 OS/Arch: linux/amd64 Experimental: false Cannot connect to the Docker daemon at tcp://192.168.1.68:2367. Is the docker daemon running?
-
插件安装
Jenkins–>系统管理–>插件管理
- 配置插件
Jenkins–>系统管理–>系统配置–>Cloud–>Add a new cloud–>Docker
- 配置 docker agent templates
Jenkins–>系统管理–>系统配置–>Cloud–>Add a new cloud–>Docker–>Docker Agent templates
- 验证(在流水线中调用)
Job执行完毕会自动清理节点
pipeline { agent { label 'jenkins-node' } stages { stage('Hello') { steps { sh 'java -version' sh 'git --version' sh 'docker -v' sleep 50 } } } }
-