shell 实现harbor 指定仓库镜像tags 查询
  Uz9KIXKpP3pL 2023年11月02日 52 0

1.需求背景

1.1 容器发布ci 成功以后 我们希望CD时候可以选择相关镜像
1.2 统计指定仓库镜像有多少个版本


2.shell代码

#!/bin/bash
set -eu

#harbor 关键环境变量
HARBOR_URL=""
USERNAME=""
PASSWORD=""
PAGE_SIZE=50  #每页project 条数项目

imges_head=$(echo "$HARBOR_URL"|awk -F // '{print $2}' )
projects_endpoint="$HARBOR_URL/api/v2.0/projects?page_size=$PAGE_SIZE"
out_file="./images_tag_list.txt"

#检查环境变量 没有关联变量不能执行.
checkSysEnv() {
if [ -z "$HARBOR_URL" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]
then
   echo -e "\033[31m缺少harbor登录关联环境变量,请检查并填写正确配置....\033[0m"
   exit 1
fi
}

#检查 jq 和curl 命令有没有安装 没有退出
if ! command -v jq &>/dev/null && command -v curl  &>/dev/null; then
   echo "jq,curl 命令未安装,请检查并安装jq curl ..."
   exit 1
fi

#查询harbor 有多少个项目

getProjectList(){
checkSysEnv
projects=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $projects_endpoint |jq -r '.[].name')
if  [ -z "$projects" ]
then
    echo -e "\033[31m 获取harbor项目仓库出现异常境,请检查....\033[0m"
    exit 1
fi
for project in $projects
do
    echo "$project"
done
}

# 根据项目名称查询分页页码 
getRepoCountPages(){
checkSysEnv
project_name=$1
if [ -z "$project_name" ]
then
    projects=`getProjectList`
    for project in $projects
    do
       repo_count_endpoint="$HARBOR_URL/api/v2.0/projects?name=$project"
       repo_count=$(curl -u $USERNAME:$PASSWORD -skX 'GET'   $repo_count_endpoint |jq -r '.[].repo_count')
       pages=$(expr $repo_count / 10 + 1)
       echo "$pages"
     done
else
     repo_count_endpoint="$HARBOR_URL/api/v2.0/projects?name=$project_name"
     repo_count=$(curl -u $USERNAME:$PASSWORD -skX 'GET'   $repo_count_endpoint |jq -r '.[].repo_count')
     pages=$(expr $repo_count / 10 + 1)
     echo "$pages"
fi
}

# 根据项目名称和 repo名称查询 镜像 tags
get_project_repo_tags(){
PROJECT=$2
REPO_NAME=$3
tags=$(curl -u "$USERNAME:$PASSWORD" -skX GET "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts?page=1&page_size=15&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false" | jq -r '.[].tags.[].name')
for tag in $tags;
do
    printf "$HARBOR_URL/$PROJECT/$REPO_NAME:$tag \n"
done
}

# 根据项目名称project 查询全部repo 名称和tags版本

get_appoint_repo_tags(){
    echo "" > ./images_tag_list.txt
    project=$2
    repo_count=`getRepoCountPages $project`
    if [ -z "$repo_count" ]; then
      continue
    fi
    pages=$(expr "$repo_count" / 10 + 1)
    for ((i=1; i<=$pages; i++)); do
        images_endpoint="$HARBOR_URL/api/v2.0/projects/$project/repositories?page_size=10&page=$i"
        repos_json=$(curl -u "$USERNAME:$PASSWORD" -skX 'GET' "$images_endpoint")
        if [ -z "$repos_json" ] || [ "$repos_json" == "null" ]; then
            continue
        fi
        repos=$(echo "$repos_json" | jq -r '.[].name' | awk -F / '{print $2}')
        for repo in $repos; do
            tag_count_url="$HARBOR_URL/api/v2.0/projects/$project/repositories/$repo"
            tag_count=$(curl -u "$USERNAME:$PASSWORD" -skX 'GET' "$tag_count_url" | jq '.artifact_count')

            if [ -z "$tag_count" ] || [ "$tag_count" == "null" ]; then
                continue
            fi

            pages1=$(expr "$tag_count" / 10 + 1)

            if [ -z "$pages1" ]; then
                continue
            fi

            for ((j=1; j<=$pages1; j++)); do
                tags_endpoint="$HARBOR_URL/api/v2.0/projects/$project/repositories/$repo/artifacts?page_size=10&page=$j"
                tags_json=$(curl -u "$USERNAME:$PASSWORD" -skX 'GET' "$tags_endpoint")

                if [ -z "$tags_json" ] || [ "$tags_json" == "null" ] ; then
                    continue
                fi

                tags=$(echo "$tags_json" |jq -r '.[].tags[].name')
                if [ -z "$tags" ] || [ "$tags" == "null" ]; then
                     continue
                fi
                for tag in $tags; do
                   if [ -z "$tag" ] || [ "$tag" == "null" ]; then
                      continue
                   fi
                       printf "$HARBOR_URL/$project/$repo:$tag \n" >> images_tag_list.txt 2>&1
                       if [ ! -f "$out_file" ]; then
                           echo "文件$out_file 不存在"
                           exit 1
                       fi
                       while IFS= read -r line; do
                          echo "$line"
                       done < "$out_file"
                 done
            done
        done
    done
}

case $1 in
     
    "get_project_list")
        getProjectList
        ;;
    "get_project_repo_tags")
         checkSysEnv
         get_project_repo_tags $*
         ;;    
    "get_repo_count_one_page")
        getRepoCountPages $*
        ;;
    "get_appoint_repo_tags")
         checkSysEnv
         get_appoint_repo_tags $*
     ;;
    *)
        echo -e "\033[32m 参数如下: \033[0m"
        echo -e "\033[32m get_project_list \033[0m 获取harbor项目列表 默认查询最大50个 其他修改 PAGE_SIZE 参数"
        echo -e "\033[32m get_repo_count_one_page \033[0m 获取项目列表有多少页数据 后面指定harbor项目名称,不指定查询全部"
        echo -e "\033[32m get_appoint_repo_tags \033[0m get_appoint_repo_tags 指定harbor仓库名称 后面跟 harbor存在的仓库名称可以通过get_project_list查询"
        echo -e "\033[32m get_project_repo_tags \033[0m 根据项目名称获取和repo名称获取镜像 tags"
        ;;
esac

3.使用方法

#执行提示
 bash get_harbor_image.sh
 参数如下:
 get_project_list  获取harbor项目列表 默认查询最大50个 其他修改 PAGE_SIZE 参数
 get_repo_count_one_page  获取项目列表有多少页数据 后面指定harbor项目名称,不指定查询全部
 get_images_endpoint  获取habor项目镜像列表 后面指定harbor项目名称,不指定查询全部
 get_project_repo_tags  根据项目名称获取和repo名称获取镜像 tags
 get_appoint_repo_tags  get_appoint_repo_tags 指定harbor仓库名称 后面跟 harbor存在的仓库名称可以通过get_project_list查询
 
 bash get_harbor_image.sh get_project_repo_tags cicd ansible-helm #项目名称cicd 应用名称:ansible-helm
 https://reg.breakilinx.com/cicd/ansible-helm:testing
 https://reg.breaklinux.com/cicd/ansible-helm:prod



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年11月22日   22   0   0 linuxApacheci
  jnZtF7Co41Wg   2023年11月24日   30   0   0 分区表cicentos
  py5aPqzocVnd   2023年11月22日   37   0   0 协议ci