devopscube,Devops魔方为个人公众号,主要用于一些有关Devops,容器,kubernetes,自动化运维,以及敏捷开发相关的分享。同时也会不定期的分享一些个人心得,比如推荐一些个人使用的办公小软件,对一些事件的评论等。欢迎大家关注交流。
Jenkins是开源的持续集成持续部署的组件,也是该领域的世界范围内的领导者。
随着Docker技术的不断成熟和普及,让持续集成持续部署的技术也有了长足的发展。通过Docker能够屏蔽各种底层的环境的差异,能够保证跨机器运行环境的统一。
使用Docker环境运行Jenkins具有以下优点:
我们采用docker hub上的官方镜像进行部署。
这里我们使用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即可看到相应的界面。
这里我们需要输入管理员密码,相应的内容在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
*************************************************************
安装完成!
这一次LTS的版本的界面风格较以前有比较大的改变。界面更加好看了一些。
我们新建一个简单的流水线示例
可以看到构建成功:
还记得我们将docker命令也挂载到容器中了吗,我们尝试添加运行docker命令的步骤。
修改pipeline, 添加docker -v尝试运行docker
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
sh 'docker -v'
}
}
}
}
我们可以看到成功运行并打印出宿主机的docker版本信息。
以上只是一个简单的例子,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'
}
}
}
}
这里我们看到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,自动化运维,以及敏捷开发相关的分享。同时也会不定期的分享一些个人心得,比如推荐一些个人使用的办公小软件,对一些事件的评论等。欢迎大家关注交流。