首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用docker和jenkins部署编译语言项目的最佳方法是什么?

使用docker和jenkins部署编译语言项目的最佳方法是什么?
EN

DevOps用户
提问于 2017-09-06 04:50:05
回答 2查看 146关注 0票数 1

我有一个java项目,我正在生成.jar文件。我的问题是,使用docker和jenkins构建和部署项目的最佳实践是什么?它是用一个坞映像构建jar,然后将Jar文件放到另一个坞映像中,然后从生产env中的最后一个映像运行一个容器,还是有更好的方法来做到这一点?

EN

回答 2

DevOps用户

发布于 2017-09-06 08:13:53

我不知道Jenkins怎么样,但是GitLab CI有一个名为工件的特性,它允许您

  • 在构建之间明确地共享一些文件/目录。
  • 从GitLab管道视图下载它们

额外的专业是,它允许您进行部署手动操作。

另外,如果您正在构建脂肪罐,那么您的部署根本不需要Docker。

因此,对于您来说,最好的解决方案是有单独的任务来构建发行版和单独进行部署(这可以是手工作业,也可以不是手工作业)。

票数 2
EN

DevOps用户

发布于 2019-01-29 19:01:24

因此,假设Docker和Jenkins被设置为如前所述,我会说您的方法包括:在一个容器中构建Jar,获取Jar并使用它构建一个映像,然后根据该映像为您的环境构建容器。

关于如何设置它的一些想法:

让一个码头主机(或蜂群)运行,并在上面启动Jenkins服务。这是我正在运行的一个撰写文件:

代码语言:javascript
复制
version: '3.7'

services:
  jenkins-local:
    user: root
    image: jenkinsci/blueocean
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ../../..:/var/projects
      - ./jenkins_home:/var/jenkins_home
    ports:
      - "9000:8080"

volumes:
  jenkins-home:

重要的部分是将主机的/var/run/docker.sock安装到容器的/var/run/docker.sock的卷。这允许Jenkins通过Docker套接字访问主机的Docker守护进程(确保"user“是"root")。在这里可以找到一些关于这方面的阅读:https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

我之所以选择jenkinsci/“蓝海”图像,是因为它允许使用蓝海管道。https://jenkins.io/projects/blueocean/

在管道中,您可以编写Jenkinsfiles来定义构建管道:

代码语言:javascript
复制
node {
    stage('checkout scm') {
        checkout scm
    }
    stage('Build artifact') {
        // Connect to our Nexus Docker repository with the nexus_jenkins_user user credentials managed in Jenkins
        docker.withRegistry('https://registry.swarm', 'nexus_jenkins_user') {
            // Run a Maven builder image and attach it to the nexus network
            // Add a volume to cache the maven-repo in for consecutive runs
            docker.image('registry.swarm/builder/maven:maven-3.3.9').inside('-v maven-repo:/root/.m2 --network=nexus_nexus') {
                sh 'mvn clean package -Dmaven.test.failure.ignore=true'
            }
        }
    }
    stage('archive artifacts and save test results') {
        archiveArtifacts artifacts: "target/*.jar", fingerprint: true
        junit 'target/surefire-reports/*.xml'
    }
    stage('Build run container image, push Docker image to nexus') {
        docker.withRegistry('https://registry.swarm', 'nexus_jenkins_user') {
            docker.build("app/my-service:current").push()
        }
    }
}

由于所有事情都发生在Jenkins Workspace中,所以Dockerfile的唯一重要行是以下一行:

代码语言:javascript
复制
COPY ./target/my-service-*.jar ./my-service.jar

CMD [ "java", "-Duser.timezone=UTC", "-jar", "my-service.jar"]

这将捕获jar,复制它并将其用于映像中的run命令。

票数 0
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/1930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档