diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a719ca9d..0c62985a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,12 @@ variables: - if: $CI_COMMIT_BRANCH =~ /feat_[a-zA-Z]+/ - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+\.[0-9]+)?$/ +.tag_rule: + tags: + - macos + - flutter + rules: + - if: $CI_COMMIT_BRANCH == "master" .print_env: stage: test @@ -51,6 +57,16 @@ test_lint_check: - macos - flutter +git_tag: + stage: generate_tag + extends: .tag_rule + before_script: + - project_url=$(echo $CI_PROJECT_URL | sed 's/http:\/\///') + - echo "project_url:$project_url" + - git remote set-url origin http://gitlab-ci-token:${GITLAB_ACCESS_TOKEN}@$project_url.git + script: + - bash tag_generator.sh + build_android: stage: package extends: .setup_fastlane_android @@ -83,6 +99,9 @@ create-release: - if: $CI_COMMIT_TAG before_script: - echo "start create release" + - bash release_description_generator.sh + - export RELEASE_DESCRIPTION="$(cat changelog.md)" + - echo "${RELEASE_DESCRIPTION}" script: - export StarLock_VERSION=${CI_COMMIT_TAG#*-} - echo "Uploading StarLock-${StarLock_VERSION} packages to @@ -94,14 +113,14 @@ create-release: - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file build/app/outputs/flutter-apk/starlock-sky-release-${CI_COMMIT_TAG}.apk "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-sky-release-${CI_COMMIT_TAG}.apk"' - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file build/app/outputs/flutter-apk/starlock-sky-release-${CI_COMMIT_TAG}.aab - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-sky-release-${CI_COMMIT_TAG}.aab"' + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-sky-release-${CI_COMMIT_TAG}.aab"' - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file build/app/outputs/flutter-ipa/starlock-xhj-release-${CI_COMMIT_TAG}.ipa "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-xhj-release-${CI_COMMIT_TAG}.ipa"' - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file build/app/outputs/flutter-ipa/starlock-sky-release-${CI_COMMIT_TAG}.ipa - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-sky-release-${CI_COMMIT_TAG}.ipa"' + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${StarLock_VERSION}/starlock-sky-release-${CI_COMMIT_TAG}.ipa"' release: name: '$CI_COMMIT_TAG' - description: 'Created Release By GitLab CI/CD' + description: '$(cat changelog.md)' tag_name: '$CI_COMMIT_TAG' ref: '$CI_COMMIT_TAG' assets: diff --git a/release_description_generator.sh b/release_description_generator.sh new file mode 100755 index 00000000..02015333 --- /dev/null +++ b/release_description_generator.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# 读取环境变量 +URL=$CI_API_V4_URL +TOKEN=$GITLAB_ACCESS_TOKEN +PROJECT_ID=$CI_PROJECT_ID + +echo "PRIVATE-TOKEN: $TOKEN $URL/projects/$PROJECT_ID/repository/tags" +tags_json=$(curl -H "Content-Type: application/json" -H "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/tags") +echo "tags_json:$tags_json\n" +tags=$(echo "$tags_json" | jq -r '.[].name') +tags_length=$(echo "$tags_json" | jq -r 'length') +if [ "$tags_length" -lt 2 ]; then + newest_tag="master" + second_newest_tag=$(echo "$tags" | head -n 1) +else + newest_tag=$(echo "$tags" | head -n 1) + second_newest_tag=$(echo "$tags" | head -n 2 | tail -n 1) +fi +echo "newest_tag:$newest_tag-second_newest_tag:$second_newest_tag\n" +# 比较两个tag之间的commits +compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=$second_newest_tag&to=$newest_tag") +#echo "compare_json:$compare_json\n" +feat_log="" +fix_log="" +other_log="" +while IFS= read -r commit_json; do + # 使用 jq 解析每一行的 JSON 对象 + commit_id=$(echo "$commit_json" | jq -r '.id') + commit_message=$(echo "$commit_json" | jq -r '.message') + if [[ "$commit_message" =~ ("feat:"*) ]]; then + feat_log+="* ${commit_message#feat:}\n" + elif [[ "$commit_message" =~ ("fix:"*) ]]; then + fix_log+="* ${commit_message#fix:}\n" + elif [[ ! "$commit_message" =~ ("Merge"* | "Revert"*) ]]; then + other_log+="* ${commit_message#("Merge" | "Revert")}\n" + fi +done < <(echo "$compare_json" | jq -c '.commits[] | {id: .id, message: .message}') + +echo -e "feat_log:$feat_log,fix_log:$fix_log,other_log:$other_log" +# 如果没有feat或fix的commits,则设置默认日志 +if [[ -z "$feat_log" ]]; then + feat_log="- No 'feat' commits since last tagged commit." +fi +if [[ -z "$fix_log" ]]; then + fix_log="- No 'fix' commits since last tagged commit." +fi + +# 生成changelog文本 +changelog="# Features\n$feat_log\n# Fixes\n$fix_log\n# Others\n$other_log" + +# 打印结果(或可以重定向到文件等) +echo "$changelog" + +# (可选)将结果保存到文件中 +echo -e "$changelog" > changelog.md \ No newline at end of file diff --git a/tag_generator.sh b/tag_generator.sh new file mode 100755 index 00000000..5bfe5c93 --- /dev/null +++ b/tag_generator.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# 读取环境变量 +URL=$CI_API_V4_URL +TOKEN=$GITLAB_ACCESS_TOKEN +PROJECT_ID=$CI_PROJECT_ID +next_tag="" +echo "PRIVATE-TOKEN: $TOKEN $URL/projects/$PROJECT_ID/repository/tags" +tags_json=$(curl -H "Content-Type: application/json" -H "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/tags") +#echo "tags_json:$tags_json\n" +tags=$(echo "$tags_json" | jq -r '.[].name') +tags_length=$(echo "$tags_json" | jq -r 'length') +if [ "$tags_length" -lt 1 ]; then + next_tag="v1.0.0" +else + newest_tag=$(echo "$tags" | head -n 1) + IFS='.' read -r major minor patch <<< "$newest_tag" + major="${major#v}" + echo "newest_tag:$newest_tag-second_newest_tag:$second_newest_tag\n" + # 比较两个tag之间的commits + compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=$newest_tag&to=master") + echo "compare_json:$compare_json\n" + while IFS= read -r commit_json; do + # 使用 jq 解析每一行的 JSON 对象 + commit_id=$(echo "$commit_json" | jq -r '.id') + commit_message=$(echo "$commit_json" | jq -r '.message') + echo "----$commit_message" + if [[ "$commit_message" =~ ("feat:"*) ]]; then + ((minor++)) + patch=0 + break + elif [[ "$commit_message" =~ ("fix:"*) ]]; then + ((patch++)) + elif [[ ! "$commit_message" =~ ("Merge"* | "Revert"*) ]]; then + ((patch++)) + fi + done < <(echo "$compare_json" | jq -c '.commits[] | {id: .id, message: .message}') + next_tag="v$major.$minor.$patch" + if [ "$next_tag" == "$newest_tag" ]; then + echo "no change from master,skip to generate tag" + exit 0 + fi +fi +echo "New version: $next_tag" +git config user.name +git tag $next_tag +git push -u origin $next_tag \ No newline at end of file