mirror of
https://github.com/MeoProject/lx-music-api-server.git
synced 2025-05-23 19:17:41 +08:00
build: 改进构建逻辑
This commit is contained in:
parent
225753a7a2
commit
c3483d4982
62
.github/workflows/build_beta.yml
vendored
Normal file
62
.github/workflows/build_beta.yml
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# this workflow using github actions to build a binary exe file for windows users
|
||||||
|
|
||||||
|
name: build Windows exe
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup Python 3.11
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install pyinstaller
|
||||||
|
run: python -m pip install pyinstaller
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: python -m pip install -r ./requirements.txt
|
||||||
|
|
||||||
|
- name: Build EXE
|
||||||
|
run: python build.py build test
|
||||||
|
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: lx-music-api-server
|
||||||
|
path: ./dist
|
||||||
|
|
||||||
|
build-linux:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup Python 3.11
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install pyinstaller
|
||||||
|
run: python -m pip install pyinstaller
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: python -m pip install -r ./requirements.txt
|
||||||
|
|
||||||
|
- name: Build Executable
|
||||||
|
run: python build.py build test
|
||||||
|
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: lx-music-api-server
|
||||||
|
path: ./dist
|
170
build.py
Normal file
170
build.py
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_tag():
|
||||||
|
return subprocess.check_output(['git', 'describe', '--abbrev=0', '--tags']).decode('utf-8').strip()
|
||||||
|
|
||||||
|
|
||||||
|
def get_changelog():
|
||||||
|
res = subprocess.check_output(
|
||||||
|
['git', 'log', f'{get_latest_tag()}..HEAD', '--pretty=format:"%h %s"']).decode('utf-8').strip()
|
||||||
|
res = res.split('\n')
|
||||||
|
Nres = ''
|
||||||
|
for msg in res:
|
||||||
|
if (re.match('[a-f0-9]*.(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\:', msg[1:-1])):
|
||||||
|
Nres += msg[1:-1]
|
||||||
|
Nres += '\n'
|
||||||
|
return Nres.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def get_python_path():
|
||||||
|
return sys.executable
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_commit_sha():
|
||||||
|
return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('utf-8').strip()[0:7]
|
||||||
|
|
||||||
|
|
||||||
|
def build_test(fileName):
|
||||||
|
os.environ['build'] = 'T'
|
||||||
|
try:
|
||||||
|
import PyInstaller as UNUSED
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
print('[ERROR]: Please install PyInstaller module first.',
|
||||||
|
'If you have the module installed,',
|
||||||
|
'Please check if you forgetting to activate the virtualenv.', sep='\n')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sha = get_latest_commit_sha()
|
||||||
|
|
||||||
|
popen = subprocess.Popen([get_python_path(),
|
||||||
|
'-m',
|
||||||
|
'PyInstaller',
|
||||||
|
'-F',
|
||||||
|
'--name',
|
||||||
|
fileName if fileName else f'lx-music-api-server_{sha}',
|
||||||
|
'main.py'])
|
||||||
|
|
||||||
|
print('PyInstaller process started, PID: ' + str(popen.pid))
|
||||||
|
print('Please wait for a while...')
|
||||||
|
popen.wait()
|
||||||
|
|
||||||
|
if (popen.returncode != 0):
|
||||||
|
print(f'[ERROR]: PyInstaller build with code {popen.returncode}.',
|
||||||
|
'Please check the output log,',
|
||||||
|
'this may inculde errors or warnings.', sep='\n')
|
||||||
|
sys.exit(popen.returncode)
|
||||||
|
else:
|
||||||
|
print('[SUCCESS]: PyInstaller build success.')
|
||||||
|
print('FilePath: ' + os.getcwd() + os.sep + f'lx-music-api-server_{sha}.exe')
|
||||||
|
|
||||||
|
def build_release(fileName = ''):
|
||||||
|
os.environ['build'] = 'R'
|
||||||
|
try:
|
||||||
|
import PyInstaller as UNUSED
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
print('[ERROR]: Please install PyInstaller module first.',
|
||||||
|
'If you have the module installed,',
|
||||||
|
'Please check if you forgetting to activate the virtualenv.', sep='\n')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
vername = get_latest_tag()
|
||||||
|
|
||||||
|
popen = subprocess.Popen([get_python_path(),
|
||||||
|
'-m',
|
||||||
|
'PyInstaller',
|
||||||
|
'-F',
|
||||||
|
'--name',
|
||||||
|
fileName if fileName else f'lx-music-api-server_{vername}',
|
||||||
|
'main.py'])
|
||||||
|
|
||||||
|
print('PyInstaller process started, PID: ' + str(popen.pid))
|
||||||
|
print('Please wait for a while...')
|
||||||
|
popen.wait()
|
||||||
|
|
||||||
|
if (popen.returncode != 0):
|
||||||
|
print(f'[ERROR]: PyInstaller build with code {popen.returncode}.',
|
||||||
|
'Please check the output log,',
|
||||||
|
'this may inculde errors or warnings.', sep='\n')
|
||||||
|
sys.exit(popen.returncode)
|
||||||
|
else:
|
||||||
|
print('[SUCCESS]: PyInstaller build success.')
|
||||||
|
print('FilePath: ' + os.getcwd() + os.sep + f'lx-music-api-server_{vername}.exe')
|
||||||
|
|
||||||
|
argv = sys.argv
|
||||||
|
|
||||||
|
argv.pop(0)
|
||||||
|
|
||||||
|
commands = []
|
||||||
|
options = []
|
||||||
|
|
||||||
|
further_info_required_options = ['-f', '--fileName']
|
||||||
|
|
||||||
|
for arg in argv:
|
||||||
|
if (arg.startswith('-')):
|
||||||
|
options.append(arg)
|
||||||
|
if (arg in further_info_required_options):
|
||||||
|
options.append(argv[argv.index(arg) + 1])
|
||||||
|
else:
|
||||||
|
if (arg not in options):
|
||||||
|
commands.append(arg)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
fileName = ''
|
||||||
|
for o in options:
|
||||||
|
if (o == '-f' or o == '--fileName'):
|
||||||
|
try:
|
||||||
|
fileName = options[options.index(o) + 1]
|
||||||
|
except:
|
||||||
|
print('[ERROR] No fileName specified')
|
||||||
|
sys.exit(1)
|
||||||
|
elif (o == '-h' or o == '--help'):
|
||||||
|
print('Usage: build.py [options] <command>')
|
||||||
|
print('Options:')
|
||||||
|
print(' -f, --filename <fileName> Specify the fileName of the executable.')
|
||||||
|
print(' -h, --help Show this help message and exit.')
|
||||||
|
print('Commands:')
|
||||||
|
print(' build test Build test executable.')
|
||||||
|
print(' build release Build release executable.')
|
||||||
|
print(' changelog Show changelog.')
|
||||||
|
sys.exit(0)
|
||||||
|
elif (o.startswith('-')):
|
||||||
|
print(f'[ERROR] Invalid option "{o}" specified.')
|
||||||
|
sys.exit(1)
|
||||||
|
if (len(commands) == 0):
|
||||||
|
print('[ERROR] No command specified')
|
||||||
|
sys.exit(0)
|
||||||
|
try:
|
||||||
|
if (commands[0] == 'build'):
|
||||||
|
if (len(commands) == 1):
|
||||||
|
print('[WARNING] No build command specified, defaulting to build test.')
|
||||||
|
build_test(fileName)
|
||||||
|
sys.exit(0)
|
||||||
|
elif (commands[1] == 'test'):
|
||||||
|
build_test(fileName)
|
||||||
|
sys.exit(0)
|
||||||
|
elif (commands[1] == 'release'):
|
||||||
|
build_release(fileName)
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
print('[ERROR] Invalid build command specified.')
|
||||||
|
sys.exit(1)
|
||||||
|
elif (commands[0] == 'changelog'):
|
||||||
|
print(get_changelog())
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
print('[ERROR] Invalid command specified.')
|
||||||
|
sys.exit(1)
|
||||||
|
except IndexError:
|
||||||
|
print('[ERROR] Invalid command specified.')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print('[INFO] Aborting...')
|
||||||
|
sys.exit(0)
|
Loading…
x
Reference in New Issue
Block a user