Google Cloud Container Builder з кешем


0

Скажімо, у мене є:

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?

Відповіді:


0

Використовуйте Container Builder, щоб відокремити побудову програми від побудови її шару виконання - розділіть зображення на контейнер із залежностями та інший контейнер, що містить вашу програму, як описано тут . Він також використовує JRE замість JDK під час виконання, економлячи додатковий простір

cloudbuild.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"]

0

Це те, що я використовую для складання постановки:

cloudbuild.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

Я сподіваюся, що це допомагає.


0

Дивіться ці зображення кешу спільноти . Вам потрібно просто створити та опублікувати зображення save_cacheта restore_cacheзображення у вашому сховищі зображень, перш ніж використовувати їх, оскільки я не знаю публічних зображень.

Це tarті .gradle/cachesі .gradle/wrapperкаталоги і зберігати їх в зазначеному відрі. Я думаю, вам потрібно вказати --paths з абсолютними посиланнями на файли, щоб вони автоматично відновились до тієї ж каталоги, 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томі за замовчуванням (або на власному томі), щоб він зберігався між різними етапами створення хмари (томи автоматично копіюються від кроку до кроку).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.