たとえば、次のようなものがあるとします。
steps:
- name: 'gcr.io/cloud-builders/gradle'
entrypoint: 'bash'
args: ['-c',
'chmod +x ./gradlew && ./gradlew build']
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '--tag', 'eu.gcr.io/my-app:$_BUILD_ID', '.']
images: ['eu.gcr.io/my-app:$_BUILD_ID']
将来のビルドのために Gradle のキャッシュを残す方法はありますか? 現在は、毎回すべての依存関係をダウンロードし続けています。
おそらく、バケット ストレージを指定して、GRADLE_USER_HOME をそれにポイントする必要があるのでしょうか?
答え1
Container Builderを使用して、アプリケーションのビルドとランタイム レイヤーのビルドを分離します。依存関係を含むコンテナーと、説明されているようにアプリを含む別のコンテナーにイメージを分割します。ここまた、実行時にJDKの代わりにJREを使用するため、余分なスペースを節約できます。
クラウドビルドyaml:
steps:
- name: 'java:8'
env: ['GRADLE_USER_HOME=cache']
entrypoint: 'bash'
args: ['-c',
'./gradlew gate-web:installDist -x test']
- name: 'gcr.io/cloud-builders/docker'
args: ['build',
'-t', 'gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA',
'-t', 'gcr.io/$PROJECT_ID/$REPO_NAME:latest',
'-f', 'Dockerfile.slim',
'.'
]
images:
- 'gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/$REPO_NAME:latest'
Dockerfile.slim:
FROM openjdk:8u111-jre-alpine
COPY ./gate-web/build/install/gate /opt/gate
CMD ["/opt/gate/bin/gate"]
答え2
これはステージング ビルドに使用しているものです。
クラウドビルドyaml:
steps:
# Get the saved global gradle cache from
# Google Cloud Storage if it exists.
- name: 'gcr.io/cloud-builders/gsutil'
entrypoint: 'sh'
args:
- '-c'
- |
# Global
if gsutil -q stat gs://${PROJECT_ID}_cloudbuild/gradle_global.tar.gz; then
cd /
gsutil cp gs://${PROJECT_ID}_cloudbuild/gradle_global.tar.gz gradle_global.tar.gz
tar -xpzf gradle_global.tar.gz
fi
volumes:
- name: 'gradle_global'
path: /root/.gradle
# Build the java package.
- name: 'gcr.io/cloud-builders/gradle'
entrypoint: 'sh'
args:
- '-c'
- |
# Build the gateway .war package.
./gradlew -Pprod -DskipTests clean bootRepackage
# Move the files needed for the docker image
# to the slim directory.
mv ./build/libs/*.war ./app.war
# Delete all files and folders in the current directory
# except for the `app.war` and `Dockerfile`.
find . -type d -exec rm -rf {}
find . -type f -not -name 'app.war' -not -name 'Dockerfile' -delete
volumes:
- name: 'gradle_global'
path: /root/.gradle
# Save the global gradle cache to Google Cloud Storage
- name: 'gcr.io/cloud-builders/gsutil'
entrypoint: 'sh'
args:
- '-c'
- |
# Global
echo 'Creating an archive of /root/.gradle directory'
tar -cpzf gradle_global.tar.gz /root/.gradle/
echo 'Saving archive to Cloud Storage'
gsutil cp gradle_global.tar.gz gs://${PROJECT_ID}_cloudbuild/gradle_global.tar.gz
# Cleaning up
echo 'Deleting gradle*.tar.gz'
rm -f gradle*.tar.gz
volumes:
- name: 'gradle_global'
path: /root/.gradle
- name: 'gcr.io/cloud-builders/docker'
args: ['pull', 'asia.gcr.io/$PROJECT_ID/${IMAGE_NAME}:latest']
# Build the gateway container image.
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'asia.gcr.io/${PROJECT_ID}/${IMAGE_NAME}:${COMMIT_SHA}'
- '-t'
- 'asia.gcr.io/${PROJECT_ID}/${IMAGE_NAME}:latest'
- '--cache-from'
- 'asia.gcr.io/${PROJECT_ID}/${IMAGE_NAME}:latest'
- '.'
images:
- asia.gcr.io/${PROJECT_ID}/gateway:${COMMIT_SHA}
- asia.gcr.io/${PROJECT_ID}/gateway:latest
これが役に立つことを願っています。
答え3
これらを参照してくださいコミュニティ キャッシュ画像パブリックイメージについては知らないので、使用する前に、イメージをビルドしてイメージリポジトリにsave_cache
公開する必要があります。restore_cache
これにより、ディレクトリtar
が指定されたバケットに保存されます。.gradle/caches
.gradle/wrapper
考えるを解凍するとき--path
に によって同じディレクトリに自動的に復元されるようにするには、 を絶対ファイル参照で指定する必要があります。restore_cache
tar
これが私の ですcloudbuild.yaml
。
steps:
- name: 'gcr.io/$PROJECT_ID/restore_cache'
args:
- '--bucket=gs://${PROJECT_ID}_cloudbuild/${_CACHE_BUCKET}'
- '--key=${_CACHE_KEY}'
- name: 'java:8'
entrypoint: "bash"
args:
- '-c'
- './gradlew build'
env:
- 'GRADLE_OPTS="-Dorg.gradle.daemon=false -Dkotlin.incremental=false"'
- 'GRADLE_USER_HOME=${_GRADLE_USER_HOME}'
- name: 'gcr.io/$PROJECT_ID/save_cache'
args:
- '--bucket=gs://${PROJECT_ID}_cloudbuild/${_CACHE_BUCKET}'
- '--key=${_CACHE_KEY}'
- '--path=${_GRADLE_USER_HOME}/caches'
- '--path=${_GRADLE_USER_HOME}/wrapper'
substitutions:
_CACHE_BUCKET: 'gradle_cache'
_GRADLE_USER_HOME: '/workspace/.gradle'
_CACHE_KEY: 'gradle-cache'
GRADLE_USER_HOME
さまざまなクラウド ビルド ステップ間で保持されるように、デフォルト ボリューム (またはカスタム ボリューム) に配置することが重要です/workspace
(ボリュームはステップ間で自動的にコピーされます)。