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
これは、Atlassianが提供するイメージの代わりに独自のDockerイメージを使用する必要がある典型的なシナリオです。 (または、これを正確に提供するDockerイメージを検索します。)
単純なケースでは、このDockerfileで十分です。
FROM php:7.1.1
RUN apt-get update && \
apt-get install -y openssh-client
次に、DockerHubアカウントを作成し、イメージを公開して、bitbucket-pipelines.yml
で参照します。
残念ながら、時間がかかる部分は安全ではないか、キャッシュしても意味がありません。パイプラインキャッシュはいつでも削除される可能性があるため、とにかくコマンドを実行する必要があることに注意してください。
apt-get update
はキャッシュを使用しないため、毎回最新のインデックスをダウンロードします。
apt-get install
はダウンロードしたパッケージを/var/cache/apt
にキャッシュするので、それを保存できます。ただし、これでは実際には時間を節約できない可能性があります
0秒で907kBをフェッチ(998 kB/s)
実際にインストールされたパッケージは、a)複数の共有ファイルとディレクトリに分散しており、b)異なるDockerイメージに移植できない可能性があるため、キャッシュできません。
より深いレベルでは、キャッシング、apt-get update
、およびDocker間の十分な相互作用は 複雑な問題 です。