폐쇄망에서는 Harbor 웹 UI 로 들어갈 수 있는 경로가 막혀 있고 API 만 열어 두는 구성이 흔하다. 또 이미지를 push 할 프로젝트가 없으면 CI 파이프라인이 그 자리에서 실패하므로, 파이프라인 첫 단계에서 프로젝트 존재를 보장해 두는 편이 낫다. 두 경우 모두 UI 를 거치지 않고 만들 수 있어야 한다.
Harbor 는 v2 API 를 /api/v2.0 아래에 제공한다. 전체 명세는 Harbor 인스턴스의 /devcenter-api-2.0 경로에서 볼 수 있다.
curl -sS -u "admin:${HARBOR_ADMIN_PASSWORD}" \
-X POST "https://harbor.example.com/api/v2.0/projects" \
-H "Content-Type: application/json" \
-d '{
"project_name": "myproject",
"metadata": { "public": "false" }
}'
| 응답 | 뜻 |
|---|---|
| 201 | 만들어졌다. Location 헤더에 새 프로젝트 경로가 온다 |
| 409 | 같은 이름이 이미 있다 |
| 401 | 인증 실패 |
| 403 | 권한 부족 |
metadata.public 은 문자열 "true" · "false" 다. 불리언으로 보내면 거절되는 버전이 있으므로 문자열로 적는다.
멱등하게 만들려면 있는지 먼저 확인하고 없을 때만 만든다. 409 를 성공으로 취급해도 되지만, 다른 이유로 난 409 를 놓치게 된다.
#!/bin/bash
set -euo pipefail
HARBOR_URL="https://harbor.example.com"
PROJECT="myproject"
AUTH="admin:${HARBOR_ADMIN_PASSWORD}"
code=$(curl -sS -u "$AUTH" -o /dev/null -w '%{http_code}' \
-I "${HARBOR_URL}/api/v2.0/projects?project_name=${PROJECT}")
if [ "$code" = "200" ]; then
echo "already exists: ${PROJECT}"
else
curl -sS -u "$AUTH" -X POST "${HARBOR_URL}/api/v2.0/projects" \
-H "Content-Type: application/json" \
-d "{\"project_name\":\"${PROJECT}\",\"metadata\":{\"public\":\"false\"}}"
fi
HEAD /projects?project_name= 은 존재 여부만 확인하는 용도이고 200 이면 있다는 뜻이다.
자동화에 관리자 비밀번호를 넣는 것은 피한다. Harbor 의 로봇 계정은 권한을 골라 줄 수 있고 만료 기간을 정할 수 있다. 프로젝트를 만들려면 시스템 수준 로봇 계정이어야 하고 project 자원에 대한 생성 권한이 필요하다.
curl -sS -X POST "https://harbor.example.com/api/v2.0/projects" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(printf '%s' "${ROBOT_NAME}:${ROBOT_SECRET}" | base64 -w0)" \
-d '{"project_name":"ci-project","metadata":{"public":"false"}}'
로봇 계정의 이름은 robot$이름 형태이고, 시크릿은 생성할 때 한 번만 보여 준다.
프로젝트를 만든 뒤 API 로 이어서 걸 수 있는 것들이다.
# 용량 한도 (바이트, -1 이면 무제한)
curl -sS -u "$AUTH" -X PUT \
"https://harbor.example.com/api/v2.0/quotas/<QUOTA_ID>" \
-H "Content-Type: application/json" \
-d '{"hard": {"storage": 107374182400}}'
# 프로젝트 설정 변경 — 취약점 있는 이미지 pull 차단, 자동 스캔
curl -sS -u "$AUTH" -X PUT \
"https://harbor.example.com/api/v2.0/projects/myproject" \
-H "Content-Type: application/json" \
-d '{"metadata":{"auto_scan":"true","prevent_vul":"true","severity":"high"}}'
폐쇄망 설치 직후라면 쓰임새별 프로젝트를 한 번에 만들어 두는 스크립트를 준비해 두면 재설치할 때 그대로 재사용할 수 있다.
curl: (60) SSL certificate problem 이 나면 CA 를 신뢰 목록에 넣는다. -k 는 확인용으로만 쓰고 자동화 스크립트에 남기지 않는다.
curl --cacert /etc/pki/ca-trust/source/anchors/harbor-ca.crt ...