首页 文章

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

提问于
浏览
11

我在我的 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"

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

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

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

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

definitions:
  caches:
    aptget: which ssh

2 回答

  • 16

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

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

    FROM php:7.1.1
    
    RUN apt-get update && \
        apt-get install -y openssh-client
    

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

  • 1

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

    apt-get update 不使用缓存,因此每次都会下载最新的索引 .

    apt-get install/var/cache/apt 中缓存已下载的软件包,因此您可以保存它 . 然而,这可能实际上不会节省任何时间

    以0s(998 kB / s)提取907 kB

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

    在更深层次上,缓存, apt-get update 和Docker之间的令人满意的交互是complex issue .

相关问题