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는 최소 구성으로 다음 작업을 수행해요:
- 복제된 VMware 가상 머신을 띄운다.
- Consul 릴리스를 설치한다.
- Consul 바이너리를 다운로드한다.
- Consul을
.tar.gz파일로 패키징한다. - 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 바이너리를 모두 빌드하는 경우죠.