Harbor REST API 스크립팅: 리포지토리 태그 및 이미지 정리

💡 핵심 요약 (Executive Summary)

본 가이드는 bash harbor harbor api scripting 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Creating
Create Project
bash
#!/bin/bash
ns=$1
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
curl -u "admin:Cloud000@" \
        --cacert $SCRIPT_DIR/../ca.crt \
        -XPOST "https://harbor.Enterprise Cloud.hanacloudia.com/api/v2.0/projects" \
        -H "Content-Type: application/json" \
        -d '{
                "project_name": "'"$ns"'",
                "public": true,
                "storage_limit": -1,
                "metadata": {
                        "public": "true",
                        "auto_scan": "true",
                        "reuse_sys_cve_allowlist": "true"
                }
        }'
Deleting
Remove Projects
bash
#!/bin/bash

url=
id=
pw=
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 해당 프로젝트 내 모든 이미지를 삭제합니다.
projects="apache keycloak management mariadb rabbitmq vault"

# 프로젝트 루프
for project in $projects
do
  # 리포지토리 루프
  repositorys=$(curl -s --cacert $SCRIPT_DIR/../ca.crt -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/" | jq '.[].name' -r | sed "s/${project}\///g")
  for repository in $repositorys
  do
    # 이미지 루프: 이미지 삭제 요청
    digests=$(curl -s --cacert $SCRIPT_DIR/../ca.crt -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/${repository}/artifacts" | jq '.[].digest' -r)
    for digest in $digests
    do
      echo "delete {{${project}/${repository}:${digest}}}"
      curl -XDELETE --cacert $SCRIPT_DIR/../ca.crt -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/${repository}/artifacts/${digest}"
    done
    curl -XDELETE --cacert $SCRIPT_DIR/../ca.crt -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/${repository}"
  done
  curl -XDELETE --cacert $SCRIPT_DIR/../ca.crt -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}"
done
Manual GC
bash
#!/bin/bash

url=
id=
pw=

# 해당 프로젝트 내 모든 이미지를 삭제합니다.
projects="stg-portal dev-portal"

# 프로젝트 루프
for project in $projects
do
  # 리포지토리 루프
  repositorys=$(curl -s -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/" | jq '.[].name' -r | sed "s/${project}\///g")
  for repository in $repositorys
  do
    # 이미지 루프: 이미지 삭제 요청
    digests=$(curl -s -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/${repository}/artifacts" | jq '.[].digest' -r)
    for digest in $digests
    do
      echo "delete {{${project}/${repository}:${digest}}}"
      curl -XDELETE -u "${id}:${pw}" "${url}/api/v2.0/projects/${project}/repositories/${repository}/artifacts/${digest}"
    done
  done
done

# gc 실행
curl -s -u "${id}:${pw}" -XPOST \
  "${url}/api/v2.0/system/gc/schedule" \
  -H "Content-Type: application/json" \
  -d '{"schedule":{"type":"Manual"}}'

# gc 상태: "job_status": "finished" 상태가 되면 볼륨 확보됩니다.
curl -s -u "${id}:${pw}" \
  "${url}/api/v2.0/system/gc"

# 사용자 편의기능
echo """
system: job_status=finished 상태가 될때까지 기다리세요.
curl -s -u ${id}:${pw} \
  ${url}/api/v2.0/system/gc
"""

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *