pipleline实现docker、k8s代理节点

使用docker容器作为代理节点image和label

  1. 可以使用docker { image 'node:14-alpine' }动态加载一个指定镜像来构建,无需任何配置。但仅在指定的节点比如master上的docker上创建。docker image是jenkins内置的,在系统配置中,lable留空就可以,写了lable的没测试过怎么调用。

pipeline {
    agent {
        docker { image 'node:14-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

其他参数

agent {
    docker {
        image 'maven:3-alpine'
        label 'my-defined-label'
        args  '-v /tmp:/tmp'  //docker build 参数
        registryUrl 'https://myregistry.com/'           //dockerhub-url
        registryCredentialsId 'myPredefinedCredentialsInJenkins'   //dockerhub证书
    }
}
  1. 类似配置固定的Permanent Agent(服务器类型)还可以使用docker容器作为jenkins的代理节点,使用agent {label 'nodejs-docker'}来指定docker代理节点。配置稍微有些麻烦,但可以设定多个docker节点,并且动态的加载构建所需要的容器。在node and clouds中配置。

添加docker作为jenkins的代理节点,由于代理和jenkins必须保持双向通信,所以docker需要开启远程访问,jenkins需要开启JNLP。

开启docker的远程访问

  1. vim /usr/lib/systemd/system/docker.service

  2. docker1.13版本 添加 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H tcp://0.0.0.0:7654 \
    docker17.03.2-ce版本 添加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    v1.13

    v17.03.2-ce

  3. echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile;source /etc/profile

  4. systemctl daemon-reload;systemctl restart docker

  5. docker -H tcp://192.168.1.187:2375 images

安装、配置docker插件

安装完成后在Manage Node and Clouds可以找到。

开启jenkins-JNLP端口

在配置docker模板中我们有三种连接方式可以选择,本文使用jnlp方式

开启master的JNLP端口
打开Manage Jenkins / Configure Global Security,在Agents下,选择 TCP port for JNLP agents为Fixed,输入一个端口号,比如36366.
开启后需要重启jenkins并验证端口是否启动。

配置docker容器代理

返回Manage Node and Clouds,Manage Jenkins —> Configure System —> (拖到最下方)Add a new cloud —> 选择 docker

输入Labels,比如docker-slave (Jenkins Pipeline中将使用该label来选择Jenkins Agent)
勾选Enabled
输入Name,一般为镜像简短描述,比如jnlp-slave-with-java-build-tools
输入Docker Image,比如registry.cn-shenzhen.aliyuncs.com/cookcodeblog/jnlp-slave-with-java-build-tools:latest
选择Remote File System Root为/home/jenkins
选择Usage为Only build jobs with label expressions matching this node
选择Connect method为Connect with JNLP
选择Pull strategy为Pull once and update latest
可选修改Idle timeout,缺省为10分钟

节点启动失败解决:
可以从这里查看节点启动的报错

使用

测试一:
新建一个pipeline任务,启动构建,会在指定的docker服务器上创建一个由docker-slave模板中的镜像创建的容器,pipeline执行完毕,自动删除容器。

pipeline {
    agent {label 'docker-slave'}
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
				sh 'git --version'
				sh 'git --version'
				sh 'mvn -v'
            }
        }
    }
}

测试二:
以nodejs程序为例,如果拉取代码到服务器上,执行编译,编译完成后的文件,编译失败,日志文件的位置?
todo

使用dockerfile定制构建环境

使用dockerfile,Jenkinsfile必须从多分支管道或** SCM **管道加载,就是说dockerfile和jenkinsfile需放在gitlab上。Dockerfile默认存放在根目录:agent { dockerfile true }。
如果要Dockerfile在另一个目录中构建,请使用以下dir选项:agent { dockerfile { dir 'someSubDir' } }。
如果您Dockerfile有其他名称,则可以使用filename选项指定文件名。
您可以docker build …​使用additionalBuildArgs选项将其他参数传递给命令agent { dockerfile { additionalBuildArgs '--build-arg foo=bar' } }。
还可以选择接受registryUrl和registryCredentialsId参数,这将有助于指定要使用的Docker注册表及其凭据。
个人理解:
1、dockerfile参数是使用dockerfile来创建构建环境
2、dockerfile文件必须放在scm中加载
3、可以分类创建自定义的nodejs环境、maven环境、pyhton环境,比起image好处是可以随时定制或修改而不需要打包成镜像。
4、主要用于构建,在打包镜像中不能使用

agent {
    // Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
    dockerfile {
        filename 'Dockerfile.build'
        dir 'build'
        label 'my-defined-label'
        additionalBuildArgs  '--build-arg version=1.0.2'
        args '-v /tmp:/tmp'
        registryUrl 'https://myregistry.com/'
        registryCredentialsId 'myPredefinedCredentialsInJenkins'
    }
}

使用K8S作为代理节点

传送门

参考文档

posted @ 2020-08-19 10:42  名字很长容易被惦记  阅读(615)  评论(1编辑  收藏  举报