【问题标题】:How to build .net core application in Jenkins using docker and push it to ECR?如何使用 docker 在 Jenkins 中构建 .net 核心应用程序并将其推送到 ECR?
【发布时间】:2020-01-27 09:33:15
【问题描述】:

您好,我正在学习使用 Jenkins 和 AWS 为我的 .net 核心应用程序构建管道。我在https://github.com/niranjan2020/JenkinsPipeLine 创建了示例应用程序 我在本地下载了 Jenkins 并在端口 8080 上运行。我创建了用于创建 Jenkins 管道的管道模板。

pipeline {
    agent any

    options {
        skipDefaultCheckout true
    }

    stages {
        stage('checkout') {
            steps {
                checkout scm
            }
        }

        stage('First Stage') {
            steps {
                echo "Yay! First stage is executed"
            }
        }
stage('Build') {
           agent {
              docker {
          image 'microsoft/dotnet:2.1-sdk'
          args '-u root:root'
        }
      }

      steps {
        sh 'apt update'
        sh 'apt install -y apt-transport-https'

        // sh 'echo "{\\\"buildNumber\\\":\\\"${BUILD_NUMBER}\\\", \\\"sha\\\":\\\"need to populate\\\"}" > Jenkins/buildinfo.json'
        sh 'echo Hi'
        sh 'chmod a+rw -R .'
        stash name: 'Jenkins-out', includes: 'Jenkins/out/**'
      }
    }
}
}

我想使用 docker 构建我的 .net 核心应用程序并将图像放入 ECR。使用上面的代码我能够执行第一阶段,但我无法执行第二阶段。

process apparently never started in C:\Program Files (x86)\Jenkins\workspace\ECS@2@tmp\durable-8251f4a8
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)

我收到此错误消息。在上面的存储库中,我没有添加 docker 文件。我需要添加它吗?有人可以帮我解决这个问题吗?任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: docker jenkins .net-core amazon-ecs


    【解决方案1】:

    如果您想在 ECR 上推送图像,那么您应该将每个依赖项放在您的 dockerfile 中,就像在 Jenkins 中一样,您可以运行 postscript,在容器中为您安装 depencey,但在 AWS ECR 中并非如此。您的 Docker iamge 应该能够在没有任何 post 脚本的情况下运行。

    你的 Dockerfile 看起来像

    FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
    WORKDIR /app
    COPY *.csproj ./
    RUN dotnet restore
    COPY . ./
    RUN dotnet publish -c Release -o output
    # Runtime image
    FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
    WORKDIR /app
    COPY --from=build-env /app/output .
    ENTRYPOINT ["dotnet", "DotNetProject.dll"]
    

    build-env 将在第一阶段构建您的应用,第二个将从构建阶段复制构建应用。

    如果您在 AWS VPC 中使用 Jenkins 服务器,请将 role 分配给有权访问 ECR 的 Jenkins 服务器。

    如果在外面跑,那么喂credential

    node {
      stage 'Checkout'
      git 'ssh://https://github.com/niranjan2020/JenkinsPipeLine'
    
      stage 'Docker build'
      docker.build('demo')
    
      stage 'Docker push'
      docker.withRegistry('https://1234567890.dkr.ecr.us-east-1.amazonaws.com', 'ecr:us-east-1:demo-ecr-credentials') {
        docker.image('demo').push('latest')
      }
    }
    

    使用您的 ECR 更新注册表 URL。

    您可以进一步查看here

    【讨论】:

    • 感谢您的回答 Adiii。那么我是否需要像上面那样更改我的 docker 文件(你在答案中发布了一个)以及上面的 jenkins 文件?
    • 是的,当然你需要更改你的 Dockerfile,ECR 需要所有的 docker 镜像,你可以运行 postscript,但我不建议这样做。
    • 我在使用 git 'ssh://github.com/niranjan2020/JenkinsPipeLine' 进行连接时遇到问题。我已经在 Configure 中配置了 Git。这里需要这一步吗?下一个 docker.build('demo') docker 执行构建的地方?在我的本地系统中?
    • 另外,在 docker build 期间,我收到错误过程显然从未在 C:\Program Files (x86)\Jenkins\workspace\ECS@tmp\durable-305ac4cd 中启动(使用 -Dorg.jenkinsci 临时运行 Jenkins .plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true 可能会使问题更清楚)。我可以知道会是什么问题
    • git 有什么问题?尝试使用 https 而不是 ssh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2020-04-11
    • 2020-01-30
    • 2021-04-29
    • 2017-08-13
    • 2020-11-17
    • 2018-06-14
    相关资源
    最近更新 更多