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

时间:2017-08-30 13:40:37

标签: bitbucket bitbucket-pipelines

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

我正在使用类似的配置,但就我而言,我想缓存gettext程序包,出于相同的原因来到这里(以查找如何缓存gettext)。

如果没有这种依赖性,则可以使用bitbucket提供的ssh管道pipe: atlassian/ssh-run。不必创建自定义docker映像。

image: atlassian/default-image:2

pipelines:
  branches:
    develop:
      - step:
          deployment: staging
          script:
              - apt update && apt install -y gettext
              - envsubst < scripts/deploy.sh > deploy-out.sh
              - pipe: atlassian/ssh-run:0.2.6
                variables:
                  SSH_USER: $STAGE_USER
                  SERVER: $STAGE_SERVER
                  COMMAND: 'deploy-out.sh'
                  MODE: 'script'