我在.gitlab-ci.ymlAndroid项目中使用和docker作为GitLab CI运行器.在测试运行结束时,gradlew将测试结果保存在构建目录下的xml和html中:
Finished generating test XML results (0.001 secs) into: /builds/org/project/sdk/build/test-results/release
Generating HTML test report...
Finished generating test html results (0.002 secs) into: /builds/org/project/sdk/build/reports/tests/release
Run Code Online (Sandbox Code Playgroud)
我想访问这些文件,但是文档没有提到如何像人们一样安装卷docker run -v <path>:/builds/org/....
我想知道是否可以在克隆存储库之前执行一些操作。事实上,据我所知,gitlab-ci 运行程序的第一个操作是在执行任何 脚本之前克隆要构建的存储库。
我的问题:
直观的方法是能够在运行程序克隆我的插件之前执行早期操作。例如:
=> 从这里克隆/构建/测试可以照常进行。
我知道有before_script操作,但它是在克隆之后执行的。
我还看到运行程序的全局 config.toml 文件的 [[runner]] 部分中有pre_clone_script选项,我想知道是否可以使用它。不幸的是,这意味着所有项目都将运行这个脚本,这当然不是一个好主意......
好吧,如果有人有建议,或者更好地解决这个问题,我将不胜感激!
当我推送一个新的提交时,我想从跑步者开始构建,但我得到这个消息:
这个版本卡住了,因为你没有在线任何活跃的跑步者,他们分配了这些标签:dev
转到"跑步者"页面
我安装了GitLab 8.15.2.
我在C中创建了一个基本项目,一个".gitlab-ci.yml"文件:
project1:
tags:
- dev
script:
- make
- ./test
Run Code Online (Sandbox Code Playgroud)
(如果我删除标签,我会得到几乎相同的消息)
我创建了一个特定的跑步者
root@debian:~# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://127.0.0.1
Please enter the gitlab-ci token for this runner:
XXX
Please enter the gitlab-ci description for this runner:
[debian]: p1
Please enter the gitlab-ci tags for this runner (comma separated):
dev
Registering runner... succeeded runner=XXX
Please enter the executor: kubernetes, docker, parallels, ssh, docker+machine, docker-ssh, shell, virtualbox, docker-ssh+machine:
shell …Run Code Online (Sandbox Code Playgroud) Gitlab 文档说明了以下内容GIT_STRATEGY: none:
none还重新使用项目工作区,但跳过所有 Git 操作(包括 GitLab Runner 的预克隆脚本,如果存在)。它对于专门对工件进行操作(例如部署)的作业最有用。Git 存储库数据可能存在,但肯定会过时,因此您应该只依赖从缓存或工件带入项目工作区的文件。
我仍然有点困惑这应该如何运作。如果不能保证源代码存在,则项目工作区中可能没有源代码,因此文件.gitlab-ci.yml也会丢失。如果没有构建脚本,作业必定会失败。如果根据外部因素,源仅部分丢失,则作业将随机失败,这比每次都失败更糟糕。但是,如果每次都失败,那么该功能还有什么意义呢?
我看到的另一种可能性是.gitlab-ci.yml可能在运行时注入,因此即使没有存储库的新副本,也会有一个构建脚本。如果是这样,我可以从存储库中定义更多文件以注入构建过程吗?这些特定工作有哪些限制?
我正在寻找一种在 GitLab 中取消作业后清理运行程序的方法。原因是我们经常不得不取消正在运行的作业,因为运行程序有时会卡在测试管道中,我可以想象一些其他场景,您希望取消作业并在之后运行清理脚本。我正在寻找类似的东西after_script,但只是在工作被取消的情况下。我检查了GitLab 关键字参考,但找不到我需要的内容。
我的以下部分gitlab-ci.yaml显示了测试阶段,我想docker-compose down在取消作业时通过调用来优雅地取消该阶段。
我使用的是单个 gitlab-runner。另外,我不使用dind。
test_stage:
stage: test
only:
- master
- tags
- merge_requests
image: registry.gitlab.com/xxxxxxxxxxxxxxxxxxx
variables:
HEADLESS: "true"
script:
- docker login -u="xxxx" -p="${QUAY_IO_PASSWORD}" quay.io
- npm install
- npm run test
- npm install wait-on
- cd example
- docker-compose up --force-recreate --abort-on-container-exit --build traefik frontend &
- cd ..
- apt install -y iproute2
- export DOCKER_HOST_IP=$( /sbin/ip route|awk '/default/ { print $3 }' ) …Run Code Online (Sandbox Code Playgroud) 我的自托管 GitLab 部署上的作业最近有时开始失败,并出现以下 git 错误:
完整作业日志的示例如下:
Running with gitlab-runner 13.12.0 (v13.12.0)
on ....50ab V...
Preparing the "shell" executor
00:00
Using Shell executor...
Preparing environment
00:00
Running on saxtons...
Getting source from Git repository
00:03
$ /nix/store/s0frm5z2k43qm66q39ifl2vz96hmyxg4-pre-clone
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /var/lib/private/gitlab-runner/builds/V.../2/privatestorage/PrivateStorageio/.git/
fatal: shallow file has changed since we read it
Cleaning up file based variables
00:00
ERROR: Job failed: exit status 1
Run Code Online (Sandbox Code Playgroud)
预克隆脚本包含此内容,用于修复不可写目录的权限,这些目录会导致运行程序尝试清理 git checkout 失败:
chmod --recursive u+rwX …Run Code Online (Sandbox Code Playgroud) Docker 支持一个--cpus选项,限制容器使用一定比例的主机计算资源。例如,--cpus 2.5将分配相当于主机CPU能力大约两倍半的计算资源。这种分配似乎有点“逻辑”而不是物理,因为容器运行八个进程,但往往--cpus 1.0在单独的 CPU 上运行每个进程,但限制在大约 12.5%。我想这很好。
问题是我无法找到一种方法让受限容器内的进程确定它有多少个可用的等效 CPU。例如,这对于构建过程特别有用,make -j <n>但是什么是n?无论选项值如何,常用的nproc输出都是主机上的 CPU 数量--cpus,这使得它不适合,因为它太大了。的值/proc/cpuinfo也是主机的视图(与 相同nproc)。
有没有办法让包含的进程确定可用的 CPU 数量?
举个例子,在我的 16 核主机上,我想仅使用docker run ... --cpus 4.0 ...并make -j <something>运行4 个进程,而不是 16 个进程。
FWIW,我将 Docker Executor 与 GitLab-CI 和 一起使用gitlab-runner,这就是为什么--cpuset-cpus=没有真正帮助的原因。执行器应该能够为每个作业在所有主机的 CPU 上分配一定数量的 CPU,而不是特定的子集。虽然我可以为每个显式的四个 CPU 集创建单独的执行程序,但我不知道有什么明显的方法可以将gitlab-runner这些执行程序以平衡的方式分配给传入的作业,而且我想避免将责任推到作业本身上,也许使用标签来选择执行器,因为这需要每个作业对运行器了解太多。
我确实考虑过像NUM_CPUS=4中那样设置相应的环境变量,以便构建作业可以找出要使用的环境变量,但是只能为所有跑步者设置变量,而不是单个跑步者:gitlab-runnerconfig.tomlmake …
我希望仅当有合并请求时才启动 Gitlab 管道。不在对任何分支的提交上。
only:
refs:
- merge_requests
changes:
- "**/*.json" except:
- $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "master"
- $CI_COMMIT_REF_NAME == "master"
Run Code Online (Sandbox Code Playgroud)
但是当我创建合并请求时,会启动两个管道请求。一个为
仅供参考,我有一些设置变量值的规则,并阅读这导致了此问题。我尝试了下面提到的方法:( https://gitlab.com/gitlab-org/gitlab/-/issues/201845 ) 来阻止分离管道并且它有效。但现在我无法访问 MR 变量。
workflow:
rules:
- if: $CI_MERGE_REQUEST_IID
- if: $CI_OPEN_MERGE_REQUESTS
when: never
Run Code Online (Sandbox Code Playgroud)
如何实现以下目标:
阻止分离分支请求的管道运行并获取合并分支管道运行的 MR 变量?
更新 1:我在设置上启用了合并结果管道并删除了 MERGE_REQUEST_IID 规则。现在合并结果管道正在运行而不是分离,但合并结果管道在合并被批准之前正在执行?抱歉,这很令人困惑。是否有办法仅在合并获得批准后启动管道并访问该管道运行中的 MR 变量?
我是 Gitlab Pipelines 的新手,想为我的一个 Python 项目设置一个。我将 docker GitLab-runner 容器与此配置文件一起使用:
version: '3'
services:
runner:
container_name: runner
image: gitlab/gitlab-runner:latest
restart: unless-stopped
environment:
- TZ=Europe/Berlin
volumes:
- ./data:/etc/gitlab-runner/
- /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
每当执行管道时,我都会收到以下错误消息:
Running with GitLab-runner 14.10.1 (f761588f)
on docker xxxxxxx
Preparing the "docker" executor
Using Docker executor with image python:latest ...
Pulling docker image python:latest ...
Using docker image sha256:8dec8e39f2eca1ee1f1b668619023da929039a39983de4433d42d25a7b79267c for python:latest with digest python@sha256:567018293e51a89db96ce4c9679fdefc89b3d17a9fe9e94c0091b04ac5bb4e89 ...
Preparing environment
Running on runner-xxxxxxxxx-project-38-concurrent-0 via xxxxxxxx...
Getting source from Git repository
Fetching changes with git depth set …Run Code Online (Sandbox Code Playgroud) 我有几个作业在同一阶段按顺序运行。然而,在 GitLab UI 中,显示顺序是根据作业名称(升序)。
Job_C:
stage: dev
Job_B:
stage: dev
needs: ["Job_C"]
Job_A:
stage: dev
needs: ["Job_B"]
Run Code Online (Sandbox Code Playgroud)
因此该作业按预期顺序运行。Job_C然后Job_B然后Job_A。然而,UI 中的作业顺序是 Job_A,Job_B并且Job_C
在不更改作业名称的情况下是否可以设置显示顺序?
gitlab-ci-runner ×10
gitlab-ci ×7
gitlab ×4
docker ×2
git ×2
environment ×1
limit ×1
nixos ×1
pipeline ×1