一、摘要
当制品上传到 Artifactory 时,Artifactory 会在数据库中记录制品的相关元数据信息,包括文件路径、大小、校验和(如 MD5、SHA1)、上传时间、索引、依赖等。实际的制品二进制文件会存储在指定的存储后端,具体的存储位置可以配置artifactory的配置文件binarystore.xml来更改。如果二进制文件被意外删除或丢失的话,将无法在Artifactory使用和下载这些制品。而我们只能重新上传此制品文件或者删除掉Artifactory上的制品信息,今天我们讲如何删除这些二进制文件丢失的制品。
二、先查询出二进制文件丢失的制品
1、我们需要在下方Github链接中把此脚本下载下来,它可以查询出Artifactory中二进制文件丢失的制品:
https://github.com/jfrog/artifactory-scripts/blob/master/filestoreIntegrity/filestoreIntegrity.py
2、安装脚本运行需要的python3环境
yum -y install python3
3、授予权限
chmod +x filestoreIntegrity.py
4、运行此脚本
./filestoreIntegrity.py http(s)://{artifactory_url}/artifactory -u {user} -o output.txt
5、运行完成后会在我们当前目录下多一个output.txt文件此文件里面的内容便是我们二进制文件丢失的制品信息。
三、删除指定的制品
1、我们需要写一个脚本用来更快捷的删除制品,第一步我们要创建脚本文件。
touch delartifact.sh
2、编写脚本内容,此脚本可以循环遍历output.txt文件的制品信息来进行逐一删除。
#!/bin/bash
# Artifactory的基本URL
BASE_URL="$1"
#判断是否输入Url
if [ -z "$1" ]; then
echo "错误: 必须提供 Artifactory 的 URL。"
echo "用法: $0 <Artifactory URL>"
exit 1
fi
# Artifactory的用户名和密码
read -p "请输入用户名: " USERNAME
read -s -p "请输入密码: " PASSWORD
#换行,防止判断输出和密码在同一行
echo
#判断用户名,密码和Url是否正确
CODE=$(curl -u "${USERNAME}:${PASSWORD}" "${BASE_URL}/artifactory/api/system/ping" -s -o /dev/null -w "%{http_code}")
if [ "$CODE" -ne 200 ];then
echo "请检查用户名 密码 Url 是否正确"
exit 1
fi
# 从output.txt文件中读取制品列表
ARTIFACTS=$(cat ./output.txt | cut -f2 -d']' | head -n -1)
# 循环遍历制品列表,发送DELETE请求删除每个制品
for artifact in ${ARTIFACTS[@]}; do
url="${BASE_URL}/artifactory/${artifact}"
response=$(curl -X DELETE -u "${USERNAME}:${PASSWORD}" "${url}" -s -o /dev/null -w "%{http_code}")
if [[ $response -eq 204 ]]; then
echo "Deleted artifact: ${artifact}"
else
echo "Failed to delete artifact: ${artifact}"
fi
done
3、授予权限
chmod +x delartifact.sh
4、运行删除制品
sh delartifact.sh http(s)://{artifactory_url}
5、删除完制品后,在我们存储库中可能会产生空目录,比如说maven-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar的jar包被清理而且无其他文件,那么此目录将没有作用,7版本的artifactory会自动清理这些空目录,而6版本的则需要我们去安装个插件来统一清理。
四、清理空目录(7版本的artifactory会自动清理)
1、我们需要在下方Github链接中把此插件下载下来,它可以清理存储库中的空目录:
https://github.com/jfrog/artifactory-user-plugins/blob/master/cleanup/deleteEmptyDirs/deleteEmptyDirs.groovy
2、将此插件放到$ARTIFACT_HOME/var/etc/plugins目录下
3、重新加载插件
curl -X POST -u {admin}:{password} http(s)://{artifactory_url}/artifactory/api/plugins/reload
4、下面是插件运行方式,需要指定存储库或者路径。
curl -X POST -v -u {admin}:{password} "http(s)://{artifactory_url}/artifactory/api/plugins/execute/deleteEmptyDirsPlugin?params=paths={repo},{path}"
5、如果要清理所有空目录则要先获取所有存储库的信息,并整理到一个文件中,用脚本来进行统一清理。
curl -X POST -u {admin}:{password} http(s)://{artifactory_url}/artifactory/api/repositorie > repo.txt
6、创建并编写脚本使其逐一清理所有存储库
touch delfolder.sh
#!/bin/bash
# Artifactory的基本URL
BASE_URL="$1"
#判断是否输入Url
if [ -z "$1" ]; then
echo "错误: 必须提供 Artifactory 的 URL。"
echo "用法: $0 <Artifactory URL>"
exit 1
fi
# Artifactory的用户名和密码
read -p "请输入用户名: " USERNAME
read -s -p "请输入密码: " PASSWORD
#换行,防止下面判断输出和密码在同一行
echo
#判断用户名,密码和Url是否正确
CODE=$(curl -u "${USERNAME}:${PASSWORD}" "${BASE_URL}/artifactory/api/system/ping" -s -o /dev/null -w "%{http_code}")
if [ "$CODE" -ne 200 ];then
echo "请检查用户名 密码 Url 是否正确"
exit 1
fi
# 读取文件并逐行处理
for repo in $(cat repo.txt | grep key | cut -f4 -d'"'); do
echo "正在清理存储库: $repo"
response=$(curl -X POST -u $USERNAME:$PASSWORD "${BASE_URL}/artifactory/api/plugins/execute/deleteEmptyDirsPlugin?params=paths=$repo" -s -o /dev/null -w "%{http_code}")
if [ $response -eq 200 ]; then
echo "Successfully processed $repo"
else
echo "Failed to process $repo: HTTP status $response"
fi
done
7、授予权限
chmod +x delfolder.sh
8、运行脚本
sh delfolder.sh http(s):{artifactory_url}
9、清空垃圾桶
curl -u {admin}:{password} -X POST http://{artifactory_url}/artifactory/api/trash/empty