Skip to content

.github/workflows/action.yaml #692

.github/workflows/action.yaml

.github/workflows/action.yaml #692

Workflow file for this run

on:
schedule:
# 每天 05:00 执行(北京时间 13:00)
- cron: '0 5 * * *'
# 允许手动执行
workflow_dispatch:
inputs:
targetVersion:
# 目标版本。不提供时会自动检查、更新代码版本、发布 latest release,提供了则不会更新代码版本,release 也不会 latest
description: 'Calibre version'
required: false
default: ''
jobs:
check-update:
runs-on: ubuntu-latest
outputs:
build: ${{ steps.post.outputs.build }}
update: ${{ steps.post.outputs.update }}
version: ${{ steps.post.outputs.version }}
steps:
- name: fetch all tags
uses: actions/checkout@v4
if: ${{ inputs.targetVersion != '' }}
with:
fetch-depth: 0
- name: fetch latest tag
uses: actions/checkout@v4
if: ${{ inputs.targetVersion == '' }}
- name: Pre-check
id: pre
if: ${{ inputs.targetVersion != '' }}
run: |
calibre_url="https://raw.githubusercontent.com/kovidgoyal/calibre/v${{ inputs.targetVersion }}/src/calibre/db/backend.py"
status_code=`curl -L -s -o /dev/null -w "%{http_code}" "${calibre_url}"`
if [ ${status_code} = "200" ]; then
if [ ! $(git tag -l "v${{ inputs.targetVersion }}") ]; then
echo "Target version check OK"
echo "build=1" >> $GITHUB_OUTPUT
echo "update=0" >> $GITHUB_OUTPUT
echo "version=${{ inputs.targetVersion }}" >> $GITHUB_OUTPUT
else
# 本仓库 Tag 已存在
echo "Tag exists"
echo "::error title=Tag exists::Perhaps a patch for v${{ inputs.targetVersion }} has been created"
echo "build=0" >> $GITHUB_OUTPUT
echo "update=0" >> $GITHUB_OUTPUT
fi
else
# 目标版本不存在
echo "Target version not found"
echo "::error title=Invalid version::Calibre v${{ inputs.targetVersion }} not exists"
echo "build=0" >> $GITHUB_OUTPUT
echo "update=0" >> $GITHUB_OUTPUT
fi
cat $GITHUB_OUTPUT
- name: Check Version
id: check
if: ${{ inputs.targetVersion == '' }}
run: |
curl -L -k https://code.calibre-ebook.com/latest -o REMOTE_VERSION
echo "version=$(cat REMOTE_VERSION)" >> $GITHUB_OUTPUT
if diff --brief REMOTE_VERSION CALIBRE_VERSION > /dev/null; then
echo "::notice title=Calibre Version not Changed::$(cat REMOTE_VERSION)"
echo "build=0" >> $GITHUB_OUTPUT
echo "update=0" >> $GITHUB_OUTPUT
else
echo "::notice title=New Version Found!::$(cat REMOTE_VERSION)"
echo "build=1" >> $GITHUB_OUTPUT
echo "update=1" >> $GITHUB_OUTPUT
fi
- name: Post-check
id: post
run: |
if [ "${{ inputs.targetVersion }}" = '' ]; then
echo "build=${{ steps.check.outputs.build }}" >> $GITHUB_OUTPUT
echo "update=${{ steps.check.outputs.update }}" >> $GITHUB_OUTPUT
echo "version=${{ steps.check.outputs.version }}" >> $GITHUB_OUTPUT
else
echo "build=${{ steps.pre.outputs.build }}" >> $GITHUB_OUTPUT
echo "update=${{ steps.pre.outputs.update }}" >> $GITHUB_OUTPUT
echo "version=${{ steps.pre.outputs.version }}" >> $GITHUB_OUTPUT
fi
build:
runs-on: ubuntu-latest
needs: check-update
if: needs.check-update.outputs.build == '1'
env:
CALIBRE_VERSION: ${{ needs.check-update.outputs.version }}
patch_linux_x64_v1: linux-x64-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_linux_x64_v2: linux-x64-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_linux_x64_txz: linux-x64-patched-v${{ needs.check-update.outputs.version }}.txz
patch_linux_arm64_v1: linux-arm64-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_linux_arm64_v2: linux-arm64-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_linux_arm64_txz: linux-arm64-patched-v${{ needs.check-update.outputs.version }}.txz
patch_mac_v1: mac-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_mac_v2: mac-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
outputs:
pyver: ${{ steps.pyver.outputs.PYTHON_VERSION }}
steps:
- uses: actions/checkout@v3
- name: Install Dependencies
run: |
sudo apt-get update
echo "Installing 7z"
curl -L https://www.7-zip.org/a/7z2408-linux-x64.tar.xz -o 7z.tar.xz
mkdir 7z
tar Jxf 7z.tar.xz -C 7z
echo "PATH=$(pwd)/7z:$PATH" >> $GITHUB_ENV
./7z/7zz i
- name: Download packages
run: |
echo "Downloading Linux x64 packages v$CALIBRE_VERSION"
curl -L "https://download.calibre-ebook.com/$CALIBRE_VERSION/calibre-$CALIBRE_VERSION-x86_64.txz" -o calibre-x64.txz
echo "Downloading Linux arm64 packages v$CALIBRE_VERSION"
curl -L "https://download.calibre-ebook.com/$CALIBRE_VERSION/calibre-$CALIBRE_VERSION-arm64.txz" -o calibre-arm64.txz
echo "Downloading Mac packages v$CALIBRE_VERSION"
curl -L "https://download.calibre-ebook.com/$CALIBRE_VERSION/calibre-$CALIBRE_VERSION.dmg" -o calibre.dmg
echo "Download Calibre source"
git clone --depth 1 --branch v$CALIBRE_VERSION https://github.com/kovidgoyal/calibre.git
- name: Extract packages
run: |
echo "Extracting Linux x64 packages"
mkdir calibre-linux-x64
tar Jxvf calibre-x64.txz -C calibre-linux-x64
echo "Extracting Linux arm64 packages"
mkdir calibre-linux-arm64
tar Jxvf calibre-arm64.txz -C calibre-linux-arm64
echo "Extracting Mac packages"
./7z/7zz x -y -ocalibre-mac calibre.dmg calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen calibre.app/Contents/Frameworks/calibre-launcher.dylib
- name: Get Python version
id: pyver
run: |
PYV="$(find ./calibre-linux-x64/lib -name 'libpython*' | grep -oP '(?<=libpython)\d\.\d+')"
echo "::notice title=Calibre Python Version::$PYV"
echo "PYTHON_VERSION=$PYV" >> $GITHUB_OUTPUT
- uses: actions/setup-python@v4
with:
python-version: ${{ steps.pyver.outputs.PYTHON_VERSION }}
cache: 'pip'
- name: Install Python requirements
run: |
pip install -r requirements.txt
- name: Patch py
run: |
echo "[=] Patch backend.py"
python patch_backend.py --os unix calibre/src/calibre/db/backend.py backend.py
python compile.py backend.py backend.pyc
echo "[=] Patch update.py"
python patch_update.py calibre/src/calibre/gui2/update.py update.py
python compile.py update.py update.pyc
- name: Patch bypy linux x64
run: |
mkdir -p lib/calibre-extensions/
echo "[=] Patch Linux x64 bypy"
echo "[==] Patch bypy:backend.pyc"
chmod 644 calibre-linux-x64/lib/calibre-extensions/python-lib.bypy.frozen
python patch_bypy.py \
--os linux \
--bypy calibre-linux-x64/lib/calibre-extensions/python-lib.bypy.frozen \
--launcher calibre-linux-x64/lib/libcalibre-launcher.so \
--new-pyc-file backend.pyc \
--embed_path "calibre/db/backend.pyc"
cp calibre-linux-x64/lib/calibre-extensions/python-lib.bypy.frozen \
lib/calibre-extensions/python-lib.bypy.frozen
zip -r $patch_linux_x64_v1 lib
echo "[==] Patch bypy:update.pyc"
python patch_bypy.py \
--os linux \
--bypy calibre-linux-x64/lib/calibre-extensions/python-lib.bypy.frozen \
--launcher calibre-linux-x64/lib/libcalibre-launcher.so \
--new-pyc-file update.pyc \
--embed_path "calibre/gui2/update.py"
cp calibre-linux-x64/lib/calibre-extensions/python-lib.bypy.frozen \
lib/calibre-extensions/python-lib.bypy.frozen
zip -r $patch_linux_x64_v2 lib
tar Jcf $patch_linux_x64_txz calibre-linux-x64/*
- name: Patch bypy linux arm64
run: |
mkdir -p lib/calibre-extensions/
echo "[=] Patch Linux arm64 bypy"
echo "[==] Patch bypy:backend.pyc"
chmod 644 calibre-linux-arm64/lib/calibre-extensions/python-lib.bypy.frozen
python patch_bypy.py \
--os linux \
--bypy calibre-linux-arm64/lib/calibre-extensions/python-lib.bypy.frozen \
--launcher calibre-linux-arm64/lib/libcalibre-launcher.so \
--new-pyc-file backend.pyc \
--embed_path "calibre/db/backend.pyc"
cp calibre-linux-arm64/lib/calibre-extensions/python-lib.bypy.frozen \
lib/calibre-extensions/python-lib.bypy.frozen
zip -r $patch_linux_arm64_v1 lib
echo "[==] Patch bypy:update.pyc"
python patch_bypy.py \
--os linux \
--bypy calibre-linux-arm64/lib/calibre-extensions/python-lib.bypy.frozen \
--launcher calibre-linux-arm64/lib/libcalibre-launcher.so \
--new-pyc-file update.pyc \
--embed_path "calibre/gui2/update.py"
cp calibre-linux-arm64/lib/calibre-extensions/python-lib.bypy.frozen \
lib/calibre-extensions/python-lib.bypy.frozen
zip -r $patch_linux_arm64_v2 lib
tar Jcf $patch_linux_arm64_txz calibre-linux-arm64/*
- name: Patch bypy macOS
run: |
echo "[=] Patch macOS bypy"
echo "[==] Patch bypy:backend.pyc"
chmod 644 calibre-mac/calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen
python patch_bypy.py \
--os mac \
--bypy calibre-mac/calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen \
--launcher calibre-mac/calibre.app/Contents/Frameworks/calibre-launcher.dylib \
--new-pyc-file backend.pyc \
--embed_path "calibre/db/backend.pyc"
cp calibre-mac/calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen .
zip $patch_mac_v1 python-lib.bypy.frozen
echo "[==] Patch bypy:update.pyc"
python patch_bypy.py \
--os mac \
--bypy calibre-mac/calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen \
--launcher calibre-mac/calibre.app/Contents/Frameworks/calibre-launcher.dylib \
--new-pyc-file update.pyc \
--embed_path "calibre/gui2/update.py"
cp calibre-mac/calibre.app/Contents/Frameworks/plugins/python-lib.bypy.frozen .
zip $patch_mac_v2 python-lib.bypy.frozen
- uses: actions/upload-artifact@v3
with:
name: patch_linux_x64_v1
path: ${{ env.patch_linux_x64_v1 }}
- uses: actions/upload-artifact@v3
with:
name: patch_linux_x64_v2
path: ${{ env.patch_linux_x64_v2 }}
- uses: actions/upload-artifact@v3
with:
name: patch_linux_x64_txz
path: ${{ env.patch_linux_x64_txz }}
- uses: actions/upload-artifact@v3
with:
name: patch_linux_arm64_v1
path: ${{ env.patch_linux_arm64_v1 }}
- uses: actions/upload-artifact@v3
with:
name: patch_linux_arm64_v2
path: ${{ env.patch_linux_arm64_v2 }}
- uses: actions/upload-artifact@v3
with:
name: patch_linux_arm64_txz
path: ${{ env.patch_linux_arm64_txz }}
- uses: actions/upload-artifact@v3
with:
name: patch_mac_v1
path: ${{ env.patch_mac_v1 }}
- uses: actions/upload-artifact@v3
with:
name: patch_mac_v2
path: ${{ env.patch_mac_v2 }}
build-win:
runs-on: windows-latest
needs: [check-update, build]
env:
CALIBRE_VERSION: ${{ needs.check-update.outputs.version }}
patch_win_v1: win-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_win_v2: win-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_win_msi: win-patched-${{ needs.check-update.outputs.version }}.msi
if: needs.check-update.outputs.build == '1'
steps:
- uses: actions/checkout@v3
- name: Install Dependencies
run: |
echo "Downloading msi2xml"
curl -L https://sourceforge.net/projects/msi2xml/files/msi2xml/2.2.1/msi2xml-2.2.1.957-bin.zip/download -o msi2xml.zip
Expand-Archive msi2xml.zip -DestinationPath .
- name: Download packages
run: |
echo "Downloading Windows msi v$Env:CALIBRE_VERSION"
curl -L "https://download.calibre-ebook.com/$Env:CALIBRE_VERSION/calibre-64bit-$Env:CALIBRE_VERSION.msi" -o calibre.msi
echo "Download Calibre source"
git clone --depth 1 --branch v$Env:CALIBRE_VERSION https://github.com/kovidgoyal/calibre.git
- uses: actions/setup-python@v4
with:
python-version: ${{ needs.build.outputs.pyver }}
cache: 'pip'
- name: Install Python requirements
run: |
pip install -r requirements.txt
- name: Extract
run: |
.\msi2xml.exe -c calibre-win calibre.msi
- name: Patch py
run: |
echo "[=] Patch backend.py"
python patch_backend.py --os win calibre\src\calibre\db\backend.py backend.py
python compile.py backend.py backend.pyc
echo "[=] Patch update.py"
python patch_update.py calibre\src\calibre\gui2\update.py update.py
python compile.py update.py update.pyc
- name: Patch bypy
run: |
mkdir -p Calibre2\app\bin
echo "[=] Patch bypy"
$launcher=python xmltool.py find calibre.xml calibre-launcher.dll
echo "launcher: $launcher"
$bypy=python xmltool.py find calibre.xml python-lib.bypy.frozen
echo "bypy: $bypy"
echo "[==] Patch bypy:backend.pyc"
python patch_bypy.py `
--os win `
--bypy $bypy `
--launcher $launcher `
--new-pyc-file backend.pyc `
--embed_path "calibre/db/backend.pyc"
cp $bypy Calibre2\app\bin\python-lib.bypy.frozen
Compress-Archive `
-Path .\Calibre2 `
-DestinationPath $Env:patch_win_v1
echo "[==] Patch bypy:update.pyc"
python patch_bypy.py `
--os win `
--bypy $bypy `
--launcher $launcher `
--new-pyc-file update.pyc `
--embed_path "calibre/gui2/update.py"
cp $bypy Calibre2\app\bin\python-lib.bypy.frozen
Compress-Archive `
-Path .\Calibre2 `
-DestinationPath $Env:patch_win_v2
echo "[=] Patch xml"
python xmltool.py patch calibre.xml python-lib.bypy.frozen $bypy
- name: Repack
run: |
.\xml2msi.exe -o $Env:patch_win_msi calibre.xml
- uses: actions/upload-artifact@v3
with:
name: patch_win_v1
path: ${{ env.patch_win_v1 }}
- uses: actions/upload-artifact@v3
with:
name: patch_win_v2
path: ${{ env.patch_win_v2 }}
- uses: actions/upload-artifact@v3
with:
name: patch_win_msi
path: ${{ env.patch_win_msi }}
update-upload:
runs-on: ubuntu-latest
needs: [check-update, build, build-win]
env:
CALIBRE_VERSION: ${{ needs.check-update.outputs.version }}
patch_win_v1: win-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_win_v2: win-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_win_msi: win-patched-${{ needs.check-update.outputs.version }}.msi
patch_linux_x64_v1: linux-x64-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_linux_x64_v2: linux-x64-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_linux_x64_txz: linux-x64-patched-v${{ needs.check-update.outputs.version }}.txz
patch_linux_arm64_v1: linux-arm64-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_linux_arm64_v2: linux-arm64-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
patch_linux_arm64_txz: linux-arm64-patched-v${{ needs.check-update.outputs.version }}.txz
patch_mac_v1: mac-patch-backend-v${{ needs.check-update.outputs.version }}.zip
patch_mac_v2: mac-patch-backend+update-v${{ needs.check-update.outputs.version }}.zip
steps:
- uses: actions/checkout@v3
- name: Update Code
if: needs.check-update.outputs.update == '1'
run: |
echo -n $CALIBRE_VERSION > CALIBRE_VERSION
git config --local user.email [email protected]
git config --local user.name github-actions
git add CALIBRE_VERSION
git commit -m "Action: Update to v$CALIBRE_VERSION"
git push
- uses: actions/download-artifact@v3
- name: Create Release
uses: softprops/[email protected]
with:
body: |
## Calibre v${{ env.CALIBRE_VERSION }}
### 文件说明
- backend.zip:只实现了路径不翻译。
- backend+update.zip:在 backend 的基础上还 patch 了更新检查链接和新版本下载链接。使用这个补丁,Calibre 检查更新时会以本项目的版本为准,下版本下载链接也被替换成了本项目 latest releases 地址。
- .msi/.txz:将 backend+update 补丁重新打包后的完整安装包
### 可能有用的链接们
- 原版下载地址:https://calibre-ebook.com/download
- 原版 Win:https://calibre-ebook.com/dist/win64
- 原版 Linux x64:https://calibre-ebook.com/dist/linux-x86_64
- 原版 Linux arm64:https://calibre-ebook.com/dist/linux-arm64
- 原版 macOS:https://calibre-ebook.com/dist/osx
draft: false
tag_name: v${{ env.CALIBRE_VERSION }}
# 因为 softprops/action-gh-releas 还没加 make_latest 选项,所以先用 prerelease 标记
# 相关 PR:https://github.com/softprops/action-gh-release/pull/304
prerelease: ${{ !needs.check-update.outputs.update }}
files: |
patch_win_v1/${{ env.patch_win_v1 }}
patch_win_v2/${{ env.patch_win_v2 }}
patch_win_msi/${{ env.patch_win_msi }}
patch_linux_x64_v1/${{ env.patch_linux_x64_v1 }}
patch_linux_x64_v2/${{ env.patch_linux_x64_v2 }}
patch_linux_x64_txz/${{ env.patch_linux_x64_txz }}
patch_linux_arm64_v1/${{ env.patch_linux_arm64_v1 }}
patch_linux_arm64_v2/${{ env.patch_linux_arm64_v2 }}
patch_linux_arm64_txz/${{ env.patch_linux_arm64_txz }}
patch_mac_v1/${{ env.patch_mac_v1 }}
patch_mac_v2/${{ env.patch_mac_v2 }}