##初探在容器上构建持续部署( 六 )


关于WORKSPACE详情 , 请参阅Jenkins Project Artifacts and Workspace
https://stackoverflow.com/questions/39397329/jenkins-project-artifacts-and-workspace

  • 最佳实践
要总结最佳实践就要理解持续部署在整个开发流程中的作用和位置 , 它主要起一个串接各个环节的作用 。 而程序的部署是由k8s和Docker来完成的 , 因此程序部署的脚本也都在k8s中 , 并由k8s来维护 。 我们不想在Jenkins里再维护一套类似的脚本 , 因此最好的办法是把Jenkins的脚本压缩到最小 , 尽可能多地直接调用k8s的脚本 。
另外能写代码就不要在页面上配置 , 只有代码是可以重复执行并保证稳定结果的 , 页面配置不能移植 , 而且不能保证每次配置都产生一样的结果 。
  • 尽量少使用插件
Jenkins有许多插件 , 基本上你想要完成什么功能都有相应的插件 。 例如你需要使用Docker功能 , 就有“Docker Pipeline”插件 , 你要使用k8s功能就有“kubectl”插件 。 但它会带来很多的问题 。
第一 , 每个插件都有他自己的设置方式(一般要在Jenkins插件页面进行设置) , 但这种设置是与其他持续部署工具不兼容的 。 如果以后你要迁移到其他持续部署工具 , 这些设置都需要废弃 。
第二 , 每个插件都有自己的命令格式 , 因此你需要另外学习一套新的命令 。
第三 , 这些插件往往只支持部分功能 , 使你能做的事情受到了限制 。
例如 , 你需要创建一个Docker镜像文件 , 命令如下 , 它将创建一个名为''jfeng45/jenkins-k8sdemo''的镜像 , 镜像的默认文件是在项目的根目录下的Dockerfile 。
app = docker.build(''jfeng45/jenkins-k8sdemo'')
但创建Docker镜像文件命令有许多参数选项 , 例如 , 你的镜像文件名不是Dockerfile , 并且目录不是在项目根目录下 , 应如何写呢?这在以前的版本是不支持的 , 后来的版本支持了 , 但毕竟不太方便 , 还要学新的命令 。 最好的办法是能直接使用Docker命令 , 这样就完美的解决了上面说的三个问题 。 答案就在前面讲的Jenkins原理里 , 其实绝大多数插件都是不需要的 , 你只要自己创建一个Jenkins子节点容器 , 并安装相应的软件就能圆满解决 。
下面是使用插件的脚本和不使用的对比 , 不使用的看起来更长 , 那时因为使用插件的脚本和Jenkins里的凭证设置有更好的集成 , 而不使用的脚本没有 。 但除了这个小缺点 , 其他方面不使用的脚本都要远远优于使用插件的 。
使用插件的脚本(用插件命令):
stage('Create Docker images') {
container('docker') {
app = docker.build(''jfeng45/codedemo'', ''-f ${WORKSPACE}/script/kubernetes/backend/docker/Dockerfile-k8sdemo-test .'')
docker.withRegistry('', 'dockerhub') {
// Push image and tag it with our build number for versioning purposes.
app.push(''${env.BUILD_NUMBER}'')
}
}
}
不使用插件的脚本(直接用Docker命令):
stage('Create a d ocker image') {
def imageName = ''jfeng45/codedemo:${env.BUILD_NUMBER}''
def dockerDirectory = ''${kubBackendDirectory}/docker/Dockerfile-k8sdemo-backend''
container('modified-jenkins') {
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'dockerhub',
usernameVariable: 'DOCKER_HUB_USER',
passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
sh ''''''
docker login -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD}
docker build -f ${WORKSPACE}${dockerDirectory} -t ${imageName} .