我正在尝试用jenkins实现docker,不确定我是否走对了。
给出: 从Windows在Docker上运行jenkins 计划从github上获取代码,构建解决方案,以某种方式在容器上运行功能测试等
我目前正在做什么:
(1)在Windows上安装Docker
(2)使用以下命令在Docker上成功启动Jenkins “ docker run –name myJenkins -p 8080:8080 -p 50000:50000 -v〜/ Jenkins:/ var / jenkins_home / jenkins / jenkins:lts” 我相信此步骤将docker卷绑定到我的主机的目录。这使我可以查看和访问Jenkins内容。
(3)在主机的Jenkins目录中,创建了一个plugin.txt(包含我要安装的各种Jenkins插件)和一个Dockerfile。 Dockerfile将指定的插件安装在plugins.txt文件中。
FROM jenkins/jenkins:lts COPY plugins.txt /usr/share/jenkins/ref/plugins.txt RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
(4)在Windows命令提示符下,我使用命令“ docker build -t new_jenkins_image”构建了Dockerfile。 (5)我停止当前容器“ myJenkins”,并使用命令“ docker run –name myJenkins2 -p 8080:8080 -p 50000:50000 -v〜/ Jenkins:/ var / jenkins_home / new_jenkins_image”创建一个新容器。这会使用新安装的jenkins插件加载Jenkins。
我被困/困惑的地方
(1)每当我想通过Dockerfile安装新的jenkins插件时,是否都必须使用新名称创建一个新容器?这似乎也是一个手动过程...必须有更好的方法。
(2)我使用“来自SCM的管道脚本”选项开始了一个基本的詹金斯管道作业。我输入了正确的存储库URL和凭证,但现在“脚本路径”留为空白(我还没有Jenkinsfile)。当我执行构建时,Jenkins并未从github上获取代码。
java.lang.IllegalArgumentException: Empty path not permitted. at org.eclipse.jgit.treewalk.filter.PathFilter.create(PathFilter.java:80) at org.eclipse.jgit.treewalk.TreeWalk.forPath(TreeWalk.java:205) at org.eclipse.jgit.treewalk.TreeWalk.forPath(TreeWalk.java:249) at org.eclipse.jgit.treewalk.TreeWalk.forPath(TreeWalk.java:281) at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:171) at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:165) at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:193) at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29) at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:72) at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.java:189) at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.java:165) at jenkins.scm.api.SCMFile.contentAsString(SCMFile.java:338) at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:110) at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:67) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:293) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:429) Finished: FAILURE
我相信这是因为Docker容器未安装git吗?该容器无法从我的主机访问Git或MSBuild ...是否需要在这里创建一个新容器以简单地获取代码?
有人可以向我解释我所缺少的内容或哪里出错了吗?
据我了解,该过程如下:创建新的管道作业->从scm选择管道脚本->输入回购URL,凭据,要构建的分支和Jenkinsfile-> Jenkinsfile将执行编译,测试和部署指令
Dockerfile在这里起什么作用?我的思考过程是否正确?
答案 0 :(得分:0)
如果更改/更新图像,则每次都需要创建容器。但不需要每次都重新命名。您是否停止并删除了先前运行的容器?如果不是这样,码头工人会给出错误,例如同名容器无法启动。因此,停止并卸下以前的容器。您将能够使用更新的图像启动新的容器。
是的,您需要在同一容器中安装git才能提取代码。它无法在主机上访问git。但是,您显示的错误类似于验证错误。 (我的意思是,詹金斯甚至在尝试拉出代码之前都会验证输入。如果添加一些假名称,它将抛出下一个错误,例如找不到git)
您的想法正确无误。创建新的管道作业->从scm中选择管道脚本->输入回购URL,凭据,要构建的分支和Jenkinsfile-> Jenkinsfile将执行指令进行编译,测试和部署。
在问题的最后,您提到了不同的Dockerfile,我假设您正在谈论存储库(git)中的Dockerfile。您可以在Docker代理中运行管道。这样就无需在jenkins主机上设置所有内容,这意味着您无需安装依赖项即可在主机上运行管道代码,例如,如果您尝试在管道中执行一些nodejs代码,则需要在Jenkins主机上设置nodejs,然后再运行管道,要摆脱这一点,您可以在预先设置了一切的容器中运行管道。但是我不认为如果您在docker中运行Jenkins本身,则无法使用此功能。在这种情况下,您需要直接在主机上设置Jenkins。