如何在gitlab-ci中缓存部署映像?

时间:2020-10-28 15:07:40

标签: docker continuous-integration gitlab gitlab-ci

我正在创建一个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缓存我在部署阶段构建的映像,并在以后的所有部署运行中重用它?因为按照书面规定,即使在每次运行之间没有任何变化,库安装也会针对每个部署进行。

1 个答案:

答案 0 :(得分:1)

GitLab只能缓存文件/目录,但是由于apt的工作方式,没有简单的方法告诉它缓存您以这种方式完成的安装。您也不能“缓存”图像。

我看到两种选择:

  1. 创建或使用已经包含依赖项的docker映像。
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等)。

  1. 尝试缓存deb软件包并从deb软件包安装。 (请注意,这很丑)

对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