我在本地安装了Gitlab。我有两个项目:一个工具包(项目1)和第二个项目(项目2),第二个项目使用的是第一个项目的nuget包。nuget包存储在项目1的Gitlab包注册表中。
我想创建一个项目2的Docker映像,并将其存储在项目2的Gitlab容器注册表中。
我的gitlab-ci.yml文件如下:
stages:
- deploy
deploy-solution:
stage: deploy
image: docker:20.10.16
services:
- docker:20.10.16-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build --pull -t $CI_REGISTRY_IMAGE --build-arg TOKEN=$CI_JOB_TOKEN --no-cache .
- docker push $CI_REGISTRY_IMAGE
only:
- main
字符串
我的nuget.config文件如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="gitlab" value="https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json" />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceCredentials>
<gitlab>
<add key="Username" value="gitlab-ci-token" />
<add key="ClearTextPassword" value="$TOKEN_ENV" />
</gitlab>
</packageSourceCredentials>
</configuration>
型
我的Dockerfile文件如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# Build
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
## Certificates SSL
WORKDIR /usr/local/share/ca-certificates/
COPY ["ca.crt", "."]
RUN update-ca-certificates -f
## Copy sources and build
WORKDIR /src
COPY ["nuget.config", "."]
ARG TOKEN
ENV TOKEN_ENV=$TOKEN
#RUN sed -i "s/PASSWORD/$TOKEN_ENV/" nuget.config <-- By replacing a keyword in the nuget.config file
COPY ["Project2.API/Project2.API.csproj", "Project2.API/"]
RUN dotnet restore "Project2.API/Project2.API.csproj"
COPY . .
WORKDIR "/src/Project2.API"
RUN dotnet build "Project2.API.csproj" -c Release -o /app/build
# Publish
FROM build AS publish
RUN dotnet publish "Project2.API.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Deploy
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Project2.API.dll"]
型gitlab-ci.yml
文件docker build --pull -t $CI_REGISTRY_IMAGE --build-arg TOKEN=$CI_JOB_TOKEN --no-cache .
中的命令将标记$CI_JOB_TOKEN
作为参数传递。该标记在Dockerfile
中检索并存储在环境变量中。该环境变量在nuget.config
文件中用作$TOKEN_ENV
。
使用RUN dotnet restore "Project2.API/Project2.API.csproj"
命令恢复项目1的nuget包时,显示以下错误:
error NU1301: Unable to load the service index for source https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json. [/src/Project2.API/Project2.API.csproj]
型
我还尝试用RUN sed -i "s/PASSWORD/$TOKEN_ENV/" nuget.config
命令替换nuget.config
文件中的关键字(参见Dockerfile above) after copying the
nuget.config文件中的注解行,以及在用该标记填充环境变量之后)。
<add key="ClearTextPassword" value="PASSWORD" />
型
阅读文件后发现关键字被替换为[MASKED]
,而不是标记,所以我仍然得到同样的错误。
请注意,项目2对项目1有一个令牌访问权限,并且在项目1中有一个Gitlab的配置(项目1 > Settings > CI/CD > Access令牌)。
如何修复错误?
2条答案
按热度按时间dffbzjpn1#
我在
gitlab-ci
文件中添加了一个stage build,方法是复制stage deploy 中相同的初始步骤:真的有用!
然后,我能够创建一个结果工件,并通过将其复制到Docker镜像中,将其重用到阶段 * 部署 * 中。
字符串
因此,我能够避免依赖恢复(导致问题),
Dockerfile
中的构建和发布,这通过端口暴露,复制应用程序(工件)和添加入口点的步骤来简化。型
总之,工件的使用允许我解决问题并更好地组织步骤。
6jygbczu2#
去你的%appdata%\NuGet和抛光NuGet.config -它可能是你有一些冗余的设置。