使用Docker搭建Jenkins进行持续集成持续部署

devopscube,Devops魔方为个人公众号,主要用于一些有关Devops,容器,kubernetes,自动化运维,以及敏捷开发相关的分享。同时也会不定期的分享一些个人心得,比如推荐一些个人使用的办公小软件,对一些事件的评论等。欢迎大家关注交流。
在这里插入图片描述

前言

Jenkins是开源的持续集成持续部署的组件,也是该领域的世界范围内的领导者。

随着Docker技术的不断成熟和普及,让持续集成持续部署的技术也有了长足的发展。通过Docker能够屏蔽各种底层的环境的差异,能够保证跨机器运行环境的统一。

使用Docker环境运行Jenkins具有以下优点:

  1. 快速部署。
  2. 方便迁移,能够快速的在新的机器上部署和转移数据。
  3. Jenkins利用Docker plugin,可以动态的生成jenkins slave运行环境,节约资源。
  4. 可以指定不同的docker镜像为运行环境,避免了在宿主机上过多的配置而产生对环境的依赖。

安装

我们采用docker hub上的官方镜像进行部署。
使用Docker搭建Jenkins进行持续集成持续部署_第1张图片
这里我们使用latest版本,默认是使用。官方为不同的版本封装了镜像,例如有centos的版本,alpine的版本以及封装了JDK11的版本。大家可以根据需要进行选择。

我们这里选择lts的版本,因为比较稳定。从dockerfile上看,lts版本目前支持的版本号是: 2.222.1

docker pull jenkins/jenkins:lts

然后我们就可以设计我们的启动的docker命令了。

docker run -d --restart=always --name=jenkins-master \
-p 8080:8080 -p 50000:50000 \
-v $PWD:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker \
--env JENKINS_OPTS='--prefix=/jenkins' \
jenkins/jenkins:lts

# -p 指定暴露的端口,8080用于对外暴露服务,而50000适用于Jenkins slave的注册
# 第一个 -v 指定挂载的jenkins home中的内容到本地,这里我们指定当前目录$PWD
# 第二个 -v 用于将本地的docker挂载到容器中,实现在容器中使用docker命令
# --env可以指定很多参数,这里我们指定jenkins的contextpath 为 jenkins

这里注意,因为我们之后的操作都是以docker的方式运行,所以务必要求jenkins内部能运行docker命令。有关容器中运行docker命令,大家可以查看我的历史文章:

https://blog.csdn.net/weixin_36938307/article/details/105092191

运行命令之后我们可以看到容器已经在运行了。并且本地生成了相应的jenkins home内的文件。

[aiops@3 jenkins]$ docker ps | grep jenkins
bf26470ee79e        jenkins/jenkins:lts                               "/sbin/tini -- /usr/…"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp    jenkins
[aiops@3 jenkins]$ pwd
/home/aiops/jenkins
[aiops@3 jenkins]$ ls
config.xml                           jenkins.telemetry.Correlator.xml  plugins                   userContent
copy_reference_file.log              jobs                              secret.key                users
hudson.model.UpdateCenter.xml        logs                              secret.key.not-so-secret  war
identity.key.enc                     nodeMonitors.xml                  secrets
jenkins.install.UpgradeWizard.state  nodes                             updates

访问http://ip:8080/jenkins即可看到相应的界面。
使用Docker搭建Jenkins进行持续集成持续部署_第2张图片

这里我们需要输入管理员密码,相应的内容在jenkins home 下的/secrets/initialAdminPassword。

我们也可以用docker logs -f jenkins查看jenkins的日志拿到该信息。

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

10e02b287b9045898c2e44219c8ac14e

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************

然后根据提示要求完成安装。下图为安装默认推荐插件。
使用Docker搭建Jenkins进行持续集成持续部署_第3张图片

安装完成!

使用Docker搭建Jenkins进行持续集成持续部署_第4张图片
这一次LTS的版本的界面风格较以前有比较大的改变。界面更加好看了一些。

使用Docker搭建Jenkins进行持续集成持续部署_第5张图片
下面我们开始配置一个简单的流水线。

流水线配置

我们新建一个简单的流水线示例

使用Docker搭建Jenkins进行持续集成持续部署_第6张图片
使用helloword示例,保存并触发构建

使用Docker搭建Jenkins进行持续集成持续部署_第7张图片

可以看到构建成功:

使用Docker搭建Jenkins进行持续集成持续部署_第8张图片

还记得我们将docker命令也挂载到容器中了吗,我们尝试添加运行docker命令的步骤。

修改pipeline, 添加docker -v尝试运行docker

pipeline {
   agent any

   stages {
      stage('Hello') {
         steps {
            echo 'Hello World'
            sh 'docker -v'
         }
      }
   }
}

我们可以看到成功运行并打印出宿主机的docker版本信息。

使用Docker搭建Jenkins进行持续集成持续部署_第9张图片

以上只是一个简单的例子,jenkins已经安装好,并且能够运行我们指定的pipeline。但是这仍然不够。真实的使用场景中,需要配置很多额外的环境,例如安装maven,git等。

如果登录到容器内部进行安装操作,确实可以实现这样的场景。但是如果jenkins容器重启后就需要重新安装和配置,这样会增加很多复杂的工作而且无法重用。

我们需要更加灵活的方式做我们流水线运行的环境。 例如使用docker容器跑流水线的方式。jenkins pipeline原生的提供了这样的功能,可以指定docker的agent去运行流水线。

默认的jenkins镜像中不含有maven工具,这里我们使用官方的maven镜像尝试在流水线中运行mvn命令。

修改流水线如下:

pipeline {
   agent {
       docker {
          image 'maven:3.6.2-jdk-8'
        }
   }

  
   stages {
      stage('Hello') {
         steps {
            echo 'Hello World'
            sh 'mvn -v'
            sleep 30
            sh 'docker -v'
         }
      }
   }
}

使用Docker搭建Jenkins进行持续集成持续部署_第10张图片

这里我们看到maven的镜像中成功看到mvn命令的输出。证明,该流水线是在我们指定的docker容器中运行的。

具体有关pipeline中docker的语法请查看:

https://jenkins.io/doc/book/pipeline/syntax/#agent

使用这种docker的定义的方法好处是可以灵活配置好不同的构建环境,以镜像的形式去维护。

总结

本文介绍了如何使用纯docker的方式去运行Jenkins,以及jenkins流水线中“docker"的语法去运行流水线。之后的文章我会介绍如何使用docker plugin去实现动态的jenkins slave添加。

devopscube,Devops魔方为个人公众号,主要用于一些有关Devops,容器,kubernetes,自动化运维,以及敏捷开发相关的分享。同时也会不定期的分享一些个人心得,比如推荐一些个人使用的办公小软件,对一些事件的评论等。欢迎大家关注交流。
在这里插入图片描述

你可能感兴趣的:(Devops)