MoviePilot Builder v2 #952
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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<<EOF" >> $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<<EOF" >> $GITHUB_ENV | |
| echo "$release_body" >> $GITHUB_ENV | |
| echo "EOF" >> $GITHUB_ENV | |
| else | |
| echo "RELEASE_BODY<<EOF" >> $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 }} |