在我们的 Gitlab 服务器上,我有两个存储库,其中一个存储库(“EPSILON-SDK-C”)是另一个存储库的子模块。当我在我的开发机器上本地运行 gitlab-runner 时
sudo gitlab-runner exec docker build_fw
Run Code Online (Sandbox Code Playgroud)
gitlab-runner 找不到子模块,如 gitlab-runner 的输出所示:
Updating/initializing submodules...
Submodule 'thirdparty/EPSILON-SDK-C' (/home/me/gitlab_repos/EPSILON-SDK-C) registered for path 'thirdparty/EPSILON-SDK-C'
fatal: repository '/home/me/gitlab_repos/EPSILON-SDK-C' does not exist
fatal: clone of '/home/me/gitlab_repos/EPSILON-SDK-C' into submodule path '/builds/0/project-0/thirdparty/EPSILON-SDK-C' failed
Failed to clone 'thirdparty/EPSILON-SDK-C'. Retry scheduled
fatal: repository '/home/me/gitlab_repos/EPSILON-SDK-C' does not exist
fatal: clone of '/home/me/gitlab_repos/EPSILON-SDK-C' into submodule path '/builds/0/project-0/thirdparty/EPSILON-SDK-C' failed
Failed to clone 'thirdparty/EPSILON-SDK-C' a second time, aborting
ERROR: Job failed: exit code 1
FATAL: exit code 1
Run Code Online (Sandbox Code Playgroud)
然而,当我们的 Gitlab 服务器被提交触发时,Gitlab …
当我运行一个全新的 git 存储库时,仅README.md使用GitLab 中的.gitlab-ci.yml标准shell执行器,整个工作需要 4 秒。当我使用 docker-windows 执行器执行相同操作时,需要 33 秒!
我的.gitlab-ci.yml:
no_git_nor_submodules:
image: base_on_python36:ltsc2019
stage: build
tags:
- docker-windows
variables:
GIT_SUBMODULE_STRATEGY: none
GIT_STRATEGY: none
script:
- echo test
no_docker_no_git_nor_submodules:
stage: build
tags:
- normal_runner
variables:
GIT_SUBMODULE_STRATEGY: none
GIT_STRATEGY: none
script:
- echo test
Run Code Online (Sandbox Code Playgroud)
我认为可能存在的一个问题是 Windows 上的 docker 镜像往往很大。我在这里测试过的是 5.8 GB。当我在服务器上手动启动容器时,它只需要几秒钟即可启动。我还使用更大的图像(36 GB)进行了测试,但使用该图像的作业也需要大约 33 秒。
由于这些作业不执行任何操作,也没有任何 git clone 或子模块,那么什么需要时间呢?
我知道 GitLab 使用一个神秘的辅助镜像来克隆 git 存储库以及其他类似的事情。难道是这张图片导致运行速度超级慢?
更新2019-11-04
我使用 . 对此进行了更多研究docker events。它显示 GitLab 总共启动了 7 …
我正在尝试将我们的应用程序代码从 Jenkins 迁移到 Gitlab。在这里,我想尝试一下特定于分支的变量。例如:1) 主分支代码将部署到生产环境 2) 其他分支代码可以部署在非生产环境中。
在 Jenkins 中,变量是根据它们创建的不同管道设置的。我怎样才能通过使用 gitlab 变量功能来做同样的事情。
我需要这样的东西。
主分支的 AWS_KEY 变量应设置为“XXX”,非主分支的 AWS_KEY 变量应设置为“YYY”。我想在 gitlab UI 本身中配置相同的内容(这样我就可以屏蔽 GITLAB 中的值)。
variables:
aws_credentials: $AWS_KEY
Run Code Online (Sandbox Code Playgroud)
上面的代码片段将在我的存储库的 gitlab-ci.yml 文件中使用。AWS_KEY 值应根据分支名称更改。
我有一个带有NUnit测试项目的解决方案(Foo.Test)。
+-- src
| +-- Foo.Gui
| +-- Foo.Test
Run Code Online (Sandbox Code Playgroud)
+-- src
| +-- Foo.Gui
| +-- Foo.Test
Run Code Online (Sandbox Code Playgroud)
以下调用用于测试:
dotnet test --no-build -c Release -v n src\%TESTPROJECT%\%TESTPROJECT%.csproj --logger "trx;LogFileName=testreport.trx"
如果我在本地运行它,一切都会按预期工作:
对构建服务器的相同调用没有找到任何测试:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Compile Remove="TestResults\**" />
<EmbeddedResource Remove="TestResults\**" />
<None Remove="TestResults\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="GitVersionTask" Version="5.1.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="nunit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Foo.Gui\Foo.Gui.csproj" …Run Code Online (Sandbox Code Playgroud) 我试图从 docker 实例捕获 SIGTERM 信号(基本上是在调用 docker stop 时),但找不到方法,因为我执行的每次尝试都有不同的结果。
以下是我的设置
Dockerfile
FROM gitlab/gitlab-runner:alpine
COPY ./start.sh /start.sh
ENTRYPOINT ["/start.sh"]
Run Code Online (Sandbox Code Playgroud)
启动文件
FROM gitlab/gitlab-runner:alpine
COPY ./start.sh /start.sh
ENTRYPOINT ["/start.sh"]
Run Code Online (Sandbox Code Playgroud)
现在我构建 docker 镜像
$ docker build -t dockertrapcatch .
Sending build context to Docker daemon 51.71kB
Step 1/3 : FROM gitlab/gitlab-runner:alpine
---> 9f8c39873bee
Step 2/3 : COPY ./start.sh /start.sh
---> Using cache
---> ebb3cac0c509
Step 3/3 : ENTRYPOINT ["/start.sh"]
---> Using cache
---> 7ab67fe5a714
Successfully built 7ab67fe5a714
Successfully tagged dockertrapcatch:latest
Run Code Online (Sandbox Code Playgroud)
运行泊坞窗
#!/bin/bash
deregister_runner() {
echo …Run Code Online (Sandbox Code Playgroud) 我正在研究GitLab CI/CD并且我知道如何在正常情况下将标准错误重定向到标准输出。就是使用2>&1or >/dev/null 2>&1。
有时,我需要一些引发错误的命令,但这些错误并不严重。例如,当我部署 docker 应用程序时,我想停止旧容器(如果存在)并忽略容器不存在时将发生的错误。在这种情况下,我只想忽略标准错误并保留进程进行部署。当我使用 时AWS CodeDeploy,错误重定向2>&1确实有效,但在 中GitLab CI/CD,它不起作用。
下图是取消 CI/CD 进程的错误。如果没有命令停止不存在的容器,则不会出现错误并且部署确实可以工作。
如何将 std 错误重定向到 std out 或忽略错误并保持部署GitLab CI/CD?
我希望 CI 仅在我位于master、合并请求、计划管道 或变量COVERAGE_TEST等于时执行此作业ON:
c++TestCoverage:
stage: analysis
script: "./ciScripts/testCoverageScript.sh"
tags:
- framework
dependencies:
- c++Build
variables:
GIT_STRATEGY: fetch
artifacts:
paths:
- ./build/test_coverage/
expire_in: 1 week
when: on_success
Run Code Online (Sandbox Code Playgroud)
我尝试添加以下几行:
only:
refs:
- master
- merge_requests
- schedule
variables:
- $COVERAGE_TEST == "ON"
Run Code Online (Sandbox Code Playgroud)
但结果实际上是 -> If ((Master || MergeRequest || ScheduledPipeline) && COVERAGE_TEST == ON)
我也尝试过:
only:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
- $CI_PIPELINE_SOURCE == 'merge_request_event'
- $CI_PIPELINE_SOURCE == 'schedule'
- $COVERAGE_TEST …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个项目的单一存储库(不是我的设计选择)。
每个项目都有一个.gitlab-ci.yml设置,用于在“版本”文件更改时运行管道。这很好,因为用户可以签入stage或master(用于热修复),并且创建构建并将其部署到测试环境。
master问题是当用户从to进行合并stage并提交回 to stage(以引入任何修补程序)时。这会导致所有管道运行;即使对于没有实际内容更改的项目也是如此。
如何允许管道从master和/或stage但仅在“版本”文件的内容更改时运行?就像用户更改版本号一样。
这是一个示例.gitlab-ci.yml(我有 5 个,mono-repo 中的每个项目 1 个)
#
# BUILD-AND-TEST - initial build
#
my-project-build-and-test:
stage: build-and-test
script:
- cd $MY_PROJECT_DIR
- dotnet restore
- dotnet build
only:
changes:
- "MyProject/.gitlab-ci.VERSION.yml"
# no needs: here because this is the first step
#
# PUBLISH
#
my-project-publish:
stage: publish
script:
- cd $MY_PROJECT_DIR
- dotnet publish --output $MY_PROJECT_OUTPUT_PATH --configuration Release …Run Code Online (Sandbox Code Playgroud) 我是码头工人的新手。我使用以下命令运行 gitlab ce 容器:
docker run --detach --hostname localhost --publish 443:443 --publish 80:80 --name gitlab --restart always gitlab/gitlab-ce:latest
Run Code Online (Sandbox Code Playgroud)
这个容器工作得很好
我使用以下命令运行 gitlab-runner 容器:
docker run -d --name gitlab-runner --restart always gitlab/gitlab-runner:latest
Run Code Online (Sandbox Code Playgroud)
我的问题是当我想注册 gitlab-runner 时,跑步者问我:
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
Run Code Online (Sandbox Code Playgroud)
我的回答是:http://localhost:80/但它给了我错误:
ERROR: Registering runner... failed runner=K8trLPJx status=couldn't execute POST against http://localhost:80/api/v4/runners: Post http://localhost:80/api/v4/runners: dial tcp 127.0.0.1:80: connect: connection refused
PANIC: Failed to register this runner. Perhaps you are having network problems
Run Code Online (Sandbox Code Playgroud)
2 个容器在我的 Windows 10 电脑上运行
我不想在我的电脑上本地运行 …
我想向其余 API 发送有关部署状态的报告。
它应该独立于部署作业(因为 $IMAGE2 依赖性),因为我想在其他项目中使用报告作业。所以我在 Gitlab CI 中创建了两个作业,如下所示:
deploy:
stage: deploy
image: $IMAGE1
script:
- cd ${CI_PROJECT_DIR} && echo 'Failed' > deployment-status
# some codes to deploy and exit 1 if not successful
- cd ${CI_PROJECT_DIR} && echo 'Passed' > deployment-status #This line run only when deployment is successful
when: manual
artifacts:
when: always
paths:
- deployment-status
report-deployment:
stage: post-deploy
image: $IMAGE2
script:
- cd ${CI_PROJECT_DIR} && cat deployment-status
# some codes to report the status of deployment to …Run Code Online (Sandbox Code Playgroud) gitlab-ci-runner ×10
gitlab-ci ×6
gitlab ×5
docker ×2
.net ×1
alpine-linux ×1
dockerfile ×1
dotnet-test ×1
nunit ×1
sigkill ×1
unit-testing ×1