web-dev-qa-db-ja.com

BitBucketパイプラインでapt-getの依存関係キャッシュを有効化/設定する方法

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 [email protected] -F ~/.ssh/config "cd /path/to/code && git pull"
          # update composer
          - ssh [email protected] -F ~/.ssh/config "cd /path/to/code && composer update --no-scripts"
          # optimise files
          - ssh [email protected] -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
14
Niraj Shah

これは、Atlassianが提供するイメージの代わりに独自のDockerイメージを使用する必要がある典型的なシナリオです。 (または、これを正確に提供するDockerイメージを検索します。)

単純なケースでは、このDockerfileで十分です。

FROM php:7.1.1

RUN apt-get update && \
    apt-get install -y openssh-client

次に、DockerHubアカウントを作成し、イメージを公開して、bitbucket-pipelines.ymlで参照します。

18
BlueM

残念ながら、時間がかかる部分は安全ではないか、キャッシュしても意味がありません。パイプラインキャッシュはいつでも削除される可能性があるため、とにかくコマンドを実行する必要があることに注意してください。

apt-get updateはキャッシュを使用しないため、毎回最新のインデックスをダウンロードします。

apt-get installはダウンロードしたパッケージを/var/cache/aptにキャッシュするので、それを保存できます。ただし、これでは実際には時間を節約できない可能性があります

0秒で907kBをフェッチ(998 kB/s)

実際にインストールされたパッケージは、a)複数の共有ファイルとディレクトリに分散しており、b)異なるDockerイメージに移植できない可能性があるため、キャッシュできません。

より深いレベルでは、キャッシング、apt-get update、およびDocker間の十分な相互作用は 複雑な問題 です。

2
OrangeDog