Канико: Как кэшировать папки из сборки Gatsby в Kubernetes с помощью Tekton?

Я создаю конвейер CI / CD, используя Tekton на «голом железе» Kubernetes Cluster. Мне удалось кэшировать необходимые изображения (Node и Nginx) и слои, но как я могу кэшировать папки .cache / public, созданные сборкой Gatsby? Эти папки отсутствуют в репо. Если на этапе сборки эти папки не обнаруживаются, это займет больше времени, поскольку необходимо создать все изображения с помощью Sharp.

К трубопроводу прикреплен ПВХ. В задаче он называется источником (рабочие области). Для большей ясности, как я могу скопировать папки Gatsby в этот PVC после завершения сборки и в контейнер Kaniko перед следующей сборкой?

Задача Tekton состоит из следующих этапов:

  1. Используйте Kaniko warmer для кеширования образов Docker, используемых в сборке Docker
  2. Создайте метку времени, чтобы сборка RUN выполнялась каждый раз, даже если файлы не меняются, потому что выполняется запрос GraphQL.
  3. Создайте и отправьте изображение с помощью Kaniko
  4. & 5. Экспорт дайджеста изображения, используемого на следующем этапе в конвейере.
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: build-docker-image
spec:
  params:
    - name: pathToDockerFile
      type: string
      description: The path to the dockerfile to build
      default: $(resources.inputs.source-repo.path)/Dockerfile
    - name: pathToContext
      type: string
      description: |
        The build context used by Kaniko
        (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)
      default: $(resources.inputs.source-repo.path)
  resources:
    inputs:
      - name: source-repo
        type: git
    outputs:
      - name: builtImage
        type: image
      - name: event-to-sink
        type: cloudEvent
  workspaces:
    # PVC
    - name: source
      description: |
        Folder to write docker image digest
  results:
    - name: IMAGE-DIGEST
      description: Digest of the image just built.
  steps:
    - name: kaniko-warmer
      image: gcr.io/kaniko-project/warmer
      workingDir: $(workspaces.source.path)
      args:
        - --cache-dir=$(workspaces.source.path)/cache
        - --image=node:14-alpine
        - --image=nginx:1.19.5
    - name: print-date-unix-timestamp
      image: bash:latest
      script: |
        #!/usr/bin/env bash
        date | tee $(params.pathToContext)/date
    - name: build-and-push
      workingDir: $(workspaces.source.path)
      image: gcr.io/kaniko-project/executor:v1.3.0
      env:
        - name: 'DOCKER_CONFIG'
          value: '/tekton/home/.docker/'
      command:
        - /kaniko/executor
      args:
        - --build-arg=CACHEBUST=$(params.pathToContext)/date
        - --dockerfile=$(params.pathToDockerFile)
        - --destination=$(resources.outputs.builtImage.url)
        - --context=$(params.pathToContext)
        - --cache=true
        - --cache-ttl=144h
        - --cache-dir=$(workspaces.source.path)/cache
        - --use-new-run
        - --snapshotMode=redo
        - --cache-repo=<repo>/kaniko-cache
        - --log-timestamp
      securityContext:
        runAsUser: 0
    - name: write-digest
      workingDir: $(workspaces.source.path)
      image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/imagedigestexporter:v0.16.2
      command: ['/ko-app/imagedigestexporter']
      args:
        - -images=[{"name":"$(resources.outputs.builtImage.url)","type":"image","url":"$(resources.outputs.builtImage.url)","digest":"","OutputImageDir":"$(workspaces.source.path)/$(params.pathToContext)/image-digest"}]
        - -terminationMessagePath=$(params.pathToContext)/image-digested
      securityContext:
        runAsUser: 0
    - name: digest-to-result
      workingDir: $(workspaces.source.path)
      image: docker.io/stedolan/jq@sha256:a61ed0bca213081b64be94c5e1b402ea58bc549f457c2682a86704dd55231e09
      script: |
        cat $(params.pathToContext)/image-digested | jq '.[0].value' -rj | tee /$(results.IMAGE-DIGEST.path)

Dockerfile

FROM node:14-alpine as build
ARG CACHEBUST=1

RUN apk update \
  && apk add \
  build-base \
  libtool \
  autoconf \
  automake \
  pkgconfig \
  nasm \
  yarn \
  libpng-dev libjpeg-turbo-dev giflib-dev tiff-dev \
  zlib-dev \
  python \
  && rm -rf /var/cache/apk/*

EXPOSE 8000 9000

RUN yarn global add gatsby-cli

WORKDIR /usr/src/app
COPY ./package.json .
RUN yarn install
COPY . .
RUN yarn build && echo $CACHEBUST

CMD ["yarn", "serve"]

FROM nginx:1.19.5 as serve
EXPOSE 80
COPY --from=build /usr/src/app/public /usr/share/nginx/html

person Espen Finnesand    schedule 07.12.2020    source источник


Ответы (1)


как я могу кэшировать папки .cache / public, созданные сборкой Gatsby? Этих папок нет в репо.

Если постоянные тома доступны в вашем кластере и эти тома доступны со всех узлов, вы можете использовать рабочую область на основе PVC для кеширования.

Более общее решение, которое также работает в региональном кластере (например, в облаке), - это загрузить кэшированную папку во что-то, например Bucket (Minio?) или потенциально Redis? Тогда также потребуется Задача, которая загрузит эту папку - потенциально параллельно с git clone при запуске нового PipelineRun. В GitHub Actions есть аналогичное решение с действием кеширования.

Пример задачи с двумя рабочими пространствами, которые копируют файл из одного рабочего пространства в другое:

apiVersion: tekton.dev/v1beta1  
kind: Task  
metadata:   
  name: copy-between-workspaces 
spec:   
  workspaces:   
    - name: ws-a    
    - name: ws-b    
  steps:    
    - name: copy
      image: ubuntu 
      script: cp $(workspaces.ws-a.path)/myfile $(workspaces.ws-b.path)/myfile
person Jonas    schedule 07.12.2020
comment
спасибо за Ваш ответ! К трубопроводу прикреплен ПВХ. В задаче рабочее пространство называется исходным. Как я могу скопировать папки Gatsby в этот PVC после завершения сборки и скопировать их на шаг перед следующей сборкой? Я изменил свой вопрос, чтобы отразить это. - person Espen Finnesand; 07.12.2020
comment
Есть две альтернативы; либо загрузите файлы, например, Redis или ведро. Или используйте дополнительную рабочую область PVC для кэшированных данных. Итак, вам нужна задача для копирования файлов в другое рабочее пространство, например. cp cache/ $(workspace.cache).path или что-то в этом роде. - person Jonas; 07.12.2020
comment
@EspenFinnes, и я добавил пример задачи копирования - не тестировал, но думаю, что он должен работать. - person Jonas; 07.12.2020
comment
@EspenFinnes и чтобы заставить это работать с двумя PVC, вам, вероятно, также придется отключить affinity-assistant в configmap. - person Jonas; 08.12.2020
comment
Я все еще не понимаю, как экспортировать папки сборки из Kaniko. Я могу использовать рабочие области для ввода папок в Канико через --context. Думал, что экспорт может работать с --tarPath, но это тоже не сработало. Не могли бы вы объяснить, как это сделать? - person Espen Finnesand; 08.12.2020
comment
Ах, вы хотите кешировать, когда создаете многоступенчатый файл dockerImage. Если вы не можете использовать github.com/GoogleContainerTools/kaniko/blob/master/ иначе это может сработать, если вы создадите отдельные задачи Tekton перед созданием образа? это может помочь с настраиваемым кешированием? - person Jonas; 08.12.2020
comment
да. Мне удалось настроить кеш Kaniko как для кеширования слоев, так и для кеширования базовых изображений. Но еще больше хочется кешировать. Я хочу кэшировать определенные папки, созданные во время Docker RUN npm run build. Используя вашу задачу, я могу ввести уже закэшированные папки в Kaniko. Думал, что их тоже можно будет извлечь. Но использование дополнительной задачи (например, узла) в конвейере для создания и экспорта этих папок - хорошее решение. Спасибо большое за вашу помощь! - person Espen Finnesand; 08.12.2020