4.2. Console 에서 빌드
어떨 때 쓰는가
- 소스 코드를 컨테이너 이미지로 만들고 싶은데 Dockerfile 을 쓰고 싶지 않을 때
- 화면에서 빌드를 실행하고 결과를 바로 배포까지 하고 싶을 때
- 간단한 애플리케이션이라 Jenkins 파이프라인까지 필요하지 않을 때
되풀이 실행이나 배포 승인 절차가 필요하면 Jenkins 를 쓰십시오(4.4 장).
빌드 설정과 빌드의 관계
두 가지를 구분해야 합니다.
| 이름 | 무엇인가 | 실체 |
|---|---|---|
| 빌드 설정(BuildConfig) | "무엇을 어떻게 빌드할지" 를 담은 재사용 템플릿 | 클러스터에 저장되는 설정 자원 |
| 빌드(Build) | 그 설정으로 한 번 실행한 것 | 클러스터에서 도는 작업(Job) |
빌드 설정을 한 번 만들어 두면, 소스가 바뀔 때마다 빌드 시작 버튼만 누르면 됩니다. 실행할 때마다 새 빌드가 생기고 이력으로 쌓입니다.
빌드 설정 자체는 아무 일도 하지 않습니다. 저장만 되어 있다가 실행할 때 그 내용대로 작업이 만들어집니다.
빌드 설정 목록
빌드 > 빌드 설정 으로 들어갑니다.

| 열 | 설명 |
|---|---|
| 이름 | 빌드 설정 이름 |
| Git 주소 | 소스를 가져올 저장소 |
| 빌더 이미지 | 컴파일을 담당할 이미지 |
| 결과 이미지 | 만들어질 이미지 이름 |
| 경과 시간 | 만든 뒤 지난 시간 |
목록이 비어 있으면 안내 문구와 함께 빌드 설정 만들기 버튼이 나옵니다. 처음 쓰는 화면이라 여기서 시작하면 됩니다.
빌드 기능이 설치되지 않은 클러스터에서는 목록 대신 안내 배너가 뜹니다. 운영 담당자에게 빌드 기능 설치를 요청하십시오.
빌드 설정 만들기 — 네 가지 탭
목록 오른쪽 위의 생성 을 누르면 탭이 네 개 있는 창이 열립니다.
| 탭 | 설명 | 언제 씁니다 |
|---|---|---|
| 가이드 편집 | 빌드 설정 전용 입력 서식 | 기본값. 대부분 이것으로 충분합니다 |
| YAML 편집 | 설정을 YAML 로 직접 입력 | 다른 설정을 복사해 올 때 |
| 폼 편집 | 모든 항목을 자동 생성된 서식으로 | 가이드 편집에 없는 항목이 필요할 때 |
| API 문서 | 각 항목의 설명 | 항목의 뜻이 궁금할 때 |
가이드 편집에서는 Secret·볼륨·빌더 이미지를 드롭다운으로 고릅니다. 이름을 직접 적지 않아도 되므로 오타로 실패하는 일이 줄어듭니다.
가이드 편집 입력 항목
| 항목 | 설명 | 예시 |
|---|---|---|
| 이름 | 빌드 설정 이름. 네임스페이스 안에서 겹치지 않아야 합니다 | egov-build |
| 네임스페이스 | 빌드를 실행하고 결과를 둘 곳 | egov |
| Git 주소 | 소스가 있는 저장소 | http://gitlab.../egov.git |
| 브랜치·태그 | 가져올 지점. 비우면 기본 브랜치 | main |
| 하위 디렉터리 | 저장소 안에서 빌드할 경로 | backend |
| 소스 인증 정보 | 비공개 저장소에 쓸 Secret | gitlab-cred |
| 빌더 이미지 | 언어·빌드 도구에 맞는 이미지 | 드롭다운에서 선택 |
| 빌더 인증 정보 | 빌더 이미지를 가져올 Secret | harbor-cred |
| 빌드 환경 변수 | 컴파일 중에 쓸 값 | MAVEN_ARGS, MAVEN_MIRROR_URL |
| 결과 이미지 | 만들어질 이미지 주소 | harbor.../egov:latest |
| 푸시 인증 정보 | 레지스트리에 올릴 때 쓸 Secret | harbor-cred |
| 태그 방식 | 아래 "이미지 태그 규칙" 참고 | GitRef |
빌더 이미지 목록에는 클러스터에 등록된 것만 나옵니다. Java, Node.js, Python 등 자주 쓰는 언어가 준비되어 있습니다. 필요한 빌더가 없으면 운영 담당자에게 등록을 요청하거나 Jenkins· Bastion 경로를 쓰십시오(4.4·4.5 장).
결과 이미지 주소는 기본값이 채워집니다. 클러스터에 기본 레지스트리가 설정되어 있으면
<레지스트리>/apps/... 형태로 미리 들어가며, ... 부분만 바꾸면 됩니다.
내부 라이브러리 저장소(Nexus)를 쓰는 환경에서는 MAVEN_MIRROR_URL 환경 변수를 넣어야 의존
라이브러리를 받을 수 있습니다. 폐쇄망에서는 외부 저장소에 연결되지 않습니다.
이미지 태그 규칙
결과 이미지에 적은 태그는 기준값 이고, 실제 태그는 태그 방식이 정합니다.
| 태그 방식 | 만들어지는 태그 | 특징 |
|---|---|---|
| GitRef (기본) | <브 랜치>-<커밋해시 7자리> | 어느 소스로 만들었는지 태그만 봐도 압니다 |
| Unique | <시각>-<임의 4자리> | 실행할 때마다 반드시 달라집니다 |
두 방식 모두 실행할 때마다 태그가 달라지므로 배포하면 확실히 새 버전이 뜹니다. 태그를
latest 로 고정하면 이미지 주소가 그대로라 배포해도 파드가 바뀌지 않는 문제가 생기는데,
COP 는 이 방식으로 그것을 막습니다.
GitRef 는 같은 커밋을 다시 빌드하면 태그가 같습니다. 이때는 배포해도 롤아웃이 일어나지 않습니다. 소스를 고치지 않고 다시 배포해야 한다면 Unique 를 쓰십시오.
빌드 자원 설정
빌드는 클러스터 안에서 파드로 돕니다. 자원 요청량과 상한이 항상 채워집니다.
| 항목 | 기본값 |
|---|---|
| 요청 CPU | 500m |
| 요청 메모리 | 1Gi |
| 요청 임시 저장 공간 | 4Gi |
| 상한 CPU | 2 |
| 상한 메모리 | 4Gi |
기본값을 비워 두지 않는 이유가 있습니다. 자원 요청이 없는 파드는 가장 먼저 밀려나는 등급 (BestEffort)이 되어(3.1 장 참고) 빌드가 노드 메모리를 끝까지 쓰다가 다른 파드까지 함께 죽일 수 있습니다.
큰 프로젝트라 메모리가 모자라면 상한을 올리십시오. 반대로 상한이 네임스페이스 자원 한도를 넘으면 빌드 가 시작되지 않습니다(8.1 장).
캐시로 빌드 시간 줄이기
Maven·Gradle 은 매번 라이브러리를 새로 받으면 빌드가 오래 걸립니다. 저장 공간(PVC)을 캐시 경로에 붙이면 다음 빌드부터 빨라집니다.
가이드 편집의 볼륨 항목에서 PVC 를 고르고 마운트 경로를 지정합니다.
| 빌드 도구 | 캐시 경로 |
|---|---|
| Maven | /home/jboss/.m2 (빌더 이미지에 따라 다를 수 있습니다) |
| Gradle | ~/.gradle |
| npm | ~/.npm |
PVC 는 먼저 만들어 두어야 목록에 나타납니다(6.1 장).
함께 만들어지는 것
빌드 설정을 만들면 배포 골격(Deployment)이 함께 만들어집니다. 복제본 수는 0 이라 파드는 뜨지 않습니다.
이렇게 하는 이유는, 이미지가 아직 없는 상태에서 파드를 띄우면 이미지를 못 가져와
ImagePullBackOff 오류가 계속 쌓이기 때문입니다. 첫 배포 때 0 에서 1 로 올라갑니다.
Service 는 이 시점에 만들지 않습니다. 어느 포트를 열지는 빌드가 끝나야 알 수 있습니다.
빌드 실행과 취소
빌드 설정 상세 화면에 버튼이 모여 있습니다.
| 버튼 | 하는 일 |
|---|---|
| 빌드 시작 | 지금 설정으로 새 빌드를 실행합니다 |
| 빌드 취소 | 진행 중인 빌드를 중단합니다 |
| 재빌드 | 진행 중인 것을 취소하고 새로 시작합니다 |
| 배포 | 마지막 성공 빌드의 이미지를 배포합니다 |
같은 빌드 설정으로 두 빌드를 동시에 돌릴 수 없습니다. 진행 중이면 시작 버튼이 비활성으로 바뀝니다.
상세 화면 아래에는 이 설정으로 실행한 빌드 이력이 나옵니다. 이름·상태·시작 시각과 함께 어느 노드에서 돌았는지 표시되므로, 특정 노드에서만 실패한다면 여기서 알 수 있습니다.
빌드 이력은 기본 20건까지 남고 오래된 것부터 지워집니다.
배포
배포 버튼은 마지막으로 성공한 빌드의 이미지를 배포합니다.
동작은 이렇습니다.
| 상황 | 동작 |
|---|---|
| 배포 대상이 이미 있음 | 컨테이너 이미지를 바꿔 롤링 업데이트 |
| 배포 대상이 없음 | 새로 만듭니다 (복제본 1) |
| 복제본이 0 임 | 이미지를 바꾸고 1 로 올립니다 |
| 이미지에 EXPOSE 포 트가 있고 Service 가 없음 | ClusterIP Service 를 한 번만 만듭니다 |
이미지를 바꿀 때는 확인 창이 뜨고 바뀌기 전 이미지와 바뀔 이미지 를 함께 보여 줍니다. 태그가 어떻게 달라지는지 확인하고 진행하십시오.
이미 배포된 이미지면 배포 버튼이 비활성입니다. 같은 이미지를 다시 배포해도 아무것도 바뀌지 않기 때문입니다. 다만 복제본이 0 이면 켜는 동작이 필요하므로 활성으로 남습니다.
기존 Service 는 절대 덮어쓰지 않습니다. 포트를 바꾸려면 Service 를 직접 고치십시오(5.1 장).
실패할 때 확인할 것
| 증상 | 원인 | 조치 |
|---|---|---|
| 소스를 가져오지 못함 | 저장소 주소·브랜치가 틀림, 비공개 저장소 인증 정보 없음 | 주소·브랜치 확인, 소스 인증 Secret 지정 |
| 컴파일 실패 | 소스 자체의 오류, 의존 라이브러리를 받지 못함 | 빌드 로그의 오류 줄, MAVEN_MIRROR_URL 확인 |
| 이미지 올리기 실패(UNAUTHORIZED) | 레지스트리 인증 정보가 없거나 권한이 모자람 | 푸시 Secret 의 계정·비밀번호와 해당 프로젝트 권한 확인 |
| 인증서 오류 | 사설 인증서 레지스트리 | 빌드 설정의 안전하지 않은 연결 허용 항목 확인 |
| 빌드가 시작되지 않음 | 빌드용 자원이 모자람 | 네임스페이스 자원 한도 확인(8.1 장) |
| 메모리 부족으로 중단 | 빌드에 필요한 메모리가 상한보다 큼 | 빌드 자원 상한을 올립니다 |
| 배포했는데 파드가 안 바뀜 | 같은 커밋을 GitRef 로 재빌드해 태그가 같음 | 소스를 고치거나 태그 방식을 Unique 로 |
인증 정보가 등록되어 있어도 값이나 권한이 틀리면 올리기 단계에서 실패합니다. Secret 이 존재하는지만 보지 말고 내용까지 확인하십시오(3.4 장).