【问题标题】:How to enable / setup Dependency Caches for apt-get on BitBucket Pipelines如何在 BitBucket Pipelines 上为 apt-get 启用/设置依赖缓存
【发布时间】:2018-02-08 06:22:35
【问题描述】:

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

【问题讨论】:

    标签: bitbucket bitbucket-pipelines


    【解决方案1】:

    这是一个典型的场景,您应该使用自己的 Docker 镜像,而不是 Atlassian 提供的镜像之一。 (或者搜索一个正好提供这个的 Docker 镜像。)

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

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

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

    【讨论】:

    • 使用提供你需要的镜像是很棒的,但是恕我直言,创建一个需要保持最新的全新 docker 镜像并不值得将构建时间缩短 30 秒。
    • 这取决于。当频繁运行管道时,这比保持图像最新更有益。另一方面:并不是每个人都在使用管道来创建(例如)用于生产的 Docker 镜像,但是有足够多的人——包括我——主要使用它来运行单元测试、执行 linting、代码样式检查等. 在这种情况下,使图像保持最新通常并不重要。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我正在使用类似的配置,但在我的情况下,我想缓存 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'
      

      【讨论】:

        猜你喜欢
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-07
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        相关资源
        最近更新 更多