XRAY:如何找到没有索引的工件,并在XRAY中重新索引它们
在某些情况下,当使用x射线版本时以上3.41.4,为了提高x射线性能,可以配置保留天来保留x射线扫描结果。可以为存储库和构建设置保留期。保留期定义了Xray将保留工件扫描数据多长时间,在设置的保留期之后,这些数据将被删除,从而提高性能并释放存储空间。
一旦跨越了保留期,在保留日设置之前部署的工件仍然可用,那么工件将需要重新扫描。因此,存储库索引资源可能不是100%,因为存储库上有需要重新扫描的工件。2022世界杯阿根廷预选赛赛程
如果我们正在寻找一个没有被扫描的工件,我们可以使用下面的bash脚本来获取与索引相关的工件的状态。
注意:
- 这个脚本需要金桥待安装。
- 更新Xray DB的Repository名称、JFrogURL、PostgreSQL连接字符串,需要admin用户才能访问JFrog平台。
获取未被索引的工件:
#!/bin/bash
如果!命令-v jq &> /dev/null
然后
Echo“运行此脚本必须安装jq”
出口1
fi
如果!命令-v PSQL &> /dev/null
然后
Echo“必须安装psql才能运行此脚本”
出口1
fi
# UNIFIED_URL = " http://localhost: 8046 "
#用户名= "管理"
#密码= "密码"
#回购= " example-repo-local "
#回购= " maven-remote "
# PSQL_CONN_STRING = " postgres: / / x光:xray@localhost: 5432 / xraydb吗?sslmode =禁用”
LAST_DAYS = 90
BEFORE_MINUTES = 60
#用法示例:
# ./repo-xray-index-stats.sh -r example-repo-local -j http://localhost:8046 -u admin -p password -x postgres://xray:xray@localhost:5432/xraydb?sslmode =禁用
使用(){
echo "Usage: $0 -r REPO_NAME -j JFROG_PLATFORM_URL -u USERNAME -p PASSWORD -x XRAY_POSTGRES_CONNECTION_STRING [-d LAST_DAYS] [-m BEFORE_MINUTES]" 1>&2
}
exit_abnormal () {
使用
出口1
}
当getopts ":r:j:u:p:x:d:m:"做
输入“${opt}”
r)
回购= $ {OPTARG}
;;
j)
UNIFIED_URL = $ {OPTARG}
UNIFIED_URL=${UNIFIED_URL%/} #修饰后面的斜杠
;;
u)
用户名= $ {OPTARG}
;;
p)
密码= $ {OPTARG}
;;
x)
PSQL_CONN_STRING = $ {OPTARG}
;;
d)
LAST_DAYS = $ {OPTARG}
re_isanum = ' ^ [0 - 9] + $ '
如果![[$LAST_DAYS =~ $re_isanum]];然后
错误:LAST_DAYS必须为正整数
exit_abnormal
elif [$LAST_DAYS -eq "0"];然后
错误:LAST_DAYS必须大于0
exit_abnormal
fi
;;
米)
BEFORE_MINUTES = $ {OPTARG}
re_isanum = ' ^ [0 - 9] + $ '
如果![[$BEFORE_MINUTES =~ $re_isanum]];然后
错误:BEFORE_MINUTES必须是一个整数
exit_abnormal
fi
;;
:) #如果预期参数被省略:
${OPTARG}需要一个参数
exit_abnormal
;;
\?) #如果未知(任何其他)选项:
echo“无效选项:-$OPTARG”>&2
exit_abnormal
;;
esac
完成
if [-z "$REPO"];然后
echo "必须提供'Repository'参数(-r REPO_NAME) "
exit_abnormal
elif [-z "$UNIFIED_URL"];然后
echo "必须提供'JFrog平台Url'参数(-j JFROG_PLATFORM_URL) "
exit_abnormal
elif [-z "$USERNAME"];然后
echo "必须提供'JFrog平台用户名'参数(-u Username) "
exit_abnormal
elif [-z "$PASSWORD"];然后
echo "必须提供'JFrog平台密码'参数(-p Password) "
exit_abnormal
elif [-z "$PSQL_CONN_STRING"];然后
echo "必须提供'JFrog Xray Postgres连接字符串'参数(-x XRAY_POSTGRES_CONNECTION_STRING) "
exit_abnormal
fi
repoType=$(curl -s -u$USERNAME:$PASSWORD $UNIFIED_URL/artifactory/api/repositories/$REPO | jq -r .packageType)
如果[- z”repoType美元 " ] || [ "$ repoType”= =“null”)
然后
获取$REPO存储库包类型失败
出口1
fi
rClass=$(curl -s -u$USERNAME:$PASSWORD $UNIFIED_URL/artifactory/api/repositories/$REPO | jq -r .rclass)
if [-z "$rClass"] || ["$rClass" == "null"]
然后
获取$REPO存储库类型失败
出口1
elif (" $ rClass " ! = "的地方 " ] && [ "$ rClass " ! = "远程”)
然后
只支持本地和远程存储库(repoType: $rClass)"
出口1
elif ["$rClass" == "remote"]
然后
回购+ =“缓存”
fi
aqlFilter=$(curl -s -u$USERNAME:$PASSWORD $UNIFIED_URL/xray/api/v1/supportedTechnologies | jq——arg repoType" $repoType" '。Supported_package_types | map(select(.)类型= = $ repoType) .extensions[]) |地图(如果.is_file ! = true{“名称”:{" $匹配”:(“*”+ .extension)}}其他{"名称":{" $ eq”:。扩展}})”)
如果[$?-ne 0];然后
echo“在$REPO中查询可索引工件过滤器失败”
出口1
fi
read -r -d " timeFilter <<- EOM .
“\ $或“:(
{"created": {"\$last": "${LAST_DAYS}d"}},
{"modified": {"\$last": "${LAST_DAYS}d"}}],
“\ $或“:(
{"创建":{“美元\”:“$ {BEFORE_MINUTES}分钟"}},
{"修改":{“美元\”:“$ {BEFORE_MINUTES}分钟"}}
]
加工
aqlQuery = " items.find({\“回购\”,\“回购美元\”,\“\或美元\”:aqlFilter美元,美元timeFilter})其中包括(\“路径\”,\“\”)”
在对Artifactory进行繁重的AQL查询之前,我们在Postgres中创建了表
#以确保我们在postgres连接字符串不工作时快速失败
DROP TABLE IF EXISTS temp_root_files_to_index;创建表temp_root_files_to_index(路径VARCHAR(1024) NOT NULL);"
如果[$?-ne 0];然后
创建临时数据库表失败
出口1
fi
echo“查询$REPO中可索引的工件…”
csvFileName = " artifacts_to_index.csv "
rm -f $csvFileName
curl -u$USERNAME:$PASSWORD -X POST -H 'Content-Type:text/plain' $UNIFIED_URL/artifactory/api/search/aql——data "$aqlQuery" | jq '。结果[]|如果.path = =“。”然后“/”+ . name " +。$csvFileName . path + "/" + .name end' > $csvFileName . path
如果[$?-ne 0];然后
在$REPO中查询可索引工件路径失败
出口1
fi
totalIndexableArtifacts=$(wc -l < $csvFileName | xargs) #使用xargs修剪空格
if [$totalIndexableArtifacts -eq 0];然后
echo“在存储库$REPO中没有找到索引的工件”
退出0
fi
“正在上传查询结果到临时表…”
“\copy temp_root_files_to_index FROM”。/ $ csvFileName csv”
如果[$?-ne 0];然后
将工件路径复制到临时数据库表失败
出口1
fi
在临时表上建立索引…
psql $PSQL_CONN_STRING -qc "创建唯一索引如果不存在temp_root_files_to_index_idx temp_root_files_to_index(路径);"
如果[$?-ne 0];然后
在临时数据库表上创建索引失败
出口1
fi
echo“查询$REPO中未被x射线索引的工件…”
nonIndexedArtifactsCsvFileName = " not_indexed_artifacts.csv "
read -r -d " diffQuery <<- EOM .
SELECT path FROM temp_root_files_to_index
除了
SELECT CASE WHEN路径|| 'manifest。json' = name THEN名称
ELSE路径||名称
结束
从root_files
WHERE repo='$ repo ' AND scanned_time > 0;
加工
psql $PSQL_CONN_STRING -AXqtc "$diffQuery" > $nonIndexedArtifactsCsvFileName
# psql $PSQL_CONN_STRING "SELECT path FROM temp_root_files_to_index EXCEPT SELECT path || name FROM root_files WHERE repo='$ repo ' AND scanned_time > 0;> nonIndexedArtifactsCsvFileName美元
如果[$?-ne 0];然后
echo“查询非索引工件失败”
出口1
fi
DROP TABLE IF EXISTS temp_root_files_to_index;"
如果[$?-ne 0];然后
删除临时数据库表失败
fi
notIndexedArtifactsCount=$(wc -l < $nonIndexedArtifactsCsvFileName | xargs)
notIndexedPercentage = $ ((notIndexedArtifactsCount * 100 / totalIndexableArtifacts美元))
回声 "---------------------------------------------------"
echo "仓库'$REPO'结果(最后$LAST_DAYS天,直到$BEFORE_MINUTES分钟前):"
echo“总的可索引工件:$totalIndexableArtifacts”
echo“未索引的工件:$notIndexedArtifactsCount ($notIndexedPercentage %)”
echo“未索引的工件路径写入:$nonIndexedArtifactsCsvFileName”
由此,我们现在应该能够识别当前没有被索引的工件,以及部署日期。与此相关,我们需要调整停留时间并且需要再次重新索引存储库。
同样,一旦调整了保留期,也可以使用下面的脚本重新索引未被索引的工件
重新索引工件:
#!/bin/bash
如果!命令-v jq &> /dev/null
然后
Echo“运行此脚本必须安装jq”
出口1
fi
# UNIFIED_URL = " http://localhost: 8046 "
#用户名= "管理"
#密码= "密码"
#回购= " example-repo-local "
#回购= " maven-remote "
# NOT_INDEXED_ARTIFACTS_FILENAME = not_indexed_artifacts.csv
#用法示例:
# ./repo-xray-trigger-index-artifacts-paths.sh -f not_indexed_artifacts.csv -r example-repo-local -j http://localhost:8046 -u admin -p password
函数用法(){
echo "用法:$0 -r REPO_NAME -f NOT_INDEXED_ARTIFACTS_FILENAME -j JFROG_PLATFORM_URL -u USERNAME -p PASSWORD" 1>&2
}
函数exit_abnormal() {
使用
出口1
}
函数validate_args() {
if [-z "$REPO"];然后
echo "必须提供'Repository'参数(-r REPO_NAME) "
exit_abnormal
elif [-z "${NOT_INDEXED_ARTIFACTS_FILENAME}"];然后
echo "必须提供'非索引工件文件'参数(-f NOT_INDEXED_ARTIFACTS_FILENAME) "
exit_abnormal
Elif [!]-f "${NOT_INDEXED_ARTIFACTS_FILENAME}"];然后
echo“未索引的工件文件'${NOT_INDEXED_ARTIFACTS_FILENAME}'不存在”
出口1
elif [-z "$UNIFIED_URL"];然后
echo "必须提供'JFrog平台Url'参数(-j JFROG_PLATFORM_URL) "
exit_abnormal
elif [-z "$USERNAME"];然后
echo "必须提供'JFrog平台用户名'参数(-u Username) "
exit_abnormal
elif [-z "$PASSWORD"];然后
echo "必须提供'JFrog平台密码'参数(-p Password) "
exit_abnormal
fi
}
函数validate_ping() {
pingArtifactoryUrl = " $ UNIFIED_URL / artifactory / api /系统/平”
statusCode=$(curl -S -S -o /dev/null -u$USERNAME:$PASSWORD $pingArtifactoryUrl——write out "%{http_code}")
if ["$statusCode" != "200"];然后
echo "Failed to pingArtifactory server in the url: ${pingArtifactoryUrl}"
echo“HTTP状态码:$statusCode”
出口1
fi
pingXrayUrl = " $ UNIFIED_URL / x光/ api / v1 /系统/平”
statusCode=$(curl -S -S -o /dev/null -u$USERNAME:$PASSWORD $pingXrayUrl——write out "%{http_code}")
if ["$statusCode" != "200"];然后
echo "在${pingXrayUrl}内ping x射线服务器失败"
echo“HTTP状态码:$statusCode”
出口1
fi
}
While getopts ":r:f:j:u:p:" opt;做
输入“${opt}”
r)
回购= $ {OPTARG}
;;
f)
NOT_INDEXED_ARTIFACTS_FILENAME = $ {OPTARG}
;;
j)
UNIFIED_URL = $ {OPTARG}
UNIFIED_URL=${UNIFIED_URL%/} #修饰后面的斜杠
;;
u)
用户名= $ {OPTARG}
;;
p)
密码= $ {OPTARG}
;;
:) #如果预期参数被省略:
${OPTARG}需要一个参数
exit_abnormal
;;
\?) #如果未知(任何其他)选项:
echo“无效选项:-$OPTARG”>&2
exit_abnormal
;;
esac
完成
validate_args
validate_ping
rClass=$(curl -s -u$USERNAME:$PASSWORD $UNIFIED_URL/artifactory/api/repositories/$REPO | jq -r .rclass)
if [-z "$rClass"] || ["$rClass" == "null"]
然后
获取$REPO存储库类型失败
出口1
elif (" $ rClass " ! = "的地方 " ] && [ "$ rClass " ! = "远程”)
然后
只支持本地和远程存储库(repoType: $rClass)"
出口1
elif ["$rClass" == "remote"]
然后
回购+ =“缓存”
fi
firstPath=$(head -1 ${NOT_INDEXED_ARTIFACTS_FILENAME})
#剥离引号如果存在
firstPath = " $ {firstPath % \“}”
firstPath = " $ {firstPath # \“}”
artifactSha256=$(curl -s -u$USERNAME:$PASSWORD -I $UNIFIED_URL/artifactory/${REPO}${firstPath} | grep X-Checksum-Sha256)
if [-z "${artifactSha256}"];然后
无法检索sha256的工件路径${firstPath}
${NOT_INDEXED_ARTIFACTS_FILENAME}应该包含现有工件路径列表"
出口1
fi
totalPaths = 0
totalPathsSentToReindex = 0
failedToSendToReindexFileName = " failed-to-send-for-reindex.csv "
rm -rf $ failedtosendto驯鹿文件名
while IFS="" read -r p || [-n "$p"]
做
(totalPaths + +)
if [$($totalPaths % 100)) -eq 0];然后
echo“触发$totalPaths工件索引到目前为止”
fi
#剥离引号如果存在
p = " $ {p % \“}”
p = " $ {p # \“}”
repoPath = " ${回购}$ {p} "
requestBody = "{\“repo_path \”,\“$ repoPath \“}”
sentPath=$(curl -s -u$USERNAME:$PASSWORD -X POST -H 'Content-Type:application/json' $UNIFIED_URL/xray/api/v2/index——data "$requestBody" | jq '.sent_to_reindex.artifacts[0].path')
如果[- z”sentPath美元 " ] || [ "$ sentPath " = = "空");然后
echo“发送文件$repoPath重索引失败”
echo $p >> $ failedtosendto驯鹿文件名
其他的
(totalPathsSentToReindex + +)
fi
done < "${NOT_INDEXED_ARTIFACTS_FILENAME}"
if [$totalPaths -eq $totalPathsSentToReindex];然后
echo“发送${totalPaths}工件成功重新索引”
其他的
sentPercentage = $ ((totalPathsSentToReindex * 100 / totalPaths))
echo“发送到${totalPaths}工件(${sentPercentage}%)重新索引${totalPathsSentToReindex}”
echo "重新索引发送失败的工件被写入${failedToSendToReindexFileName}"
fi
通过执行上面的步骤,如果我们在存储库上部署了有效的工件,那么就有可能将索引状态设置为100%。