name: MoviePilot Builder v2 on: workflow_dispatch: push: branches: - v2 paths: - 'version.py' jobs: Docker-build: runs-on: ubuntu-latest name: Build Docker Image steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true - name: Release version id: release_version run: | app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") echo "app_version=$app_version" >> $GITHUB_ENV - name: Docker Meta id: meta uses: docker/metadata-action@v5 with: images: | ${{ secrets.DOCKER_USERNAME }}/moviepilot-v2 ${{ secrets.DOCKER_USERNAME }}/moviepilot ghcr.io/${{ github.repository }} tags: | type=raw,value=${{ env.app_version }} type=raw,value=latest - name: Set Up QEMU uses: docker/setup-qemu-action@v3 - name: Set Up Buildx uses: docker/setup-buildx-action@v3 - name: Login DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build Image uses: docker/build-push-action@v5 with: context: . file: docker/Dockerfile platforms: | linux/amd64 linux/arm64/v8 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha, scope=${{ github.workflow }}-docker cache-to: type=gha, scope=${{ github.workflow }}-docker - name: Generate Changelog id: changelog run: | # 获取上一个 tag(排除当前版本的 tag) PREVIOUS_TAG=$(git tag -l 'v*' --sort=-v:refname | grep -v "^v${{ env.app_version }}$" | head -n 1) echo "Previous tag: $PREVIOUS_TAG" # 使用 || 作为分隔符,同时获取 commit 消息和作者 GitHub 用户名 if [ -z "$PREVIOUS_TAG" ]; then COMMITS=$(git log --pretty=format:"%s||%an" HEAD) else COMMITS=$(git log --pretty=format:"%s||%an" ${PREVIOUS_TAG}..HEAD) fi # 分类收集 commit 消息(使用关联数组去重) declare -A SEEN FEATURES="" FIXES="" OTHERS="" while IFS= read -r line; do # 跳过空行 if [ -z "$line" ]; then continue fi # 分离 commit 消息和作者 msg=$(echo "$line" | sed 's/||[^|]*$//') author=$(echo "$line" | sed 's/.*||//') # 跳过 Merge commit 和版本更新 commit if echo "$msg" | grep -qE "^Merge pull request|^Merge branch|^更新 version"; then continue fi # 按 Conventional Commits 前缀分类 if echo "$msg" | grep -qiE "^feat(\(.+\))?:"; then desc=$(echo "$msg" | sed -E 's/^feat(\([^)]*\))?:\s*//') category="FEATURES" elif echo "$msg" | grep -qiE "^fix(\(.+\))?:"; then desc=$(echo "$msg" | sed -E 's/^fix(\([^)]*\))?:\s*//') category="FIXES" elif echo "$msg" | grep -qiE "^(docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?:"; then desc=$(echo "$msg" | sed -E 's/^(docs|style|refactor|perf|test|build|ci|chore|revert)(\([^)]*\))?:\s*//') category="OTHERS" else desc="$msg" category="OTHERS" fi # 使用 "分类+描述" 作为去重的 key,跳过重复内容 dedup_key="${category}::${desc}" if [ -n "${SEEN[$dedup_key]+x}" ]; then continue fi SEEN[$dedup_key]=1 # 添加 by @author 引用 entry="- ${desc} by @${author}" case "$category" in FEATURES) FEATURES="${FEATURES}${entry}\n" ;; FIXES) FIXES="${FIXES}${entry}\n" ;; OTHERS) OTHERS="${OTHERS}${entry}\n" ;; esac done <<< "$COMMITS" # 组装 changelog CHANGELOG="" if [ -n "$FEATURES" ]; then CHANGELOG="${CHANGELOG}### ✨ 新功能\n\n${FEATURES}\n" fi if [ -n "$FIXES" ]; then CHANGELOG="${CHANGELOG}### 🐛 修复\n\n${FIXES}\n" fi if [ -n "$OTHERS" ]; then CHANGELOG="${CHANGELOG}### 🔧 其他\n\n${OTHERS}\n" fi # 添加版本对比链接 if [ -n "$PREVIOUS_TAG" ]; then CHANGELOG="${CHANGELOG}**完整更新记录**: https://github.com/${{ github.repository }}/compare/${PREVIOUS_TAG}...v${{ env.app_version }}" fi # 写入环境变量 echo "CHANGELOG<> $GITHUB_ENV echo -e "$CHANGELOG" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV - name: Get existing release body id: get_release_body continue-on-error: true run: | release_body=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ "https://api.github.com/repos/${{ github.repository }}/releases/tags/v${{ env.app_version }}" | \ jq -r '.body // ""') # 如果已有手动编写的 release body,则保留;否则使用自动生成的 changelog if [ -n "$release_body" ] && [ "$release_body" != "null" ] && [ "$release_body" != "" ]; then echo "RELEASE_BODY<> $GITHUB_ENV echo "$release_body" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV else echo "RELEASE_BODY<> $GITHUB_ENV echo "${{ env.CHANGELOG }}" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV fi - name: Delete Release uses: dev-drprasad/delete-tag-and-release@v1.1 continue-on-error: true with: tag_name: v${{ env.app_version }} delete_release: true github_token: ${{ secrets.GITHUB_TOKEN }} - name: Generate Release uses: softprops/action-gh-release@v2 with: tag_name: v${{ env.app_version }} name: v${{ env.app_version }} body: ${{ env.RELEASE_BODY }} draft: false prerelease: false make_latest: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}