【问题标题】:How to cache deployment image in gitlab-ci?如何在 gitlab-ci 中缓存部署映像?
【发布时间】:2020-10-28 15:07:40
【问题描述】:

我正在创建一个 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}
    ...

问题:我如何告诉 gitlab runner 缓存我在部署阶段构建的图像,并在未来的所有部署运行中重用它?因为正如所写,每次部署都会安装库,即使运行之间没有任何变化。

【问题讨论】:

    标签: docker continuous-integration gitlab gitlab-ci


    【解决方案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 包安装。 (注意这很难看)

    将 bash 脚本提交到像 install-deps.sh 这样的文件中

    #!/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
    
    

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多