赞
踩
参考:
https://www.cnblogs.com/yy-cola/p/10457484.html
https://hub.docker.com/_/jenkins/
下面记录我的安装过程:
刚开始按照别的博客花里胡哨的直接docker pull jenkins
,安装的是2.60.3
版本的,在运行起来之后,安装插件时提示版本过低,一个插件都没有安装成功,由于用的docker部署的,所以没法直接更新,所以只好重新安装新版本了。
直接在Docker仓库https://hub.docker.com/search?type=image
里面搜jenkins
点进去第一个可以看到,版本是2.60.3
第二个里面有两种,weekly是每周更新的版本,另一个lts是最新的版本。
之前安装的时候选择的是:docker pull jenkins/jenkins
,下载的是英文版的,后面还要再安装中文插件,这次直接选择中文版的,我们可以在docker仓库里面看到,英文版的和中国定制版的。
可以看到k8s的还是很强的,下载量快是中国定制版的两倍了,这里我下载的是中国定制版。
使用命令:docker pull jenkinszh/jenkins-zh
下面的jenkins是之前用docker search jenkins
拉取的,可以看到有很多层结构,版本是2.60.3
显示Jenkins包大小是619M,拉取速度就看网速怎么样了。
然后使用docker inspect IMAGE ID
查看版本信息:
这里在usr下面创建了两个文件夹用来存放Jenkins的数据:/usr/soft/jenkins_home
用来映射Jenkins的地址,然后修改了权限为777
可以看到文件夹的权限为公共读写了,这样在Jenkins启动之后,就可以看到该文件夹下面会产生一些运行的文件,文件夹权限没有放开的换,该目录下是不会产生文件的,并且每次重启Jenkins后,都需要输入密码。
docker run -itd --name jenkins -p 8888:8080 -p 50000:50000 --restart always -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai -v /usr/soft/jenkins_home:/var/jenkins_home -v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven -v /etc/localtime:/etc/localtime jenkinszh/jenkins-zh
旧版本使用的命令,未挂载maven目录和时区,第一次部署后,只把localtime目录挂进去了,但是jenkins的时间还是跟系统时间错了8小时,查了之后发现还需要设置一个参数:-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai
,不过我懒得重新部署了,就直接使用了另一种方式,在现在运行的jenkins里面手动执行脚本修改时区:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
docker run -itd --name jenkins -p 8888:8080 -p 50000:50000 --restart always -v /usr/soft/jenkins_home:/var/jenkins_home jenkins
-p:此处我将本机的8888端口映射到容器的8080端口上(jenkins默认端口8080)
-v:将容器内的文件夹映射到主机上,前面是主机目录,后面是容器目录
这里将Jenkins的8080端口映射到宿主机的8888端口,50000端口对应映射到50000端口了。此时还没有指定maven目录和jdk目录。
由于第一次我没有指定50000端口的映射,然后关闭Jenkins容器后再次运行上面的命令时报错了,提示jenkins
名称已被占用,需重命名之后再次运行。
报错信息如下:
docker: Error response from daemon: Conflict. The container name “/jenkins” is already in use by container “9b6e345479d50133c6a0733593935eae8a28fd1697dcf78b736e67455bbf568e”. You have to remove (or rename) that container to be able to reuse that name.
See ‘docker run --help’.
这时需要先删除原来的启动痕迹:
查询docker运行过的容器痕迹:docker ps -a
删除原Jenkins痕迹:docker rm ID
再次运行即可。(不知道为什么--rm
指令不好使。看help里面提示:在运行Jenkins的命令里面加上--rm
,意思是先检测是否存在该容器,如果存在,则删除已存在的容器,然后运行。)
这时我们的Jenkins就已经启动了,可以查看下Jenkins的日志:
docker logs -f jenkins
2.60.3版本的可以看到会将Jenkins的密码打印出来:
2.225版本的日志是这样:
由于之前运行的时候没有指定jdk的目录,下面我们来看下当前Jenkins版本(2.225版本)中默认使用的jdk版本:
首先进入jenkins容器内部:docker exec -it 容器ID /bin/bash
,退出容器:exit
-----------------------------------------2021-03-08-分割线---------------------------------------
这次安装完中文版的jenkins,启动后查看日志,发现出现了各异常:
异常貌似是查询jenkins版本信息的。但是最后,显示正在运行了。。。。。。
版本是2.222.4
接着试下登录,复制上面的密码,登录成功后,提示安装插件,这里选择安装社区推荐插件,直接报错了:
点击重试,依然错误,然后换成第二项,选择合适的插件。
结果还是失败,直接全部取消勾选,等后面用到了再安装插件好了。 点击安装进入配置用户界面。
我们直接在浏览器里面访问IP+端口
即可,我这里是:192.168.3.3:8888
然后我们直接复制上面日志中的密码,或者进入Jenkins内部: docker exec -it jenkins bash
之后使用cat /var/jenkins_home/secrets/initialAdminPassword
也可看到密码,将密码输入上面的输入框里面,稍等片刻就可以看到Jenkins服务起来了,如果半天没响应可以重启Jenkins镜像:docker restart {CONTAINER ID}
服务起来之后会自动进入插件安装指引页面,这里我们选择第一个社区推荐的插件:
或者直接右上角的关闭按钮,后续自己选择插件的安装。
我试了下安装社区推荐的插件,但是特别慢,一直显示下面的页面,好半天了进度条才走一点点,还有两个失败的:
如果下载的是2.60.3版本的,由于版本太低,上面的插件会全部失败,这时可以重启Jenkins容器,然后直接关闭上面的插件指引页面。
这次使用中文版的,下载插件就很顺利,然后设置第一个管理员后进入配置Jenkins URL页面:
这里直接跳过了,点击下面的:现在不要
由于容器运行日志文件什么的,挂载到了宿主机的新目录里了,所以在我换了新版本之后,设置的密码仍然有效。
启动之后仍然是需要输入密码:查看密码步骤同上,输入密码之后,会弹出插件安装失败的页面,这时,直接back,然后右上角关闭插件安装指引页面,先进入Jenkins再说。
然后这里可以修改密码了,试下自定义密码:
点击右上角的admin进入再设置页面:
修改账号名称和密码:
保存之后,注销,然后测试新密码是否生效,其中用户名需要输入admin
,登录之后才会显示刚才自定义的用户名:
登录之后进入系统设置,这时可以看到安装插件失败是因为Jenkins的版本过低:
新版本是英文版的,这里安装中文插件,下载的中文版就可以跳过了:
在这里可以看到插件插件列表
翻到Local开头的,可以看到Local
和Localization: Chinese (Simplified)
勾选之后,直接安装
等待安装进度条走完,然后直接点击Go back使其生效。
刷新之后发现,插件对新版Jenkins支持效果并不是很理想,如果觉得不习惯可以在已安装插件里面卸载中文插件
下面安装其他插件:
插件安装参考:https://www.cnblogs.com/sxdcgaq8080/p/10489369.html
如果想实现Jenkins打包之后直接部署,则需要下载SSH插件,然后在打包后使用脚本文件运行项目即可。
我这里先安装了:
手动重启,直接使用URL重启即可:http://192.168.124.51:9999/restart
,点击是,进行重启
接着安装GitLab
和GitLab Hook
然后重启Jenkins。
---------------------------------------------下面是原来直接安装时遇到的错误信息。-----------------------------
安装GitLab和GitLab Hook时提示jdk已安装,需要重启Jenkins,并且还有一个VMI** 提示安装失败,然后我重启了Jenkins容器之后,失败的提醒没有了。
选择下载下次重启后安装。
这里只是安装了maven插件,后面打包maven项目时,还需要安装maven,然后配置maven仓库。
今天打开Jenkins 准备安装个新的插件,结果发现提示了一行信息: There were errors checking the update sites: SocketTimeoutException: connect timed out
强迫症有点不能忍,担心后面别安装插件失败了,想着先安装试下,选择直接安装后,果然提示超时异常了。
Checking internet connectivity Checking update center connectivity java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:607) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666) at sun.net.NetworkClient.doConnect(NetworkClient.java:175) at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1570) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:352) at hudson.model.UpdateCenter$UpdateCenterConfiguration.testConnection(UpdateCenter.java:1368) at hudson.model.UpdateCenter$UpdateCenterConfiguration.checkUpdateCenter(UpdateCenter.java:1151) at hudson.model.UpdateCenter$ConnectionCheckJob.run(UpdateCenter.java:1600) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:111) at java.lang.Thread.run(Thread.java:748)
解决办法:修改插件管理中心位置。
这里之前是:https://updates.jenkins-zh.cn/update-center.json
现在改成:http://updates.jenkins.io/update-center.json
,然后点击提交,立即获取。这个JSON文件的内容有点大,让它反应一会。然后重新操作之前的安装插件就可以了。
查看maven最新版本:https://maven.apache.org/download.cgi
当前最新版为3.6.3
,可以直接下载下面的tar.gz文件,然后使用ssh上传到linux下。
或者使用命令:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-
maven-3.6.3-bin.tar.gz
可以直接下载到当前目录:
如果提示没有wget命令,则安装:yum install -y wget
解压到当前文件夹:tar zxvf apache-maven-3.6.3-bin.tar.gz
配置环境变量:vim /etc/profile
,将下面两行加入环境变量最后
export MAVEN_HOME=/usr/soft/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
重新加载配置文件:source /etc/profile
查看maven版本:mvn -version
如果提示mvn 未找到命令
,则先检查下java
环境是否安装了。如果java环境正常,则检查环境变量里面的maven路径是否正确。
新建本地maven仓库:
首先进入apache-maven-3.6.3
文件夹,然后创建文件夹: mkdir LocalRepository
,修改文件夹权限为公共读写chmod 777 LocalRepository/
修改settings.xml文件,设置自定义仓库地址。
进入maven安装文件夹下的conf文件夹下,修改settings.xml文件:
可以看到,这里默认文件夹为Default: ${user.home}/.m2/repository
,并且是注释的内容。这里我们自定义改为
之前是使用的:/usr/soft/apache-maven-3.6.3/LocalRepository
,按正常来说确实应该这样设置,但是,这里是为了在jenkins里面使用maven构建,所以这个路径应该是上面挂载的maven里面的路径,所以应该用:/usr/local/maven/LocalRepository
。这里只是指定了本地仓库的路径,这个路径对于宿主机来说也是存在的。
然后配置maven使用阿里云远程仓库下载jar
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
最后在Jenkins全局配置里面设置自定义的maven路径:
--------------------------------------------------------- 分割线-2021-03-12 -------------------------------------------------------------------
这次安装的时候,修改了下面的默认settings配置
用了自定义的配置文件,按正常来说,既然maven里面已经指定了settings文件了,貌似就不用指定了,但是这里为了保险起见,还是手动制定下,避免不必要的问题。
下面的配置是原来装的,这里直接将启动Jenkins时,挂载的目录/usr/local/maven
给配上:
这里不要勾选自动安装。保存即可。
下面是之前服务器配置的:
下面maven安装那里需要配置一下本机maven安装路径:/usr/soft/apache-maven-3.6.3
。如果没有配置的话,在新建任务时,maven项目会提示:Jenkins needs to know where your Maven is installed. Please do so from the tool configuration.
注意不要勾选Install automatically
,忽略黄色警告,直接保存即可。
创建一个maven项目,拉取svn上面的代码,然后使用Jenkins的自动打包上传功能。
在Jenkins首页,点击左侧菜单栏中的新建Item
发现这次安装的Jenkins版本里面没有新建maven项目的选项,然后试着安装maven插件:
在可选插件里面搜索maven,下载Maven Integration
然后重启Jenkins:在浏览器中访问:http://IP:端口/restart
,然后点击“是”,即可重启Jenkins。然后可以看到下图中多了一个选择maven项目的选项。
设置任务名称,然后选择构建maven项目。如果已有存在的任务,可以直接在复制后面的输入框里面输入任务的名称,会自动匹配该任务,并且复制该任务的配置。
设置项目名之后,会进入下图页面:
无论代码在svn
上还是gitlab
上面,都是需要配置用户名和密码,然后才能有权限拉取代码的。
如果代码在gitlab上面,则这里需要注意一点,配置代码地址和分支后,构建时,指定pom文件时,注意pom文件的位置是否正确。
指定代码地址和分支:
指定pom文件:
构建的命令,这里我用了clean package -P dev,release
,这个是项目pom里面配置的。如果自己的项目里面没有指定打包相关的配置,可以直接默认即可。默认Root POM是pom.xml
,Goals and options这里应该是空白。
走到这里可以先测试下maven打包是否正常,直接保存,然后回到工作台,构建刚才创建的任务。
点击立即构建,则可以在左边的任务列表里面看到控制台日志:拉取代码,下载maven依赖包。
可以看到构建成功了,然后构建后的文件目录为:/var/jenkins_home/workspace
,但是这时要是去宿主机上找这个文件夹,是找不到的,因为这个路径是Jenkins容器里面的路径。Jenkins容器的所有操作都是在镜像内部操作的,但是我们在启动Jenkins的时候,将此目录给挂载出来了,-v /usr/soft/jenkins_home:/var/jenkins_home
,所以,可以去宿主机的/usr/soft/jenkins_home
下看到Jenkins打包的文件。在上面的路径下可以看到任务名对应的文件夹,该文件夹下面就是拉取的代码和构建的文件。
另外上图的maven仓库,也生效了,这里maven构建下载的依赖,也即是我们指定的文件夹了。
如果打包正常的话,再接着往下进行,配置上传打包文件,或者构建docker镜像。
---------------------------------------------------历史安装记录,配置svn---------------------------------------
由于公司代码在svn上面,这里源码管理里面没有svn,那么我们需要安装svn插件。
回到首页,进入设置:
然后选择插件管理:
在可选插件中,搜索Subversion
:
然后等待Jenkins自动下载安装即可,安装完成之后,可以直接返回首页。
这时在进入刚才新建的任务中,添加源码配置:
这里需要填入源码的路径,和SVN用户名称和密码。
点击添加,然后点击Jenkins的小房子图标,进入下图
上面的三项默认即可,输入用户名和密码、ID,其中ID和描述为非必填。
添加成功后没有任何提示,但是可以在配置页面的下拉框里面看到刚才新建的用户信息。
Pre Steps:可添加构建前的操作:
Build:默认即可。
Post Steps:构建之后的操作,这里可将构建的镜像上传到镜像仓库,可以看到构建步骤只有三项,没有docker,所以需要先安装docker插件。
系统管理-插件管理-可选插件-搜docker,选择插件后,可直接安装,如果失败了,可以尝试先下载待重启后安装。
失败了,看下详细信息,发现是超时了,然后选择重启后安装。然后进度条它动了!!!
安装成功之后,重启Jenkins可以看到,构建步骤中有了Execute Docker command
然后选择仅构建成功之后再运行步骤(构建镜像,然后推送镜像到镜像仓库):
192.168.3.3:5000
为镜像仓库地址,由于我这里没有设置验证,所以Registry credentials
那里为空。
其中$BUILD_NUMBER
为Jenkins自动帮我们维护的标号,每构建一次,number会自动+1.
这里保存后,需要配置docker.service
,否则会出现uri was not specified
异常,跳过下面构建的步骤,去配置docker.service
。
然后直接保存,保存成功可以回到首页,任务列表中会出现新建的任务,选择立即构建,然后点击右边执行状态中的项目名,可以看到构建过程。
不出现意外的话,就会自动下载依赖包了,第一次构建会比较慢。
如果因为本地私有jar包构建失败的话,可以看下具体的错误信息,成功了可以直接跳过这部分:
由于这里引用了maven仓库中没有的依赖(本地打的依赖),可以尝试手动上传依赖到服务器的maven仓库。如果手动设置了maven仓库的地址,可以直接上传。我这里自定义了仓库地址为:/usr/soft/apache-maven-3.6.3/LocalRepository
,如果找不到maven仓库地址的话,可以全局搜一下,find / -name ".m2"
,Jenkins默认的仓库地址为jenkins_home下的.m2文件夹
我这里直接上传zip压缩包到对应路径下,然后直接解压到当前路径下:
然后尝试再次构建。
果然没有这么顺利,又失败了,提示:/usr/soft/apache-maven-3.6.3/LocalRepository/com/alipay/sdk/alipay-trade-sdk/20161215/alipay-trade-sdk-20161215.pom.part.lock (Permission denied)
看下刚才解压的文件夹的属性,我解压的时候是root
操作的,所以解压文件夹的所有者是root
,而源文件夹(20161215_old)的所有者是linmengm...
那么我们来修改这个文件夹的所有者和所属用户组:
chown 是修改文件和目录的所有者和所属组的命令
-R: 递归设置权限,也就是给子目录中的所有文件设置权限
":“之前是文件的所有者,之后是所属组。这里的”:“也可以使用”."代替,如果只写一个,则代表只修改了文件的所有者。
再次构建,等待拉取依赖包,最后maven构建成功了,但是生成docker镜像却报错了。
但是上传镜像到docker仓库中却报错了:uri was not specified
INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10:12 min [INFO] Finished at: 2020-05-20T08:35:17Z [INFO] ------------------------------------------------------------------------ Waiting for Jenkins to finish collecting data [JENKINS] Archiving /var/jenkins_home/workspace/certify_tool_test/pom.xml to certify_tool/certify_tool/1.0.0/certify_tool-1.0.0.pom [JENKINS] Archiving /var/jenkins_home/workspace/certify_tool_test/target/certify_tool-1.0.0.jar to certify_tool/certify_tool/1.0.0/certify_tool-1.0.0.jar channel stopped ERROR: Build step failed with exception java.lang.NullPointerException: uri was not specified at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204) at com.github.dockerjava.core.DefaultDockerClientConfig$Builder.withDockerHost(DefaultDockerClientConfig.java:368) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.createDockerClient(DockerBuilder.java:130) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.getDockerClient(DockerBuilder.java:229) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.getDockerClient(DockerBuilder.java:221) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder.perform(DockerBuilder.java:70) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.build(MavenModuleSetBuild.java:946) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:896) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504) at hudson.model.Run.execute(Run.java:1880) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:428) Build step 'Execute Docker command' marked build as failure Finished: FAILURE
这时需要修改docker.service文件中的ExecStart
为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
至于docker.service的位置,我本机的位置在:/lib/systemd/system/docker.service
,我看网上博客有说修改/etc/sysconfig/docker
文件中的ExecStart
,我看了一下,发现没有此文件,不知道是不是因为docker版本不一致的问题又或者是修改了docker的配置文件。
修改docker.service
: vim /lib/systemd/system/docker.service
原来的docker.service 中这个参数的值为:ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
注释原来的,新增一行内容如下:
然后在jenkins管理界面中。系统管理-系统设置-Docker Builder 中,将Docker URL改成tcp://本机IP:2375
,保存。
开始没在意默认的unix:///var/run/docker.sock
命令中,包含了两个斜杠,var前面应该是有三个斜杠
,这个如果不对的话,还是不能正常构建的。
保存后构建提示异常信息:
ERROR: Build step failed with exception java.net.URISyntaxException: Illegal character in authority at index 6: tcp://192.168.3.3:2375 at java.net.URI$Parser.fail(URI.java:2848) at java.net.URI$Parser.parseAuthority(URI.java:3186) at java.net.URI$Parser.parseHierarchical(URI.java:3097) at java.net.URI$Parser.parse(URI.java:3053) at java.net.URI.<init>(URI.java:588) at java.net.URI.create(URI.java:850) Caused: java.lang.IllegalArgumentException: Illegal character in authority at index 6: tcp://192.168.3.3:2375 at java.net.URI.create(URI.java:852) at com.github.dockerjava.core.DefaultDockerClientConfig$Builder.withDockerHost(DefaultDockerClientConfig.java:369) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.createDockerClient(DockerBuilder.java:130) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.getDockerClient(DockerBuilder.java:229) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder$DescriptorImpl.getDockerClient(DockerBuilder.java:221) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder.perform(DockerBuilder.java:70) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.build(MavenModuleSetBuild.java:946) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:896) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504) at hudson.model.Run.execute(Run.java:1880) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:428) Build step 'Execute Docker command' marked build as failure Finished: FAILURE
第一次修改成ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:4234 -H unix:///var/run/docker.sock
结果提示下面的失败信息:
[Docker] INFO: Pushing image 192.168.3.3:5000/lmm/certify_tool_test:1.0_8 [Docker] ERROR: Failed to exec start:Connect to 127.0.0.1:4243 [/127.0.0.1] failed: Connection refused (Connection refused) [Docker] ERROR: failed to push image 192.168.3.3:5000/lmm/certify_tool_test:1.0_8 ERROR: Build step failed with exception java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:607) at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) Caused: org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:4243 [/127.0.0.1] failed: Connection refused (Connection refused) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:435) at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:252) at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:228) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697) at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:448) at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:349) at com.github.dockerjava.jaxrs.async.POSTCallbackNotifier.response(POSTCallbackNotifier.java:29) at com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier.call(AbstractCallbackNotifier.java:50) at com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier.call(AbstractCallbackNotifier.java:24) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused: java.lang.RuntimeException at com.google.common.base.Throwables.propagate(Throwables.java:156) at com.github.dockerjava.core.async.ResultCallbackTemplate.getFirstError(ResultCallbackTemplate.java:133) at com.github.dockerjava.core.async.ResultCallbackTemplate.awaitCompletion(ResultCallbackTemplate.java:94) at com.github.dockerjava.core.command.PushImageResultCallback.awaitSuccess(PushImageResultCallback.java:41) at org.jenkinsci.plugins.dockerbuildstep.cmd.remote.PushImageRemoteCallable.call(PushImageRemoteCallable.java:69) at org.jenkinsci.plugins.dockerbuildstep.cmd.remote.PushImageRemoteCallable.call(PushImageRemoteCallable.java:26) at hudson.remoting.LocalChannel.call(LocalChannel.java:45) at org.jenkinsci.plugins.dockerbuildstep.cmd.PushImageCommand.execute(PushImageCommand.java:76) Caused: java.lang.IllegalArgumentException at org.jenkinsci.plugins.dockerbuildstep.cmd.PushImageCommand.execute(PushImageCommand.java:81) at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder.perform(DockerBuilder.java:77) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.build(MavenModuleSetBuild.java:946) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:896) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504) at hudson.model.Run.execute(Run.java:1880) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:428) Build step 'Execute Docker command' marked build as failure Finished: FAILURE
上面项目是使用的公司的小项目,随意修改不太合适,我这里搭建了一个简单的SpringBoot项目,然后新建了一个job,copy的certify_tool_test的配置:
也就是说,在配置成功一个项目,后面新项目都可以直接复制原来的配置,修改代码路径和镜像名称即可。
至此,如果能打包成功,那么便是完成了第一步:
下面就是打包成镜像了。
在项目的根目录下创建一个Dockerfile(跟pom文件在同一路径)
里面就是项目的各种配置:
FROM 192.168.3.3:5000/jdk8:latest
RUN yum install net-tools.x86_64 -y
ADD target/jenkins_demo-1.0.0.jar /workspace/jenkins_demo-1.0.0.jar
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENTRYPOINT [ "sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Dlog.path.prefix=/logs/${log_path}/$(date '+%Y-%m-%d_%H:%M:%S')_$(ifconfig eth0 | grep 'inet ' | awk '{ print $2}') -jar /workspace/jenkins_demo-1.0.0.jar"]
简单了解一下Dockerfile中的内容:
项目的运行环境是很重要的,首先是从镜像仓库拉取jdk版本。前提是你的镜像仓库中要有jdk镜像。记得当时构建jdk镜像是参考:使用Docker构建jdk1.8镜像。
构建成功后,可以查看镜像仓库中的镜像浏览器访问http://IP:镜像仓库的端口/v2/_catalog
我这里是:http://192.168.3.3:5000/v2/_catalog
这里的jdk8,就是我们需要拉取的jdk镜像,也就是Dockerfile的第一句。
然后安装net-tools工具。
第三步:将上面打的jenkins_demo-1.0.0.jar包copy到workspace下。
第四步:指定时区。
五六步:设置运行环境为UTF-8,避免日志乱码等问题。
最后定义当前jar包运行的各种参数。
maven打包正常之后,就会开始执行Dockerfile的内容了,下图的蓝色日志信息:
成功之后,再次查看镜像仓库的镜像:
在系统全局设置里面,配置镜像仓库的地址:
保存之后,可以看到立即构建:
【Devops】【docker】【CI/CD】1.docker搭建Gitlab环境
【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。