diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml new file mode 100644 index 0000000..5b9e661 --- /dev/null +++ b/.github/workflows/build-package.yml @@ -0,0 +1,111 @@ +name: Build And Package + +on: + push: + tags: + - "v*" + +jobs: + build-package: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] + + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install system build tools + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y build-essential + + - name: Install compile dependencies + run: | + python -m pip install --upgrade pip + pip install cython setuptools wheel + + - name: Run Cython compile + run: | + python scripts/compile.py + + - name: Prepare package and archive + run: | + python - <<'PY' + import os + import shutil + import tarfile + import zipfile + from pathlib import Path + + root = Path.cwd() + package_dir = root / "package" + dist_dir = root / "dist" + + for d in [package_dir, dist_dir]: + if d.exists(): + shutil.rmtree(d) + d.mkdir(parents=True, exist_ok=True) + + ignore_names = { + ".git", + ".github", + "__pycache__", + ".pytest_cache", + ".mypy_cache", + ".venv", + "venv", + "temp", + "tests", + "package", + "dist", + } + + def ignore_func(directory, names): + ignored = [] + for name in names: + if name in ignore_names or name.endswith(".pyc"): + ignored.append(name) + return ignored + + for item in root.iterdir(): + if item.name in ignore_names: + continue + target = package_dir / item.name + if item.is_dir(): + shutil.copytree(item, target, ignore=ignore_func) + else: + shutil.copy2(item, target) + + sha = os.environ["GITHUB_SHA"] + run_os = os.environ["RUNNER_OS"].lower() + + if run_os == "windows": + archive_path = dist_dir / f"tjwater-server-{run_os}-{sha}.zip" + with zipfile.ZipFile(archive_path, "w", compression=zipfile.ZIP_DEFLATED) as zf: + for f in package_dir.rglob("*"): + if f.is_file(): + zf.write(f, f.relative_to(package_dir)) + else: + archive_path = dist_dir / f"tjwater-server-{run_os}-{sha}.tar.gz" + with tarfile.open(archive_path, "w:gz") as tf: + tf.add(package_dir, arcname=".") + + print(f"Archive created: {archive_path}") + PY + shell: bash + + - name: Upload package artifact + uses: actions/upload-artifact@v4 + with: + name: tjwater-server-package-${{ runner.os }} + path: dist/* + retention-days: 14