【问题标题】:gitlab-ci build asp.net core dockergitlab-ci 构建 asp.net 核心 docker
【发布时间】:2020-12-24 03:59:26
【问题描述】:

我正在开发一个 gitlab CI/CD 项目,以将 asp.net core 应用程序构建到 docker 中。 目前我有两种可能的实现方式。第一个在Dockerfile 中有完整的逻辑,但我无法以这种方式可视化 Gitlab 中的阶段(构建、测试、发布)。所以我想把主要逻辑移到gitlab-ci.yml文件中。但现在困扰我的是我必须在 2 个地方(sdk:3.1,aspnet:3.1.1-alpine3.10)管理图像docker dotnet versions。通过build-arg 提供版本是个好主意还是有更优雅的解决方案?

.gitlab-ci.yml

stages:
  - build
  - test
  - docker

build:
  stage: build
  image: mcr.microsoft.com/dotnet/core/sdk:3.1
  only:
    - master
  script:
    - cd src
    - dotnet restore --interactive
    - dotnet build --configuration Release
    - dotnet publish --configuration Release --output ../publish/
  artifacts:
    paths:
      - ./publish/*.*
    expire_in: 1 week
  tags:
  - docker

test:
  stage: test
  image: mcr.microsoft.com/dotnet/core/sdk:3.1
  only:
    - master
  script:
    - cd src
    - dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=../../MyProject.xml"
  artifacts:
    paths:
      - ./MyProject.xml
    reports:
      junit: ./MyProject.xml
  tags:
  - docker

docker:
  stage: docker
  image: docker:stable
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  only:
    - master
  script:
    - docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY
    - docker build --tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" --tag "$CI_REGISTRY_IMAGE:latest" --build-arg EXECUTABLE=Test.WebApi.dll .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$CI_REGISTRY_IMAGE:latest"
  tags:
  - docker

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.1-alpine3.10
ARG EXECUTABLE

WORKDIR /app
COPY /publish .

ENV ASPNETCORE_URLS "http://*:5000"
ENV ASPNETCORE_ENVIRONMENT "Staging"
CMD ["dotnet", "$EXECUTABLE"]

【问题讨论】:

    标签: docker asp.net-core gitlab gitlab-ci


    【解决方案1】:

    这是我的解决方案,我已经定义了上面的变量并在docker文件中将它们替换为sed

    我的解决方案有这两个项目

    • Test.WebApi(WebApi 项目)
    • Test.WebApi.UnitTest(单元测试项目)

    @ThomasBrüggemann 感谢您的启发。

    .gitlab-ci.yml

    variables:
        PROJECT_NAME: "Test.WebApi"
        BUILD_IMAGE: "mcr.microsoft.com/dotnet/core/sdk:3.1"
        RUNTIME_IMAGE: "mcr.microsoft.com/dotnet/core/aspnet:3.1.1-alpine3.10"
    
    stages:
      - build
      - test
      - docker
    
    build:
      stage: build
      image: $BUILD_IMAGE
      only:
        - master
      script:
        - cd src/$PROJECT_NAME
        - dotnet restore --interactive
        - dotnet build --configuration Release
        - dotnet publish --configuration Release --output ../../publish/
      artifacts:
        paths:
          - ./publish/*
        expire_in: 1 week
      tags:
      - docker
      
    test:
      stage: test
      image: $BUILD_IMAGE
      only:
        - master
      script:
        - cd src/$PROJECT_NAME.UnitTest
        - dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=../../UnitTestResult.xml"
      artifacts:
        paths:
          - ./UnitTestResult.xml
        reports:
          junit: ./UnitTestResult.xml
      tags:
      - docker
    
    docker:
      stage: docker
      image: docker:stable
      services:
        - docker:18.09.7-dind
      variables:
        DOCKER_DRIVER: overlay2
        DOCKER_TLS_CERTDIR: ""
      only:
        - master
      script:
        # Prepare Dockerfile
        - sed -i "s~\$DOCKERIMAGE~$RUNTIME_IMAGE~g" Dockerfile
        - sed -i 's/$ENVIRONMENT/Staging/g' Dockerfile
        - sed -i "s/\$ENTRYPOINT/$PROJECT_NAME.dll/g" Dockerfile
    
        # Process Dockerfile
        - docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY
        - docker build --tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" --tag "$CI_REGISTRY_IMAGE:latest" .
        - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
        - docker push "$CI_REGISTRY_IMAGE:latest"
      tags:
      - docker
    

    Dockerfile

    FROM $DOCKERIMAGE
    
    WORKDIR /app
    COPY /publish .
    
    EXPOSE 5000/tcp
    
    ENV ASPNETCORE_URLS "http://*:5000"
    ENV ASPNETCORE_ENVIRONMENT "$ENVIRONMENT"
    CMD ["dotnet", "$ENTRYPOINT"]
    

    【讨论】:

    • GitLab 中的 Docker 镜像有什么问题吗?
    • @NiAu 他们在说什么问题?
    • 表示GitLab找不到dotnet的docker镜像
    【解决方案2】:

    这里是 GitLab-Pipeline 中标记时的一些版本处理:

    script:
        - COMMIT_DATE=$(git log -1 --format=%cd --date=iso-strict | grep -o '\([0-9]*\)' | tr -d '\n')
        - VERSION_PREFIX=$CI_COMMIT_TAG
        - VERSION_SUFFIX="${COMMIT_DATE::-6}"
        - echo $VERSION_PREFIX-$VERSION_SUFFIX
        - sed -i "s:<VersionPrefix>.*</VersionPrefix>:<VersionPrefix>$VERSION_PREFIX</VersionPrefix>:g" [PROJECT].csproj
        - dotnet publish --version-suffix $VERSION_SUFFIX -c Release -o ./out
        - docker build --tag "$CI_REGISTRY_IMAGE:$VERSION_PREFIX"
    only:
        - tags     
    

    在项目文件中必须

    <!-- Version is set by CI-Script do not modify manually -->
    <VersionPrefix>0.0.0</VersionPrefix>
    <Deterministic>False</Deterministic>
    

    设置

    也许这会有所帮助。 在没有标记的情况下构建时可以做类似的事情。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2018-02-13
      相关资源
      最近更新 更多