pipleline实现docker、k8s代理节点
使用docker容器作为代理节点image和label
- 可以使用
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证书
}
}
- 类似配置固定的Permanent Agent(服务器类型)还可以使用docker容器作为jenkins的代理节点,使用
agent {label 'nodejs-docker'}
来指定docker代理节点。配置稍微有些麻烦,但可以设定多个docker节点,并且动态的加载构建所需要的容器。在node and clouds中配置。
添加docker作为jenkins的代理节点,由于代理和jenkins必须保持双向通信,所以docker需要开启远程访问,jenkins需要开启JNLP。
开启docker的远程访问
-
vim /usr/lib/systemd/system/docker.service
-
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
-
echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile;source /etc/profile
-
systemctl daemon-reload;systemctl restart docker
-
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'
}
}