在 Gitlab README.md 中为 SonarQube 徽章使用 Gitlab 变量
Using Gitlab Variables in Gitlab README.md for SonarQube Badges
我正在使用 Gitlab 和 Sonarqube 以及 Sonarqube Plugin SVG Badges。
为了在 gitlab 上表示 Sonarqube 状态,我的 README.md
文件中有这样的内容:
[![coverage](https://sonar.domain.com/api/badges/measure?key=com.domain:projectname&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id=de.domain:projectname)
这很完美。显示了我的徽章,link 正常工作,一切正常。
有什么方法可以构建类似的东西:
[![coverage](https://sonar.domain.com/api/badges/measure?key={MYDOMAIN}:{THIS}&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:{THIS})
我想提供一个框架,每个开发人员都可以将其复制并粘贴到他们的 README.md
文件中,变量会自动填充到自述文件中,例如 .gitlab-ci.yml
我也尝试了永久的 Gitlab 变量 mentioned here 但那也不起作用!
[![coverage](https://sonar.domain.com/api/badges/measure?key=com.mydomain:$CI_PROJECT_NAME&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:$CI_PROJECT_NAME)
有人知道吗?
https://gitlab.com/help/ci/variables/README.md are present only in a CI environment (i.e. a job), so you can't use them in the Markdown viewer when displaying the file. - That's a great idea for a feature proposal, though. I opened one - https://gitlab.com/gitlab-org/gitlab-ce/issues/32255中的变量。随时插话。
您可以做的是在您希望这些变量所在的位置添加一个占位符,然后创建一个包含 sed
的作业。
update_readme:
script:
- echo $CI_PROJECT_NAME # Sanity check
- sed -ie "s/{THIS}/$CI_PROJECT_NAME/g" README.md
注意使用双引号 (") 而不是单引号 (')。使用双引号将插入 $CI_PROJECT_NAME
,而单引号只会保留其文字值。
重要!
You should implement a branch/logic to avoid triggering the .gitlab-ci.yml
in an infinite loop because you are asking to update a repository file from the CI itself
方法是:
- 准备
README.md
在徽章周围使用特殊分隔符
- 用
payload
替换 old/initial 徽章(你应该建造它,而不是
此处显示)在存储库中加载 README.md
- 对替换内容进行 urlencode
- 使用 Gitlab 更新存储库 API
README.md
Hello
[//]: # (-- start --)
Initial non working badge
[//]: # (-- end --)
World
.gitlab-ci.yml
update_readme:
script:
- curl --request PUT --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' 'https://gitlab.example.com/api/v4/projects/13083/repository/README%2Emd?branch=master&content=$(urlencode "$(sed 's_\[//\]: # (-- end --)_\n&_g;s_\(\[//\]: # (-- start --)\)[^\n]*\n_\npayload\n_g' README.md)")&commit_message=update%20file'
在 sed
命令中,将 payload
替换为您的实际徽章(您应该构建它,此处未显示)
- 解决方案是使用 Update existing file in repository API
编写 README.md
README.md
应该使用特殊的字符串定界符,这些定界符不会出现渲染(它们就像隐藏的注释)。这些定界符始终在文件中,不会被替换。只有它们之间的内容才会被替换。这样您就可以在每次 运行 .gitlab-ci.yml
时自动更新徽章(只有徽章得到更新)
- 替换是由
sed
命令完成的,因此您需要将路径添加到 README.md
- 更新 API 需要对
content
进行 urlencoded(因此 sed
命令被应该加载的 bash urlencode()
函数包装首先(加载未显示):
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
备注:
[//]: # (-- start --)
不会影响 README.md
的渲染,因此您可以像隐藏评论一样使用它
用 Gitlab 替换你的私有令牌 CI Secret variable
我正在使用 Gitlab 和 Sonarqube 以及 Sonarqube Plugin SVG Badges。
为了在 gitlab 上表示 Sonarqube 状态,我的 README.md
文件中有这样的内容:
[![coverage](https://sonar.domain.com/api/badges/measure?key=com.domain:projectname&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id=de.domain:projectname)
这很完美。显示了我的徽章,link 正常工作,一切正常。
有什么方法可以构建类似的东西:
[![coverage](https://sonar.domain.com/api/badges/measure?key={MYDOMAIN}:{THIS}&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:{THIS})
我想提供一个框架,每个开发人员都可以将其复制并粘贴到他们的 README.md
文件中,变量会自动填充到自述文件中,例如 .gitlab-ci.yml
我也尝试了永久的 Gitlab 变量 mentioned here 但那也不起作用!
[![coverage](https://sonar.domain.com/api/badges/measure?key=com.mydomain:$CI_PROJECT_NAME&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:$CI_PROJECT_NAME)
有人知道吗?
https://gitlab.com/help/ci/variables/README.md are present only in a CI environment (i.e. a job), so you can't use them in the Markdown viewer when displaying the file. - That's a great idea for a feature proposal, though. I opened one - https://gitlab.com/gitlab-org/gitlab-ce/issues/32255中的变量。随时插话。
您可以做的是在您希望这些变量所在的位置添加一个占位符,然后创建一个包含 sed
的作业。
update_readme:
script:
- echo $CI_PROJECT_NAME # Sanity check
- sed -ie "s/{THIS}/$CI_PROJECT_NAME/g" README.md
注意使用双引号 (") 而不是单引号 (')。使用双引号将插入 $CI_PROJECT_NAME
,而单引号只会保留其文字值。
重要!
You should implement a branch/logic to avoid triggering the
.gitlab-ci.yml
in an infinite loop because you are asking to update a repository file from the CI itself
方法是:
- 准备
README.md
在徽章周围使用特殊分隔符 - 用
payload
替换 old/initial 徽章(你应该建造它,而不是 此处显示)在存储库中加载README.md
- 对替换内容进行 urlencode
- 使用 Gitlab 更新存储库 API
README.md
Hello
[//]: # (-- start --)
Initial non working badge
[//]: # (-- end --)
World
.gitlab-ci.yml
update_readme:
script:
- curl --request PUT --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' 'https://gitlab.example.com/api/v4/projects/13083/repository/README%2Emd?branch=master&content=$(urlencode "$(sed 's_\[//\]: # (-- end --)_\n&_g;s_\(\[//\]: # (-- start --)\)[^\n]*\n_\npayload\n_g' README.md)")&commit_message=update%20file'
在 sed
命令中,将 payload
替换为您的实际徽章(您应该构建它,此处未显示)
- 解决方案是使用 Update existing file in repository API 编写
README.md
应该使用特殊的字符串定界符,这些定界符不会出现渲染(它们就像隐藏的注释)。这些定界符始终在文件中,不会被替换。只有它们之间的内容才会被替换。这样您就可以在每次 运行.gitlab-ci.yml
时自动更新徽章(只有徽章得到更新)- 替换是由
sed
命令完成的,因此您需要将路径添加到README.md
- 更新 API 需要对
content
进行 urlencoded(因此sed
命令被应该加载的 bashurlencode()
函数包装首先(加载未显示):
README.md
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
备注:
[//]: # (-- start --)
不会影响 README.md
的渲染,因此您可以像隐藏评论一样使用它
用 Gitlab 替换你的私有令牌 CI Secret variable