Skip to content

Commit

Permalink
Actions: 支持在Runner中使用代理,支持远程调试
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuukiy committed Sep 21, 2024
1 parent 66a2914 commit aa6ad8b
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 50 deletions.
106 changes: 76 additions & 30 deletions .github/workflows/pyinstaller.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ on:

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
setup_rdp:
type: boolean
description: 'Connect to runner via remote desktop'
required: false
default: false

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
Expand All @@ -24,47 +30,87 @@ jobs:
# The type of runner that the job will run on
runs-on: windows-latest
env:
PYTHONIOENCODING: "utf-8"
PYTEST_ADDOPTS: "-rA --color=yes --tb=long --showlocals"

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4
- uses: actions/checkout@v4

- name: Fetch tags
run: git fetch --prune --unshallow --tags
- name: Fetch tags
run: git fetch --prune --unshallow --tags

- name: Setup Python 3.8
uses: actions/setup-python@v5
with:
python-version: 3.8
- name: Setup Remote Desktop
env:
RDP_PASSWORD: ${{ secrets.RDP_PASSWORD }}
CF_TUNNEL_TOKEN: ${{ secrets.CF_TUNNEL_TOKEN }}
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.setup_rdp }}
run: |
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "UserAuthentication" -Value 1
Set-LocalUser -Name "runneradmin" -Password (ConvertTo-SecureString -AsPlainText "$env:RDP_PASSWORD" -Force)
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install pyinstaller
choco feature disable -n=showDownloadProgress
choco install cloudflared
Start-Process -FilePath "cloudflared" -ArgumentList "-f tunnel run --token $env:CF_TUNNEL_TOKEN"
echo "Cloudflared tunnel started"
- name: Build with PyInstaller for windows
run: cmd.exe /c 'make.bat'
- name: Setup Python 3.8
uses: actions/setup-python@v5
with:
python-version: 3.8

# - name: Install pytest
# run: |
# python -m pip install pytest
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install pyinstaller
# - name: Switch code page
# run: |
# chcp 65001
- name: Build with PyInstaller for windows
run: cmd.exe /c 'make.bat'

# - name: Test JavSP.exe
# run: pytest unittest/test_exe.py
- name: Install pytest
run: |
python -m pip install pytest
- name: Set VERSION variable for windows
run: |
echo "VERSION=$(python make\gen_ver_hook.py)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Setup clash proxy
env:
CLASH_SUBSCRIPTION_URL: ${{ secrets.CLASH_SUBSCRIPTION_URL }}
run: |
Invoke-WebRequest -Uri "https://github.com/Kuingsmile/clash-core/releases/download/1.18/clash-windows-amd64-v3-v1.18.0.zip" -OutFile "clash.zip"
Expand-Archive -Path "clash.zip"
Invoke-WebRequest -Uri "$env:CLASH_SUBSCRIPTION_URL" -OutFile "clash\clash.yaml"
Start-Process -FilePath "clash\clash-windows-amd64-v3.exe" -ArgumentList "-f clash\clash.yaml"
$iniContent = Get-Content -Path "core\config.ini" -Raw
$iniContent = $iniContent -replace "use_proxy = no", "use_proxy = yes"
$iniContent = $iniContent -replace "auto_update = yes", "auto_update = no"
$iniContent | Set-Content -Path "core\config.ini" -Encoding UTF8
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: JavSP-${{ env.VERSION }}-Windows-amd64
path: dist/JavSP.exe
- name: Test JavSP.exe
run: |
chcp 65001
if (Test-Path "core\config.ini") { Copy-Item "core\config.ini" "dist\config.ini" }
pytest unittest/test_exe.py
- name: Set VERSION variable for windows
if: ${{ !cancelled() }}
run: |
echo "VERSION=$(python make\gen_ver_hook.py)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Upload build artifact
uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: JavSP-${{ env.VERSION }}-Windows-amd64
path: dist/JavSP.exe

- name: Setup VS Code and wait RDP connection
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.setup_rdp }}
run: |
choco install vscode
Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
refreshenv
code --install-extension ms-python.python
code --wait --new-window .
60 changes: 56 additions & 4 deletions .github/workflows/test-web-funcs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@ on:
- cron: '9 9 * * 3,6,0'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
setup_rdp:
type: boolean
description: 'Connect to runner via remote desktop'
required: false
default: false
use_proxy:
type: boolean
description: 'Use clash proxy for specific sites'
required: false
default: false

jobs:
test-web-crawlers:
Expand All @@ -28,24 +39,65 @@ jobs:

steps:
- uses: actions/checkout@v4
- name: Set up Python 3.8

- name: Setup Remote Desktop
env:
RDP_PASSWORD: ${{ secrets.RDP_PASSWORD }}
CF_TUNNEL_TOKEN: ${{ secrets.CF_TUNNEL_TOKEN }}
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.setup_rdp }}
run: |
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "UserAuthentication" -Value 1
Set-LocalUser -Name "runneradmin" -Password (ConvertTo-SecureString -AsPlainText "$env:RDP_PASSWORD" -Force)
choco feature disable -n=showDownloadProgress
choco install cloudflared
Start-Process -FilePath "cloudflared" -ArgumentList "-f tunnel run --token $env:CF_TUNNEL_TOKEN"
echo "Cloudflared tunnel started"
- name: Setup Python 3.8
uses: actions/setup-python@v5
with:
python-version: 3.8

- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install pytest
python -m pip install -r requirements.txt
- name: Switch code page
- name: Setup clash proxy
if: ${{ inputs.use_proxy }}
env:
CLASH_SUBSCRIPTION_URL: ${{ secrets.CLASH_SUBSCRIPTION_URL }}
run: |
chcp 65001
Invoke-WebRequest -Uri "https://github.com/Kuingsmile/clash-core/releases/download/1.18/clash-windows-amd64-v3-v1.18.0.zip" -OutFile "clash.zip"
Expand-Archive -Path "clash.zip"
Invoke-WebRequest -Uri "$env:CLASH_SUBSCRIPTION_URL" -OutFile "clash\clash.yaml"
Start-Process -FilePath "clash\clash-windows-amd64-v3.exe" -ArgumentList "-f clash\clash.yaml"
$iniContent = Get-Content -Path "core\config.ini" -Raw
$iniContent = $iniContent -replace "use_proxy = no", "use_proxy = yes"
$iniContent = $iniContent -replace "auto_update = yes", "auto_update = no"
$iniContent | Set-Content -Path "core\config.ini" -Encoding UTF8
- name: Test web crawlers
run: |
chcp 65001
pytest unittest/test_crawlers.py
- name: Upload log as artifact
uses: actions/upload-artifact@v4
if: ${{ always() }}
if: ${{ !cancelled() }}
with:
name: JavSP-web-funcs.log
path: JavSP.log

- name: Setup VS Code and wait RDP connection
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.setup_rdp }}
run: |
choco install vscode
Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
refreshenv
code --install-extension ms-python.python
code --wait --new-window .
6 changes: 3 additions & 3 deletions core/config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ ignore_javdb_cover = auto
# 各个站点的免代理地址。地址失效时软件会自动尝试获取新地址,你也可以手动设置
[ProxyFree]
avsox = https://avsox.click
javdb = https://javdb365.com
javbus = https://www.busdmm.shop
javlib = https://www.i71t.com
javdb = https://javdb368.com
javbus = https://www.seedmm.help
javlib = https://www.y78k.com

# 配置整理时的命名规则
# save_dir, nfo_title和filename中可以使用变量来引用影片的数据,支持的变量列表见下面的地址:
Expand Down
2 changes: 1 addition & 1 deletion unittest/data/FC2-718323 (fc2).json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"genre_id": null,
"genre_norm": null,
"score": "9.92",
"title": "【個人撮影】破壊力抜群のデカケツ美人妻れいなさんと再戦そして大量中出し【背徳の編】",
"title": "【個人撮影】破壊*抜群のデカケツ美人妻れいなさんと再戦そして大量中出し【背徳の編】",
"ori_title": null,
"magnet": null,
"serial": null,
Expand Down
12 changes: 10 additions & 2 deletions unittest/test_crawlers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import sys
import time
import logging
import requests
from urllib.parse import urlsplit
Expand All @@ -26,7 +27,7 @@ def test_crawler(crawler_params):
except requests.exceptions.ReadTimeout:
logger.warning(f"{site} 连接超时: {params}")
except Exception as e:
if os.getenv('GITHUB_ACTIONS') and (site in ['javdb', 'javlib', 'airav']):
if os.getenv('GITHUB_ACTIONS') and (site in ['javlib', 'airav']):
logger.debug(f'检测到Github actions环境,已忽略测试失败项: {params}', exc_info=True)
else:
raise
Expand All @@ -48,7 +49,14 @@ def compare(avid, scraper, file):
parse_data = getattr(mod, 'parse_data')

try:
parse_data(online)
for _ in range(3):
try:
parse_data(online)
break
except requests.exceptions.SSLError:
time.sleep(2)
except:
raise
except SiteBlocked as e:
logger.warning(e)
return
Expand Down
18 changes: 8 additions & 10 deletions unittest/test_exe.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@
import os
import sys
import random
import string
import shutil
import subprocess
from glob import glob

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from core.config import cfg


def test_javsp_exe():
cwd = os.getcwd()
dist_dir = os.path.normpath(os.path.join(os.path.dirname(__file__) + '/../dist'))
os.chdir(dist_dir)

size = cfg.File.ignore_video_file_less_than
tmp_folder = 'TMP_' + ''.join(random.choices(string.ascii_uppercase, k=6))
size = 300 * 2**20
tmp_folder = '.TMP_' + ''.join(random.choices(string.ascii_uppercase, k=6))
FILE = '300MAAN-642.RIP.f4v'
try:
os.system(f"fsutil file createnew {FILE} {size}")
exit_code = os.system(f"JavSP.exe --auto-exit --input . --output {tmp_folder}")
assert exit_code == 0, f"Non-zero exit code: {exit_code}"
r = subprocess.run(f"JavSP.exe --auto-exit --input . --output {tmp_folder}".split(), capture_output=True, encoding='utf-8')
print(r.stdout, r.stderr.encode().decode("unicode_escape"), sep='\n')
r.check_returncode()
# Check generated files
files = glob(tmp_folder + '/**/*.*', recursive=True)
assert all('横宮七海' in i for i in files), "Actress name not found"
print('\n'.join(files))
# assert all('横宮七海' in i for i in files), "Actress name not found"
assert any(i.endswith('fanart.jpg') for i in files), "fanart not found"
assert any(i.endswith('poster.jpg') for i in files), "poster not found"
assert any(i.endswith('.f4v') for i in files), "video file not found"
Expand All @@ -34,4 +33,3 @@ def test_javsp_exe():
if os.path.exists(tmp_folder):
shutil.rmtree(tmp_folder)
os.chdir(cwd)

0 comments on commit aa6ad8b

Please sign in to comment.