Skip to content

Commit

Permalink
Updated Pipeline To Support Multi-OS & Added Support for PyPI Release (
Browse files Browse the repository at this point in the history
  • Loading branch information
coldsofttech authored Apr 13, 2024
1 parent 62e856f commit 07c28bd
Show file tree
Hide file tree
Showing 13 changed files with 300 additions and 185 deletions.
157 changes: 133 additions & 24 deletions .github/workflows/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,71 +7,180 @@ on:

jobs:
lint:
name: Python Linux (flake8)
runs-on: ubuntu-latest

name: Lint
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
python-version: [ '3.10' ]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Setup Python
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
python-version: ${{ matrix.python-version }}

- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install flake8
- name: Run Lint
run: flake8 --verbose --color auto --count --statistics --format=json --output-file=flake8-report.json || echo "::set-output name=flake8_failed::true"
continue-on-error: true
run: |
flake8 --verbose --color auto --count --statistics --format=default --output-file=flake8-report
- name: Upload Report
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: flake8-report
path: flake8-report.json

build_and_test:
name: Build and Test
runs-on: windows-latest
name: lint-report-${{ matrix.python-version }}-${{ matrix.os }}
path: flake8-report

test:
name: Test
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
python-version: [ '3.10', '3.11', '3.12' ]
runs-on: ${{ matrix.os }}
needs: lint

steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Setup Python
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
python-version: ${{ matrix.python-version }}

- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel
pip install pytest
pip install -r requirements.txt
- name: Install Pytest
- name: Run Tests (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
pip install pytest
sudo apt-get install -y python3-tk
sudo apt-get install -y xvfb
ps aux | grep xvfb
xvfb-run --auto-servernum --server-args='-screen 0 1024x768x24' \
pytest tests -vv -rEPW -o pytest_collection_order=alphabetical --cache-clear --color=yes
- name: Run Tests (MacOS)
if: matrix.os == 'macos-latest'
run: |
if [[ "${{ matrix.python-version }}" != '3.10' ]]; then
brew install tcl-tk
pytest tests -vv -rEPW -o pytest_collection_order=alphabetical --cache-clear --color=yes
else
printf "\e[33mWARNING: Known issue with MacOS and Python 3.10, tkinter incompatibility. Skipping tests.\e[0m\n"
fi
- name: Run Tests (Windows)
if: matrix.os == 'windows-latest'
run: |
pytest tests -vv -rEPW -o pytest_collection_order=alphabetical --cache-clear --color=yes
build:
name: Build
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
python-version: [ '3.10' ]
runs-on: ${{ matrix.os }}
needs: test
steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel
- name: Build Package
run: |
python setup.py sdist
- name: Get Package File Name
- name: Get Package Name (Windows)
if: matrix.os == 'windows-latest'
run: |
$latestFile = Get-ChildItem -Path 'dist\' | Sort-Object LastWriteTime -Descending | Select-Object -First 1
$path_separator = "\\"
$latestFile = Get-ChildItem -Path "dist\\" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Write-Host "Latest file: $latestFile"
Write-Output "PACKAGE_NAME=dist$path_separator$($latestFile.Name)" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Get Package Name (Ubuntu and macOS)
if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest'
run: |
path_separator="/"
latestFile=$(ls -t dist/ | head -n 1)
echo "Latest file: $latestFile"
echo "PACKAGE_NAME=$latestFile" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "PACKAGE_NAME=dist$path_separator$latestFile" >> $GITHUB_ENV
- name: Install Package
run: |
pip install ${{ env.PACKAGE_NAME }}
- name: Run Tests
release_check:
name: Release Check
timeout-minutes: 20
strategy:
fail-fast: true
matrix:
os: [ ubuntu-latest ]
python-version: [ '3.10' ]
runs-on: ${{ matrix.os }}
needs: build
steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install Dependencies
run: |
pytest tests -vv -rEPW -o pytest_collection_order=alphabetical --cache-clear --color=yes
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build Package
run: |
python setup.py sdist bdist_wheel
- name: Get Package Name (Windows)
if: matrix.os == 'windows-latest'
run: |
$path_separator = "\\"
$latestFile = Get-ChildItem -Path "dist\\" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Write-Host "Latest file: $latestFile"
Write-Output "PACKAGE_NAME=dist$path_separator$($latestFile.Name)" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Get Package Name (Ubuntu and macOS)
if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest'
run: |
path_separator="/"
latestFile=$(ls -t dist/ | head -n 1)
echo "Latest file: $latestFile"
echo "PACKAGE_NAME=dist$path_separator$latestFile" >> $GITHUB_ENV
- name: Release Check
run: |
twine check ${{ env.PACKAGE_NAME }}
156 changes: 51 additions & 105 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,137 +4,83 @@ on:
release:
types: [ published ]
branches:
- '*'
- 'main'

env:
UPLOAD_URL: ${{ github.event.release.upload_url }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
release_windows:
name: Release for Windows
release:
name: Release
timeout-minutes: 20
strategy:
fail-fast: true
matrix:
os: [ windows-latest, ubuntu-latest, macos-latest ]
python-version: [ '3.10' ]
runs-on: ${{ matrix.os }}
permissions: write-all
runs-on: windows-latest

steps:
- name: Checkout code
- name: Checkout Repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
python-version: ${{ matrix.python-version }}

- name: Install dependencies
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install pyinstaller
pip install setuptools wheel
- name: Build Installer
- name: Build Package
run: |
pyinstaller --onefile --windowed --name M3U8Downloader-${{ github.event.release.tag_name }}-Windows.exe ./src/__init__.py
- name: Upload Installer
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./dist/M3U8Downloader-${{ github.event.release.tag_name }}-Windows.exe
asset_name: M3U8Downloader-${{ github.event.release.tag_name }}-Windows.exe
asset_content_type: application/octet-stream

- name: Publish Release
if: ${{ steps.upload-release-asset.outcome == 'success' }}
run: |
$json = @{
draft = $false
} | ConvertTo-Json
$header = @{
Authorization = "Bearer ${{ secrets.GITHUB_TOKEN }}"
Accept = "application/vnd.github.v3+json"
}
Invoke-RestMethod -Uri "https://api.github.com/repos/${{ github.repository }}/releases/${{ github.event.release.id }}" -Method Patch -ContentType "application/json" -Headers $header -Body $json
release_ubuntu:
name: Release for Ubuntu
permissions: write-all
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4
python setup.py bdist
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Install dependencies
- name: Get Package Name (Windows)
if: matrix.os == 'windows-latest'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
- name: Build Installer
$path_separator = "\\"
$latestFile = Get-ChildItem -Path "dist\\" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Write-Host "Latest file: $latestFile"
Write-Output "PACKAGE_PATH=dist$path_separator$($latestFile.Name)" | Out-File -FilePath $env:GITHUB_ENV -Append
Write-Output "PACKAGE_NAME=$($latestFile.Name)" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Get Package Name (Ubuntu and macOS)
if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest'
run: |
pyinstaller --onefile --windowed --name M3U8Downloader-${{ github.event.release.tag_name }}-debian.deb ./src/__init__.py
path_separator="/"
latestFile=$(ls -t dist/ | head -n 1)
echo "Latest file: $latestFile"
echo "PACKAGE_PATH=dist$path_separator$latestFile" >> $GITHUB_ENV
echo "PACKAGE_NAME=$latestFile" >> $GITHUB_ENV
- name: Upload Installer
id: upload-release-asset
- name: Upload Artifact
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./dist/M3U8Downloader-${{ github.event.release.tag_name }}-debian.deb
asset_name: M3U8Downloader-${{ github.event.release.tag_name }}-debian.deb
upload_url: ${{ env.UPLOAD_URL }}
asset_path: ${{ env.PACKAGE_PATH }}
asset_name: ${{ env.PACKAGE_NAME }}
asset_content_type: application/octet-stream

- name: Publish Release
if: ${{ steps.upload-release-asset.outcome == 'success' }}
run: |
curl -X PATCH \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
-d '{"draft": false}' \
"https://api.github.com/repos/${{ github.repository }}/releases/${{ github.event.release.id }}"
release_rhel:
name: Release for Linux
publish:
name: Publish
timeout-minutes: 20
strategy:
fail-fast: true
matrix:
os: [ ubuntu-latest ]
python-version: [ '3.10' ]
runs-on: ${{ matrix.os }}
permissions: write-all
runs-on: ubuntu-latest

needs: [ release ]
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pyinstaller
- name: Build Installer
run: |
pyinstaller --onefile --windowed --name M3U8Downloader-${{ github.event.release.tag_name }}-linux.rpm ./src/__init__.py
- name: Upload Installer
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./dist/M3U8Downloader-${{ github.event.release.tag_name }}-linux.rpm
asset_name: M3U8Downloader-${{ github.event.release.tag_name }}-linux.rpm
asset_content_type: application/octet-stream

- name: Publish Release
if: ${{ steps.upload-release-asset.outcome == 'success' }}
run: |
curl -X PATCH \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Authorization: Bearer ${{ env.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
-d '{"draft": false}' \
"https://api.github.com/repos/${{ github.repository }}/releases/${{ github.event.release.id }}"
"https://api.github.com/repos/${{ github.repository }}/releases/${{ github.event.release.id }}"
Loading

0 comments on commit 07c28bd

Please sign in to comment.