artifice post-processor

artifice post-processor

Artifact BuilderId: packer.post-processor.artifice

artifice post-processor는 업스트림 builder나 post-processor의 아티팩트 목록을 재정의(override)해요. 모든 다운스트림 post-processor는 여러분이 지정한 새 아티팩트를 보게 돼요.

출처: Packer 공식 문서

본문

artifice로 아티팩트를 재정의한 뒤에는, 대부분의 핵심 post-processor와 서드파티 post-processor를 포함한 다른 post-processor들과 함께 사용할 수 있어요.

이것의 큰 장점은 shell-local을 사용해 builder 아티팩트를 수정하고, 그 수정된 아티팩트를 원래 builder로는 동작하지 않았을 수도 있는 post-processor에 전달할 수 있다는 거예요. 예를 들어 amazon-ebs builder에서 Docker 컨테이너를 내보낸 다음 Docker-push를 사용해 그 Docker 컨테이너를 여러분의 Docker Hub 계정에 넣고 싶을 수 있어요.

Artifice를 쓰면 익숙한 packer 워크플로우로, 각 빌드에 대해 여러분이 선택한 인프라 위에 새롭고 상태 없는(stateless) 빌드 환경을 만들 수 있어요. 이를 이용해 거의 무엇이든 빌드할 수 있어요: buildpack, 컨테이너, jar, 바이너리, tarball, msi 설치 프로그램 등이요.

artifice post-processor는 아티팩트에서 제거하더라도 여러분의 옛 아티팩트 파일을 삭제하지 않는다 는 점에 주의해 주세요. 옛 아티팩트 파일을 삭제하고 싶다면 shell-local post-processor를 사용하면 돼요.

워크플로우 (Workflow)

Artifice는 패커의 몇 가지 다른 기능들을 엮는 데 도움을 줘요:

  • 아티팩트를 빌드하기 위해 VM(또는 컨테이너)을 띄우는 builder
  • 아티팩트를 만드는 단계를 수행하는 provisioner
  • VM에서 아티팩트를 다운로드하는 file provisioner
  • VM에서 다운로드된 파일이 무엇인지 식별하는 artifice post-processor
  • 아티팩트를 Docker hub 등으로 푸시하는 추가 post-processor

가능한 한 많은 작업을 VM 안에서 수행하는 게 좋아요. 이상적으로는 artifice 다음에 필요한 유일한 post-processor가 아티팩트를 적절한 저장소에 업로드하는 것뿐이면 돼요.

구성 (Configuration)

구성을 통해 어떤 파일이 여러분의 아티팩트를 이루는지 지정할 수 있어요.

필수 (Required):

  • files (문자열 배열) - 아티팩트를 이루는 파일들의 목록. 이 파일들은 packer의 프로비저닝 단계가 끝난 뒤 로컬 디스크에 존재해야 해요. 이 파일들은 builder의 원래 아티팩트(예: VM 스냅샷)를 대체해요.

선택 (Optional):

  • keep_input_artifact (boolean) - true이면 새 아티팩트를 만든 뒤 원래 아티팩트 파일을 삭제하지 않아요. 기본값은 true예요.

예시 구성 (Example Configuration)

Packer를 사용해 서비스 디스커버리이자 서비스 메시 솔루션인 HashiCorp Consul을 배포할 수 있어요. 추가 정보는 Consul 웹사이트를 참고해 주세요.

이 예시에서 Packer는 최소 구성으로 다음 작업을 수행해요:

  1. 복제된 VMware 가상 머신을 띄운다.
  2. Consul 릴리스를 설치한다.
  3. Consul 바이너리를 다운로드한다.
  4. Consul을 .tar.gz 파일로 패키징한다.
  5. Consul을 S3에 업로드한다.

VMX는 로컬에서 빌드·테스트하는 빠른 방법이지만, 다른 builder로 대체해도 돼요.

{
  "builders": [
    {
      "type": "vmware-vmx",
      "source_path": "/opt/ubuntu-1404-vmware.vmx",
      "ssh_username": "vagrant",
      "ssh_password": "vagrant",
      "shutdown_command": "sudo shutdown -h now",
      "headless": "true",
      "skip_compaction": "true"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo apt-get install -y python-pip",
        "sudo pip install ifs",
        "sudo ifs install consul --version=0.5.2"
      ]
    },
    {
      "type": "file",
      "source": "/usr/local/bin/consul",
      "destination": "consul",
      "direction": "download"
    }
  ],
  "post-processors": [
    [
      {
        "type": "artifice",
        "files": ["consul"]
      },
      {
        "type": "compress",
        "output": "consul-0.5.2.tar.gz"
      },
      {
        "type": "shell-local",
        "inline": [
          "/usr/local/bin/aws s3 cp consul-0.5.2.tar.gz s3://<s3 path>"
        ]
      }
    ]
  ]
}

post-processor 구역에 대괄호 세트가 두 개 있다는 점을 주목해 주세요. 이렇게 하면 post-processor 체인이 만들어져서, 앞선 아티팩트의 출력이 이후 post-processor로 전달돼요. 대괄호를 한 세트만 쓰면 post-processor들은 빌드 아티팩트(이 경우 vmx 파일)에 대해 개별적으로 실행되고, 원하는 결과를 얻지 못해요.

{
  "post-processors": [
    [       // <--- Start post-processor chain
      {
        "type": "artifice",
        "files": ["consul"]
      },
      {
        "type": "compress",
        ...
      }
    ],      // <--- End post-processor chain
    {
      "type":"compress"  // <-- Standalone post-processor
    }
  ]
}

여러 builder를 처리하기 위해 post-processor 체인을 여러 개 만들 수도 있어요. 예를 들어 같은 빌드에서 Linux와 Windows 바이너리를 모두 빌드하는 경우죠.