CI/CD를 해보자 (3) - Caching을 통한 action 실행시간 단축

2 minute read


Workflow 실행시간 분석

앞서 만든 나만의 workflow는 크게 두 가지 step으로 정의할 수 있다. 첫번째는 원하는 환경에서의 Node.js test 코드 실행이고, 두번째는 Docker image를 빌드 한 후 푸시하는 것이다. 각 step의 실행시간을 살펴보자.

running-time

도커 이미지를 빌드하고 푸시하는 작업이 가장 많은 시간을 사용한 것을 확인할 수 있다. 실제로 규모가 있는 어플리케이션을 빌드해본 경험이 있으면 도커 이미지를 빌드하는데 상당한 시간이 드는 것을 알고 있을 것이다. 그런데 Github Actions는 실행시간을 기준으로 가격을 책정하기 때문에 workflow의 실행시간을 줄이는 것이 필요하다.

Github Actions는 trigger가 발동될 때마다 가상머신을 빌려주는 형식으로 action을 실행해주기 때문에 local에서 이용할 수 있었던 docker layer caching을 이용할 수 없다. 이미지 자체에 큰 변화가 없고 몇 개의 layer에만 수정사항이 있는 경우, 캐싱된 layer를 이용해 빌드 시간을 단축시킬 수 있다.

cache actions 사용하기

actions/cache를 이용하면 workflow내에서 캐시를 저장하고, 저장된 캐시를 불러올 수 있다. Github Actions 공식문서에서도 이 부분에 대한 가이드를 확인할 수 있다. Docker layer caching에 대한 부분도 Docker 공식 문서에서 가이드를 확인할 수 있다.

우리의 workflow yml파일 내용 중 도커 이미지를 빌드하고 푸시하기 전에 다음 내용을 추가해준다.

- name: Cache Docker layers
  uses: actions/cache@v2
  with:
    path: /tmp/.buildx-cache
    key: $-docker-layer-$
    restore-keys: |
      $-docker-layer-

cache@v2 라는 액션을 사용했고 전달해준 값으로는 path, key, restore-keys가 있다.

  • path: 캐시를 저장하고, 불러올 파일의 경로이다. 디렉토리/파일의 경로 또는 working 디렉토리에서의 상대경로를 전달해준다. glob pattern을 사용할 수도 있다. 위에서는 docker layer가 저장되는 경로를 넘겨주었다.
  • key: 캐시를 생성할 때 만들어지고, 캐시를 찾을 때 사용할 고유 key값이다. github.sha라는 변수를 사용했는데, 현재 커밋의 SHA 값이다.
  • restore-keys: key와 일치하는 키를 찾지 못했을 때 다음으로 찾아볼 키 값을 명시해준다.

이미지 빌드 시 cache 사용하기

도커 이미지를 빌드하고 푸시하는 부분에 캐시를 이용하고, 저장하겠다는 뜻의 다음 두 줄을 추가해준다.

- name: Build and push
  uses: docker/build-push-action@v2
  with:
    push: true
    tags: seungtaek/github-actions:latest
    cache-from: type=local,src=/tmp/.buildx-cache # 추가
    cache-to: type=local,dest=/tmp/.buildx-cache  # 추가
  • cache-from: 캐싱된 도커 레이어를 불러올 경로
  • cache-to: 캐싱된 도커 레이어를 저장할 경로

완성된 yml파일은 다음과 같다.

name: Node.js CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      # Setup
      - uses: actions/checkout@v2

      - uses: actions/setup-node@v1
        with:
          node-version: 14

      # Run test
      - name: Install packages
        run: npm ci

      - name: Run test
        run: npm test

      # Docker layer 캐싱
      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: $-docker-layer-$
          restore-keys: |
            $-docker-layer-

      # Docker build & push
      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: $
          password: $

      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: seungtaek/github-actions:latest
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

한 번 캐싱을 해놓으면 다음 action 실행 시 단축된 action 실행시간을 확인할 수 있다. 꼭 docker layer가 아니더라도, 다른 부분에서 action/cache를 적극적으로 활용한다면 좋을 것이다.

Categories:

Updated: