如何在BitBucket管道上为apt-get启用/设置依赖缓存

Nir*_*hah 12 bitbucket bitbucket-pipelines

我在我的bitbucket-pipelines.yml文件中使用以下代码远程deply代码到登台服务器.

image: php:7.1.1

pipelines:
  default:
    - step:
        script:
          # install ssh
          - apt-get update && apt-get install -y openssh-client
          # get the latest code
          - ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && git pull"
          # update composer
          - ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && composer update --no-scripts"
          # optimise files
          - ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && php artisan optimize"
Run Code Online (Sandbox Code Playgroud)

这一切都有效,除了每次运行管道时,都会下载并安装ssh客户端(为构建时间增加约30秒).有没有办法可以缓存这一步?

我怎样才能缓存这个apt-get步骤?

例如,像这样的工作(或者需要进行哪些更改才能完成以下工作):

pipelines:
  default:
    - step:
        caches:
          - aptget
        script:
          - apt-get update && apt-get install -y openssh-client

definitions:
  caches:
    aptget: which ssh
Run Code Online (Sandbox Code Playgroud)

Blu*_*ueM 19

这是一个典型的场景,您应该使用自己的Docker镜像而不是Atlassian提供的镜像.(或者搜索提供此功能的Docker镜像.)

在您的简单情况下,这个Dockerfile应该足够了:

FROM php:7.1.1

RUN apt-get update && \
    apt-get install -y openssh-client
Run Code Online (Sandbox Code Playgroud)

然后,创建一个DockerHub帐户,发布图像并引用它bitbucket-pipelines.yml.

  • 使用能够提供您所需内容的镜像固然很棒,但恕我直言,创建一个需要保持最新的全新 docker 镜像并不值得将构建时间缩短 30 秒。 (2认同)

Sto*_*ica 5

不幸的是,需要时间的部分缓存不安全或毫无意义。请记住,管道缓存可能随时被删除,因此您始终需要运行这些命令。

apt-get update 不使用缓存,所以每次都会下载最新的索引。

apt-get install缓存下载的包,/var/cache/apt以便您可以保存它。然而,这实际上可能不会节省任何时间

在 0 秒内获取 907 kB (998 kB/s)

无法缓存实际安装的软件包,因为它们 a) 分布在多个共享文件和目录中,并且 b) 可能无法移植到不同的 docker 映像。

在更深层次上,缓存apt-get update、 和 Docker之间令人满意的交互是一个复杂的问题