Jenkins 动态Docker slave

6 篇文章 0 订阅
4 篇文章 0 订阅

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 实现 dockerclone codecompile codedocker in dockerscp 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
                }
            }
        }
            
    }
    

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值