/
mcniki
/
CodeContext
Обзор
Документация
Войти
/
mcniki
/
CodeContext
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
.github/workflows/build.yml
214 строк
7 KB
Gorobets Nikita
ci: publish release publicly on push to main (non-draft)
12 июн 2026, 01:12
12 июн 2026, 01:12
4605d78
Код
Авторство
О чём код?
name: Build and Release Multi-OS on: push: branches: - main - dev tags: - 'v*' workflow_dispatch: permissions: contents: write jobs: # 1. Читаем версию и формируем правильные названия (SemVer) prepare: runs-on: ubuntu-latest outputs: version: ${{ steps.set_ver.outputs.version }} is_prerelease: ${{ steps.set_rel.outputs.is_prerelease }} tag_name: ${{ steps.set_rel.outputs.tag_name }} steps: - uses: actions/checkout@v4 - name: Read Version (clean BOM) id: set_ver shell: bash run: | if [ -f "VERSION.txt" ]; then VER="v$(cat VERSION.txt | tr -d '\357\273\277[:space:]')" else VER="v1.0.0" fi echo "version=$VER" >> $GITHUB_OUTPUT - name: Set Release Info based on Branch or Tag id: set_rel shell: bash run: | VER="${{ steps.set_ver.outputs.version }}" # Если запуск по тегу — используем имя тега if [[ "${{ github.ref }}" == refs/tags/* ]]; then TAG="${GITHUB_REF_NAME}" echo "tag_name=$TAG" >> $GITHUB_OUTPUT # pre-release если тег содержит pre, alpha, beta, rc if echo "$TAG" | grep -qiE '\-(pre|alpha|beta|rc)'; then echo "is_prerelease=true" >> $GITHUB_OUTPUT else echo "is_prerelease=false" >> $GITHUB_OUTPUT fi elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then echo "is_prerelease=false" >> $GITHUB_OUTPUT echo "tag_name=${VER}+build.${{ github.run_number }}" >> $GITHUB_OUTPUT else echo "is_prerelease=true" >> $GITHUB_OUTPUT echo "tag_name=${VER}-pre.${{ github.run_number }}" >> $GITHUB_OUTPUT fi # 2. Сборка для дистрибутивов Linux build-linux: needs: prepare runs-on: ubuntu-latest container: ${{ matrix.container }} strategy: fail-fast: false matrix: include: - distro: ubuntu container: ubuntu:22.04 - distro: debian container: debian:latest - distro: arch container: archlinux:latest - distro: kali container: kalilinux/kali-rolling:latest - distro: manjaro container: manjarolinux/base:latest steps: - uses: actions/checkout@v4 - name: Install System Dependencies & Python shell: bash run: | if command -v apt-get >/dev/null 2>&1; then export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y python3 python3-pip python3-venv build-essential git elif command -v pacman >/dev/null 2>&1; then pacman -Syu --noconfirm python python-pip base-devel git else echo "Package manager not found!" exit 1 fi - name: Build with PyInstaller shell: bash run: | if command -v python3 >/dev/null 2>&1; then PYTHON_CMD=python3 else PYTHON_CMD=python fi $PYTHON_CMD -m venv venv source venv/bin/activate pip install --upgrade pip pip install pyinstaller PySide6 tiktoken pathspec pyperclip fpdf2 jinja2 BIN_NAME="CodeContext-${{ needs.prepare.outputs.version }}-${{ matrix.distro }}" pyinstaller --noconfirm --onefile --windowed --icon="assets/images/logo.png" --name "$BIN_NAME" --add-data "themes:themes" --add-data "assets:assets" --add-data "user_settings.json:." --add-data "VERSION.txt:." main.py mkdir -p build_output cp dist/$BIN_NAME build_output/ - name: Upload Linux Artifact uses: actions/upload-artifact@v4 with: name: bin-linux-${{ matrix.distro }} path: build_output/* # 3. Сборка для Windows build-windows: needs: prepare runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install Dependencies shell: bash run: | python -m pip install --upgrade pip pip install pyinstaller PySide6 tiktoken pathspec pyperclip fpdf2 jinja2 Pillow - name: Build with PyInstaller shell: bash run: | BIN_NAME="CodeContext-${{ needs.prepare.outputs.version }}-windows.exe" pyinstaller --noconfirm --onefile --windowed --icon="assets/images/logo.png" --name "$BIN_NAME" --add-data "themes;themes" --add-data "assets;assets" --add-data "user_settings.json;." --add-data "VERSION.txt;." main.py mkdir -p build_output cp dist/$BIN_NAME build_output/ - name: Upload Windows Artifact uses: actions/upload-artifact@v4 with: name: bin-windows path: build_output/* # 4. Сборка для macOS (Apple Silicon / arm64) build-macos: needs: prepare runs-on: macos-14 steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install Dependencies shell: bash run: | python -m pip install --upgrade pip pip install pyinstaller PySide6 tiktoken pathspec pyperclip fpdf2 jinja2 Pillow - name: Build with PyInstaller shell: bash run: | BIN_NAME="CodeContext-${{ needs.prepare.outputs.version }}-macos-arm64" pyinstaller --noconfirm --onefile --windowed --icon="assets/images/logo.png" --name "$BIN_NAME" --add-data "themes:themes" --add-data "assets:assets" --add-data "user_settings.json:." --add-data "VERSION.txt:." main.py mkdir -p build_output cd dist zip -r "../build_output/${BIN_NAME}.zip" "${BIN_NAME}.app" - name: Upload macOS Artifact uses: actions/upload-artifact@v4 with: name: bin-macos-arm64 path: build_output/* # 5. Публикация релиза (тег v* — полноценный, main — черновик) release: if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' needs: [prepare, build-linux, build-windows, build-macos] runs-on: ubuntu-latest steps: - name: Download all artifacts uses: actions/download-artifact@v4 with: path: ./release-assets/ merge-multiple: true - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ needs.prepare.outputs.tag_name }} name: "CodeContext ${{ needs.prepare.outputs.tag_name }}" prerelease: ${{ needs.prepare.outputs.is_prerelease == 'true' }} generate_release_notes: true files: ./release-assets/* fail_on_unmatched_files: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}