在文件中gitlab-ci有一个选项,.gitlab-ci.yml用于在任何实际脚本运行之前执行命令,称为before_script..gitlab-ci.yml示例说明了在此安装辅助程序.但是,我注意到的是,使用docker执行程序时,Docker中没有缓存这些更改.我天真地假设在运行这些命令后,docker会缓存图像,因此对于下一次运行或测试,docker只会加载之后生成的缓存图像before_script.这将大大加快构建速度.
举个例子,我.gitlab-ci.yml看起来有点像:
image: ubuntu
before_script:
- apt-get update -qq && apt-get install -yqq make ...
build:
script:
- cd project && make
Run Code Online (Sandbox Code Playgroud)
一个可能的解决方案是转到跑步机并创建一个docker镜像,可以构建我的软件而无需任何其他安装,然后image在yaml文件的部分中引用它.这样做的缺点是,无论何时我想添加依赖项,我都需要登录到转轮计算机并在构建成功之前更新映像.如果我只是必须将依赖项添加到结尾apt-get install并且让docker/gitlab-ci处理适当的缓存,那将会更好.
还有一个cache命令.gitlab-ci.yml,我尝试设置untracked: true,我认为会缓存所有不是我的项目的副产品,但它似乎没有任何影响.
有没有办法得到我想要的行为?
我在我的Ubuntu OS上使用了2个容器:Gitlab-ce和gitlab-runner
容器名称是:gitlab_gitlab_1和gitlab_gitlab-runner_1
我通过访问我的gitlab应用程序 gitlab.localhost.com:801
我用这个命令成功注册了一个跑步者:
docker exec -it gitlab_gitlab-runner_1 gitlab-runner register --non-interactive --url http://gitlab_gitlab_1 --registration-token _wgMgEx3nBocYQtoi83c --executor docker --docker-image alpine:latest
Run Code Online (Sandbox Code Playgroud)
然后,当我开始工作时,我收到此错误消息:
Running with gitlab-runner 10.7.1 (b9bba623)
on 589a617ee407 12ba77f7
Using Docker executor with image alpine:latest ...
Pulling docker image alpine:latest ...
Using docker image sha256:3fd9065eaf02feaf94d68376da52541925650b81698c53c6824d92ff63f98353 for alpine:latest ...
Running on runner-12ba77f7-project-1-concurrent-0 via 01196621a827...
Cloning repository...
Cloning into '/builds/root/test'...
fatal: unable to access 'http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@gitlab.localhost.com/root/test.git/': Could not resolve host: gitlab.localhost.com
ERROR: Job failed: exit code 1
Run Code Online (Sandbox Code Playgroud)
在这两个容器中,我都可以访问主机名gitlab.localhost.com …
如何使用GitLab CI秘密变量设置Gradle发布任务用户凭证?我正在使用gradle maven publish插件,这是build.gradle的片段
repositories {
maven {
credentials {
username artifactUser
password artifactPass
}
url "..."
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试gradle.properties如下使用
artifactUser=${env.MAVEN_REPO_USER}
artifactPass=${env.MAVEN_REPO_PASS}
Run Code Online (Sandbox Code Playgroud)
还有几种访问.gitlab-ci.yml文件中机密变量的方法(因为未从gradle中拾取gradle.properties或未正确转换变量,因此它位于根项目目录中)
方法1
'./gradlew publish -x test -PartifactUser=${env.MAVEN_REPO_USER} -PartifactPass=${env.MAVEN_REPO_PASS}'
Run Code Online (Sandbox Code Playgroud)
错误: /bin/bash: line 56: -PartifactUser=${env.MAVEN_REPO_USER}: bad substitution
方法2
before_script:
- chmod +x ./gradlew
- export REPO_USER=${env.MAVEN_REPO_USER}
- export REPO_PASS=${env.MAVEN_REPO_PASS}
...
deploy:
stage: deploy
script:
- ./gradlew publish -x test -PartifactUser=$REPO_USER -PartifactPass=$REPO_PASS
Run Code Online (Sandbox Code Playgroud)
我正在使用openjdk:8-jdk-slimgradle包装器构建图像。此类变量用法似乎存在多个问题,我们有什么解决方法吗?
我尝试使用gitlabRunner构建APK
当我构建apk时,我不想每次都下载所有构建文件
所以我尝试缓存.gradle / caches和.gradle / wrappers
以下是我的gitlab-ci.yml
sdk_build_job
image: myimage:latest
stage: sdk-build
script:
...
cache:
key: gradle-cache
- /root/.gradle/caches
- /root/.gradle/wrapper
Run Code Online (Sandbox Code Playgroud)
但是创建gradle-cache总是发出警告
Creating cache gradle-cache...
WARNING: /root/.gradle/caches: no matching files
WARNING: /root/.gradle/wrapper: no matching files
Archive is up to date!
Run Code Online (Sandbox Code Playgroud)
我不知道为什么找不到缓存和包装器目录
当我进入Docker容器并找到文件夹时,位置很好
root@runner-3d9fa57b-project-4-concurrent-0:~/.gradle# pwd
/root/.gradle
root@runner-3d9fa57b-project-4-concurrent-0:~/.gradle# ls -al
total 28
drwxr-xr-x 7 root root 4096 Dec 28 02:21 .
drwx------ 1 root root 4096 Dec 28 02:19 ..
drwxr-xr-x 6 root root 4096 Dec 28 02:20 caches
drwxr-xr-x 3 …Run Code Online (Sandbox Code Playgroud) 在过去的几周里,我一直在使用 GitLab.com 上的公共共享运行器为私有存储库中的 php 项目设置我的第一个管道。此时管道非常简单,定义了两个阶段:
stages:
- test
- deploy
Run Code Online (Sandbox Code Playgroud)
在测试阶段运行composer update -o构建项目的依赖,连接到远程数据库服务器,并运行CodeCeption测试框架来测试构建和生成代码覆盖率报告。
在部署阶段运行composer update --no-dev -o重建项目,只生产依赖和利用rsync将文件推到生产网络服务器。
现在一切正常,但是对于每个阶段,它都会运行拉取 docker 镜像、安装依赖项以及从 git 中提取项目的整个过程。似乎只加载一次 docker 镜像和项目会更有效率,然后运行测试并使用相同的持久构建实例一个接一个地部署阶段。
我意识到很多时候您确实希望为每个阶段创建一个新实例,但是对于我的项目,我觉得这对于时间和服务器资源来说效率很低。
我可以将所有内容配置为在同一阶段运行,这将消除冗余的 docker 映像进程,但我会失去 GitLab 中的管道功能,您可以在其中查看哪些阶段失败,并使后续阶段依赖于前一个阶段的成功。
从我对文档和几个相关问题的审查来看,这似乎与此过程如何工作的架构有关,其中作业彼此独立(甚至可以由不同的运行者处理)并组织成管道上的阶段。
我所拥有的当然是可行的(如果有点慢)但我想我会在这里问这个问题,以防万一我遗漏了什么会使这个过程更有效,同时仍然保留 CI 管道功能。
我在不同的网络上有两个单独的 git-lab 实例。我可以为每个人使用相同的跑步者吗?假设两个 git-lab 实例都可以访问带有运行器的服务器。是否可以为我的两个 git-lab 实例使用一个运行程序?我已经阅读了大部分关于跑步者的 git-lab 文档,但它似乎没有谈论这种情况,至少据我所知是这样。
我目前正在使用.env文件来获取 FASTFILE 中的环境变量,但现在我正在尝试使用 GitLab CI/CD 自动化 fastlane。
由于.env包含所有键的文件无法推送到分支,因此我必须.env在 GitLab 运行程序的环境变量中声明所有或环境变量。
我想知道如何在我的 fastfile 中使用 GitLab 运行程序的环境变量。
lane :build_staging do |options|
environment_variable(set: { 'ENVFILE' => '.env.staging' }) // I want to use the GitLab environment variable
clean
gradle(task: options[:task], build_type: 'Staging', project_dir: 'android/')
end
Run Code Online (Sandbox Code Playgroud) 我有兴趣列出在特定时期(在我的例子中是最后六个月)在 GitLab Runner 上运行的所有作业。或者更准确地说:我想找到所有已运行作业的项目。有没有办法通过网络界面或登录跑步者来做到这一点?
在网络界面中,我尝试查看管理区域 > 跑步者 > [Select_specific_runner]。在这里我可以看到“此运行者最近提供的作业”,但这仅列出了最近 30 次运行。
我也尝试过gitlab-runner从命令行使用该命令,但我还没有找到列出实际运行的方法。
如果用户触发管道并且没有设置使用options值调用的变量,是否有办法使我的整个管道失败?
我尝试过诸如 only 和规则之类的东西,但它们只是跳过作业而不是让所有作业失败。
我读过Can Anybodyterpret docker.sock来了解/var/run/docker.sock它的作用,但它在 GitLab CI 的Use Docker socket binding中的使用让我感到困惑。
这是他们的注册命令示例gitlab-runner:
sudo gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token REGISTRATION_TOKEN \
--executor docker \
--description "My Docker Runner" \
--docker-image "docker:19.03.12" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
我看到可以从两个地方获取生成的容器docker。
/var/run/docker.sock。docker包含在基础映像中的二进制文件docker:19.03.12。这不是PATH冲突吗?我认为应该是其中之一,我可以docker从主机的 unix 套接字或基本映像中获得使用的能力。
我认为--docker-image应该是ubuntu:latest或者不带有 的东西docker,因为已经来自主机套接字PATH。docker或者,可以移除 docker 套接字安装座。
关于 的双重包含,实际上发生了什么docker?
unix-socket docker gitlab-ci gitlab-ci-runner docker-in-docker
gitlab-ci-runner ×10
gitlab-ci ×8
gitlab ×6
docker ×3
fastlane ×1
gradle ×1
gradlew ×1
unix-socket ×1