Docker安装Jenkins

posts/docker%E5%AE%89%E8%A3%85jenkins

Jenkins 是一款由 Java 编写的开源的持续集成工具。在与 Oracle 发生争执后,项目从 Hudson 项目复刻。 Jenkins 提供了软件开发的持续集成服务。它运行在 Servlet 容器中(例如 Apache Tomcat)。它支持软件配置管理(SCM)工具(包括 AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase 和 RTC),可以执行基于 Apache Ant 和 Apache Maven 的项目,以及任意的 Shell 脚本和 Windows 批处理命令。Jenkins 的主要开发者是川口耕介。Jenkins 是在 MIT 许可证下发布的自由软件。 可以通过各种手段触发构建。例如提交给版本控制系统时被触发,也可以通过类似 Cron 的机制调度,也可以在其他的构建已经完成时,还可以通过一个特定的 URL 进行请求。 Wikipedia

安装 Jenkins

为了今后方便部署 Jenkins 本文使用 Docker 进行安装

搜索镜像

$ docker search jenkins
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
jenkins                                DEPRECATED; use "jenkins/jenkins:lts" instead   5324      [OK]
jenkins/jenkins                        The leading open source automation server       2692
jenkinsci/blueocean                    https://jenkins.io/projects/blueocean           640
jenkinsci/jenkins                      Jenkins Continuous Integration and Delivery …   391
jenkins/jnlp-slave                     a Jenkins agent which can connect to Jenkins…   148                  [OK]
jenkinsci/jnlp-slave                   A Jenkins slave using JNLP to establish conn…   134                  [OK]
jenkinsci/slave                        Base Jenkins slave docker image                 66                   [OK]
jenkins/slave                          base image for a Jenkins Agent, which includ…   48                   [OK]
jenkinsci/ssh-slave                    A Jenkins SSH Slave docker image                44                   [OK]
jenkins/ssh-slave                      A Jenkins slave using SSH to establish conne…   37                   [OK]
cloudbees/jenkins-enterprise           CloudBees Jenkins Enterprise (Rolling releas…   36                   [OK]
h1kkan/jenkins-docker                  🤖 Extended Jenkins docker image, bundled wi…    29
xmartlabs/jenkins-android              Jenkins image for Android development.          28                   [OK]
openshift/jenkins-2-centos7            A Centos7 based Jenkins v2.x image for use w…   23
cloudbees/jenkins-operations-center    CloudBees Jenkins Operation Center (Rolling …   14                   [OK]
jenkins/ssh-agent                      Docker image for Jenkins agents connected ov…   12
vfarcic/jenkins-swarm-agent            Jenkins agent based on the Swarm plugin         8                    [OK]
openshift/jenkins-slave-base-centos7   A Jenkins slave base image. DEPRECATED: see …   7
trion/jenkins-docker-client            Jenkins CI server with docker client            6                    [OK]
publicisworldwide/jenkins-slave        Jenkins Slave based on Oracle Linux             5                    [OK]
openshift/jenkins-1-centos7            DEPRECATED: A Centos7 based Jenkins v1.x ima…   4
ansibleplaybookbundle/jenkins-apb      An APB which deploys Jenkins CI                 1                    [OK]
amazeeio/jenkins-slave                 A jenkins slave that connects to a master vi…   0                    [OK]
jameseckersall/jenkins                 docker-jenkins (based on openshift jenkins 2…   0                    [OK]
mashape/jenkins                        Just a jenkins image with the AWS cli added …   0                    [OK]

可看到第一个为官方镜像, 但已弃用, DESCRIPTION 推荐使用jenkins/jenkins:lts

拉取镜像

pull从仓库拉取 Jenkins 镜像

$ docker pull jenkins/jenkins:lts
lts: Pulling from jenkins/jenkins
4c25b3090c26: Pull complete
750d566fdd60: Pull complete
2718cc36ca02: Pull complete
5678b027ee14: Pull complete
c839cd2df78d: Pull complete
50861a5addda: Pull complete
ff2b028e5cf5: Pull complete
ee710b58f452: Pull complete
2625c929bb0e: Pull complete
6a6bf9181c04: Pull complete
bee5e6792ac4: Pull complete
6cc5edd2133e: Pull complete
c07b16426ded: Pull complete
e9ac42647ae3: Pull complete
fa925738a490: Pull complete
4a08c3886279: Pull complete
2d43fec22b7e: Pull complete
Digest: sha256:a942c30fc3bcf269a1c32ba27eb4a470148eff9aba086911320031a3c3943e6c
Status: Downloaded newer image for jenkins/jenkins:lts
docker.io/jenkins/jenkins:lts

创建并启动容器

创建容器

  • 将容器名设置为jenkins
  • 容器端口与主机端口进行同步绑定
  • 主机/var/jenkins_home与容器目录映射
$ docker run --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2021-09-30 13:14:27.804+0000 [id=1]	INFO	org.eclipse.jetty.util.log.Log#initialized: Logging initialized @491ms to org.eclipse.jetty.util.log.JavaUtilLog
2021-09-30 13:14:27.883+0000 [id=1]	INFO	winstone.Logger#logInternal: Beginning extraction from war file
2021-09-30 13:14:28.650+0000 [id=1]	WARNING	o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2021-09-30 13:14:28.694+0000 [id=1]	INFO	org.eclipse.jetty.server.Server#doStart: jetty-9.4.42.v20210604; built: 2021-06-04T17:33:38.939Z; git: 5cd5e6d2375eeab146813b0de9f19eda6ab6e6cb; jvm 11.0.12+7
2021-09-30 13:14:28.929+0000 [id=1]	INFO	o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2021-09-30 13:14:28.962+0000 [id=1]	INFO	o.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0
2021-09-30 13:14:28.962+0000 [id=1]	INFO	o.e.j.s.s.DefaultSessionIdManager#doStart: No SessionScavenger set, using defaults
2021-09-30 13:14:28.963+0000 [id=1]	INFO	o.e.j.server.session.HouseKeeper#startScavenging: node0 Scavenging every 600000ms
2021-09-30 13:14:29.332+0000 [id=1]	INFO	hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2021-09-30 13:14:29.461+0000 [id=1]	INFO	o.e.j.s.handler.ContextHandler#doStart: Started w.@3a01773b{Jenkins v2.303.1,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
2021-09-30 13:14:29.481+0000 [id=1]	INFO	o.e.j.server.AbstractConnector#doStart: Started ServerConnector@3f0846c6{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2021-09-30 13:14:29.482+0000 [id=1]	INFO	org.eclipse.jetty.server.Server#doStart: Started @2170ms
2021-09-30 13:14:29.482+0000 [id=25]	INFO	winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2021-09-30 13:14:29.667+0000 [id=32]	INFO	jenkins.InitReactorRunner$1#onAttained: Started initialization
2021-09-30 13:14:29.688+0000 [id=43]	INFO	jenkins.InitReactorRunner$1#onAttained: Listed all plugins
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/var/jenkins_home/war/WEB-INF/lib/guice-4.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2021-09-30 13:14:30.627+0000 [id=45]	INFO	jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2021-09-30 13:14:30.631+0000 [id=35]	INFO	jenkins.InitReactorRunner$1#onAttained: Started all plugins
2021-09-30 13:14:30.637+0000 [id=36]	INFO	jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2021-09-30 13:14:31.152+0000 [id=34]	INFO	jenkins.InitReactorRunner$1#onAttained: System config loaded
2021-09-30 13:14:31.153+0000 [id=35]	INFO	jenkins.InitReactorRunner$1#onAttained: System config adapted
2021-09-30 13:14:31.154+0000 [id=45]	INFO	jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2021-09-30 13:14:31.154+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2021-09-30 13:14:31.166+0000 [id=58]	INFO	hudson.model.AsyncPeriodicWork#lambda$doRun$0: Started Download metadata
2021-09-30 13:14:31.176+0000 [id=58]	INFO	hudson.util.Retrier#start: Attempt #1 to do the action check updates server
2021-09-30 13:14:31.487+0000 [id=44]	INFO	jenkins.install.SetupWizard#init:

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

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

c0287527ff2d4f24b169f134334477d3

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

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

2021-09-30 13:14:53.623+0000 [id=58]	INFO	h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2021-09-30 13:14:53.624+0000 [id=58]	INFO	hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
2021-09-30 13:14:53.626+0000 [id=58]	INFO	hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished Download metadata. 22,458 ms
2021-09-30 13:14:58.200+0000 [id=38]	INFO	jenkins.InitReactorRunner$1#onAttained: Completed initialization
2021-09-30 13:14:58.214+0000 [id=24]	INFO	hudson.WebAppMain$3#run: Jenkins is fully up and running

cc0287527ff2d4f24b169f134334477d3就是默认的 admin 密码了

此时关闭终端 jenkins 自然会退出

启动容器

重新打开终端用 docker 启动jenkins容器

$ docker start jenkins
jenkins

确认容器是否正常运行

$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
6246498b082a   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   14 minutes ago   Up 12 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins

可以看到容器已经成功运行

Jenkins 初体验

启动 Jenkins

打开浏览器地址栏输入localhost:8080即可进入 jenkins

配置 Jenkins(Getting Started)

首次登陆 Jenkins 会进入默认配置向导

解锁以进行下一步配置(Unlock Jenkins)

为确保管理员登陆需要输入管理员密码(为初次构建容器输出时密码)

管理员密码也保存在容器的/var/jenkins_home/secrets/initialAdminPassword

自定义你的扩展补丁(Customize Jenkins)

有两种选项供我们选择, 由于不是特殊使用我个人选择第一项安装推荐补丁

  • Install suggested plugins
  • Select plugins to install

下面就是进行安装补丁过程(需要 7-8 分钟的时间)

包括一些常用的如 Git, SSH, Email Extension, Ant, Gradle 等工具

配置管理员信息(Setup of an admin user)

这里添加一些管理员信息如密码等(可以跳过)

后续 Jenkins URL 也跳过

点击 Start Using Jenkins 即可使用 Jenkins