我正在创建一个gitlab-ci
部署阶段,该阶段需要比映像中现有库更多的库。在此示例中,我要添加ssh
(在现实世界中,我想添加更多的库):
image: adoptopenjdk/maven-openjdk11
...
deploy:
stage: deploy
script:
- which ssh || (apt-get update -y && apt-get install -y ssh)
- chmod 600 ${SSH_PRIVATE_KEY}
...
问题:我怎样才能告诉gitlabRunner缓存我在部署阶段构建的映像,并在以后的所有部署运行中重用它?因为按照书面规定,即使在每次运行之间没有任何变化,库安装也会针对每个部署进行。
答案 0 :(得分:1)
GitLab只能缓存文件/目录,但是由于apt的工作方式,没有简单的方法告诉它缓存您以这种方式完成的安装。您也不能“缓存”图像。
我看到两种选择:
FROM adoptopenjdk/maven-openjdk11
RUN apt update && apt install -y foo bar baz
然后将图像构建/推送到dockerhub,然后在yaml中更改image:
:
image: membersound/maven-openjdk11-with-deps:latest
或者只是选择一个已经具有您想要的所有依赖项的图像!有许多有用的docker映像,其中安装了有用的工具。例如,octopusdeploy/worker-tools
附带安装了许多运行时和工具(java,python,AWS CLI,kubectl等)。
对b install-deps.sh
这样的文件提交bash脚本
#!/usr/bin/env bash
PACKAGES="wget jq foo bar baz"
if [ ! -d "./.deb_packages" ]; then
apt update && apt --download-only install -y ${PACKAGES}
cp /var/cache/apt/archives/*.deb ./.deb_packages
fi
apt install -y ./.deb_packages/*.deb
这将导致debian文件被缓存在目录./.deb_packages
中。然后,您可以配置gitlab缓存它们,以便以后使用。
my_job:
before_script:
- install-deps.sh
script:
- ...
cache:
paths:
- ./.deb_packages