• 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作为代理节点

    传送门

    参考文档

    --------------------------------------------------------- 恐惧是因为努力的还不够,加油 ~~---------------------------------------------
  • 相关阅读:
    使用反射获取对象的步骤
    金融IT的算法要求
    Java编译与反编译命令记录
    常用搜索博客/网站
    Java核心-03 谈谈final、finally、 finalize有什么不同?
    Java核心-02 Exception和Error有什么区别?
    PHP函数技巧篇
    IO
    Markdown 简单使用教程
    FZu Problem 2233 ~APTX4869 (并查集 + sort)
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13515129.html
Copyright © 2020-2023  润新知