Skip to content

0.4.1

0.4.1 #409

Workflow file for this run

# .github/workflows/conda-build-publish.yml
name: Conda-Build, Test, and Publish Package
on:
workflow_dispatch:
inputs:
version:
description: 'Package version (leave empty for latest from PyPI)'
required: false
type: string
release:
types: [published]
jobs:
build-publish:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.14"]
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
# ================================================================
# ADIM 1: PyPI'den Son Sürüm Bilgilerini Çek
# ================================================================
- name: Fetch latest version info from PyPI
id: pypi_info
run: |
if [ -n "${{ inputs.version }}" ]; then
PKG_VERSION="${{ inputs.version }}"
echo "📌 Manuel sürüm kullanılıyor: $PKG_VERSION"
else
echo "🔍 PyPI'den son sürüm bilgisi çekiliyor..."
PYPI_JSON=$(curl -s https://pypi.org/pypi/kha256/json)
PKG_VERSION=$(echo "$PYPI_JSON" | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(data['info']['version'])
")
echo "✅ PyPI'den çekilen sürüm: $PKG_VERSION"
fi
echo "PKG_VERSION=$PKG_VERSION" >> $GITHUB_ENV
echo "version=$PKG_VERSION" >> $GITHUB_OUTPUT
# ================================================================
# ADIM 2: PyPI'den Source URL ve BLAKE2b-256 Hash Çek
# ================================================================
- name: Fetch PyPI source URL and BLAKE2b-256 hash
id: pypi_source
run: |
echo "📦 PyPI source bilgileri çekiliyor (sürüm: $PKG_VERSION)..."
PYPI_JSON=$(curl -s "https://pypi.org/pypi/kha256/$PKG_VERSION/json")
SOURCE_INFO=$(echo "$PYPI_JSON" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for url_info in data['urls']:
if url_info['packagetype'] == 'sdist':
print(f\"URL={url_info['url']}\")
print(f\"HASH={url_info['digests']['blake2b_256']}\")
break
else:
for url_info in data['urls']:
if url_info['packagetype'] == 'bdist_wheel':
print(f\"URL={url_info['url']}\")
print(f\"HASH={url_info['digests']['blake2b_256']}\")
break
")
PYPI_URL=$(echo "$SOURCE_INFO" | grep "^URL=" | cut -d'=' -f2-)
PYPI_HASH=$(echo "$SOURCE_INFO" | grep "^HASH=" | cut -d'=' -f2-)
if [ -z "$PYPI_URL" ] || [ -z "$PYPI_HASH" ]; then
echo "❌ HATA: PyPI'den source bilgileri çekilemedi!"
exit 1
fi
echo "✅ Source URL: $PYPI_URL"
echo "✅ BLAKE2b-256: $PYPI_HASH"
echo "PYPI_URL=$PYPI_URL" >> $GITHUB_ENV
echo "PYPI_HASH=$PYPI_HASH" >> $GITHUB_ENV
# ================================================================
# ADIM 3: meta.yaml Dosyasını Dinamik Olarak Güncelle
# ================================================================
- name: Update meta.yaml with PyPI source info
run: |
echo "📝 meta.yaml dosyası güncelleniyor..."
python3 << 'EOF'
import os
import re
pypi_url = os.environ['PYPI_URL']
pypi_hash = os.environ['PYPI_HASH']
pkg_version = os.environ['PKG_VERSION']
meta_file = 'meta.yaml'
with open(meta_file, 'r', encoding='utf-8') as f:
content = f.read()
content = re.sub(
r'(url:\s*)(["\']?)(.*?)\2',
f'url: "{pypi_url}"',
content,
count=1
)
content = re.sub(
r'(blake2b-256:\s*)(["\']?)(.*?)\2',
f'blake2b-256: "{pypi_hash}"',
content,
count=1
)
content = re.sub(
r'(version:\s*)(["\']?)(.*?)\2',
f'version: "{pkg_version}"',
content,
count=1
)
with open(meta_file, 'w', encoding='utf-8') as f:
f.write(content)
print(f"✅ meta.yaml güncellendi:")
print(f" version: {pkg_version}")
print(f" url: {pypi_url}")
print(f" blake2b-256: {pypi_hash}")
EOF
echo ""
echo "📄 Güncellenmiş meta.yaml (source bölümü):"
grep -A 3 "^source:" meta.yaml
# ================================================================
# ADIM 4: Miniconda Kurulumu
# ================================================================
- name: Setup Miniconda for Python ${{ matrix.python-version }}
uses: conda-incubator/setup-miniconda@v3
with:
auto-activate-base: true
python-version: "${{ matrix.python-version }}"
channels: conda-forge,bilgi,defaults
channel-priority: strict
miniforge-version: latest
- name: Install Conda-Build
run: |
echo "📦 Conda-build kuruluyor..."
conda config --add channels bilgi
conda config --set channel_priority strict
conda install -n base -y \
conda-build \
anaconda-client
conda info
# ================================================================
# ADIM 5: Conda Paketi Oluştur (TEMİZLİK DAHİL)
# ================================================================
- name: Clean environment before build
run: |
echo "🧹 Derleme öncesi temizlik yapılıyor..."
rm -rf build/ dist/ *.egg-info kha256.egg-info
find . -type d -name "__pycache__" -exec rm -rf {} + || true
find . -name "*.pyc" -delete || true
conda clean --all --yes
- name: Build the package (skip tests)
run: |
echo "=========================================="
echo "🔨 Conda Paketi Oluşturuluyor"
echo "=========================================="
echo "Sürüm: $PKG_VERSION"
echo "Python: ${{ matrix.python-version }}"
echo "Source URL: $PYPI_URL"
echo "BLAKE2b-256: $PYPI_HASH"
echo "=========================================="
conda build . \
--python ${{ matrix.python-version }} \
--no-test \
--output-folder ./dist
if [ -z "$(ls -A dist 2>/dev/null)" ]; then
echo "❌ HATA: Hiçbir conda paketi oluşturulamadı!"
exit 1
fi
echo ""
echo "✅ Oluşturulan paketler ve boyutları:"
ls -lh dist/noarch/
# ================================================================
# ADIM 6: Test Ortamı Oluştur (Temel Paketler)
# ================================================================
- name: Create test environment
run: |
echo "🧪 Test ortamı oluşturuluyor (temel paketler)..."
# Sadece temel bilimsel paketleri kur
conda create -n test-env -y \
python=${{ matrix.python-version }} \
numpy \
pandas \
scipy \
ipython \
ipywidgets \
pytest \
pytest-cov \
-c conda-forge -c bilgi
# kececinumbers ekle
conda install -n test-env -y kececinumbers -c bilgi
echo ""
echo "✅ Temel paketler kuruldu"
# ================================================================
# ADIM 7: Kriptografik Paketleri Conda ile Kur
# ================================================================
- name: Install cryptographic packages with conda
run: |
echo "🔐 Kriptografik paketler conda ile kuruluyor..."
# Her paketi ayrı ayrı kur (solver hatası önlemek için)
echo "📦 cryptography kuruluyor..."
conda install -n test-env -y cryptography -c conda-forge
echo "📦 pycryptodome kuruluyor..."
conda install -n test-env -y pycryptodome -c conda-forge
echo "📦 bcrypt kuruluyor..."
conda install -n test-env -y bcrypt -c conda-forge
echo "📦 argon2-cffi kuruluyor..."
conda install -n test-env -y argon2-cffi -c conda-forge
echo "📦 blake3 kuruluyor..."
conda install -n test-env -y blake3 -c conda-forge
echo "📦 python-xxhash kuruluyor..."
conda install -n test-env -y python-xxhash -c conda-forge
echo "📦 aiohttp kuruluyor..."
conda install -n test-env -y aiohttp -c conda-forge
echo "📦 python-dotenv kuruluyor..."
conda install -n test-env -y python-dotenv -c conda-forge
echo "📦 nest-asyncio2 kuruluyor..."
conda install -n test-env -y nest-asyncio2 -c conda-forge
echo ""
echo "✅ Kriptografik paketler kuruldu:"
conda list -n test-env | grep -E "(aiohttp|dotenv|nest-asyncio2|cryptography|pycryptodome|bcrypt|argon2|blake3|python-xxhash)" || true
# ================================================================
# ADIM 8: Oluşturulan Paketi Kur
# ================================================================
- name: Install the built package
run: |
echo "📦 Oluşturulan paket kuruluyor..."
PACKAGE_FILE=$(find dist -name "*.conda" -o -name "*.tar.bz2" | head -n 1)
if [ -z "$PACKAGE_FILE" ]; then
echo "❌ HATA: Kurulacak paket dosyası bulunamadı!"
exit 1
fi
echo "✅ Kurulan paket: $PACKAGE_FILE"
# Paketi kur (--no-deps: bağımlılıkları tekrar kurma, zaten kurulu)
conda install -n test-env -y --no-deps "$PACKAGE_FILE"
echo ""
echo "✅ Tüm paketler:"
conda list -n test-env | grep -E "(kha256|aiohttp|dotenv|nest-asyncio2|cryptography|pycryptodome|bcrypt|argon2|blake3|python-xxhash)" || true
# ================================================================
# ADIM 9: Paket Import Testi
# ================================================================
- name: Verify package import
run: |
echo "🔍 Paket import testi yapılıyor..."
conda run -n test-env python -c "
import kha256
import kececinumbers
import bcrypt
import argon2
import blake3
import xxhash
import aiohttp
import dotenv
import nest_asyncio2
from Crypto.Cipher import ChaCha20
print('✅ Tüm bağımlılıklar başarıyla yüklendi!')
print(f'📦 KHA-256 version: {kha256.__version__}')
print(f'📦 bcrypt version: {bcrypt.__version__}')
print(f'📦 argon2 version: {argon2.__version__}')
print(f'📦 blake3 version: {blake3.__version__}')
print(f'📦 xxhash version: {xxhash.VERSION}')
print(f'📦 aiohttp version: {aiohttp.__version__}')
print(f'📦 PyCryptodome: Crypto modülü çalışıyor')
try:
result = kha256.quick_hash('test')
print(f'✅ quick_hash testi başarılı: {result[:16]}...')
except Exception as e:
print(f'⚠️ quick_hash testi başarısız: {e}')
"
# ================================================================
# ADIM 10: Debug (Başarısızlık Durumu)
# ================================================================
- name: Debug - Environment info
if: failure()
run: |
echo "=========================================="
echo "🔍 Hata Ayıklama Bilgileri"
echo "=========================================="
conda info
echo ""
echo "Test ortamı paketleri:"
conda list -n test-env || echo "test-env yok"
echo ""
echo "Ortam detayları:"
conda env export -n test-env || echo "test-env export başarısız"
# ================================================================
# ADIM 11: Anaconda Cloud'a Yükle (DÜZELTİLDİ)
# ================================================================
- name: Upload to Anaconda Cloud
if: success()
env:
ANACONDA_TOKEN: ${{ secrets.ANACONDA_TOKEN }}
run: |
echo "📤 Anaconda Cloud'a yükleniyor..."
# 1. Token kontrolü
if [ -z "$ANACONDA_TOKEN" ]; then
echo "❌ HATA: ANACONDA_TOKEN GitHub Secrets'ta tanımlı değil!"
exit 1
fi
echo "✅ Token bulundu."
# 2. Conda bin yolunu tanımla
CONDA_BIN="$CONDA/bin"
echo "🔧 Conda executable yolu: $CONDA_BIN"
# anaconda-client yüklü mü kontrol et
if ! command -v $CONDA_BIN/anaconda &> /dev/null; then
echo "⚠️ anaconda-client bulunamadı, kuruluyor..."
conda install -n base -y anaconda-client
else
echo "✅ anaconda-client zaten kurulu."
fi
# 3. Token doğrulama
echo "🔍 Token doğrulanıyor..."
$CONDA_BIN/anaconda -t $ANACONDA_TOKEN whoami
if [ $? -ne 0 ]; then
echo "❌ HATA: Token geçersiz veya Anaconda'ya bağlanılamadı!"
exit 1
fi
echo "✅ Token geçerli!"
# 4. Paket dosyalarını bul
PACKAGE_FILES=$(find dist -name "*.conda" -o -name "*.tar.bz2")
if [ -z "$PACKAGE_FILES" ]; then
echo "❌ HATA: Yüklenecek paket dosyası bulunamadı!"
exit 1
fi
echo "✅ Yüklenecek paketler:"
echo "$PACKAGE_FILES"
# 5. Yükleme işlemini yap (DÜZELTİLDİ: --verbose kaldırıldı)
UPLOAD_SUCCESS=false
for pkg in $PACKAGE_FILES; do
echo ""
echo "📦 Yükleniyor: $pkg"
# --verbose KALDIRILDI, sadece --force kullanılıyor
$CONDA_BIN/anaconda -t $ANACONDA_TOKEN upload \
"$pkg" \
--user bilgi \
--label main \
--force
if [ $? -eq 0 ]; then
echo "✅ Başarıyla yüklendi: $pkg"
UPLOAD_SUCCESS=true
else
echo "❌ Yükleme başarısız: $pkg"
exit 1 # Hata durumunda workflow'u durdur
fi
done
# 6. Gerçek başarı kontrolü
if [ "$UPLOAD_SUCCESS" = true ]; then
echo ""
echo "=========================================="
echo "🎉 TÜM PAKETLER ANACONDA CLOUD'A YÜKLENDİ"
echo "🔗 Kontrol: https://anaconda.org/bilgi/kha256"
echo "=========================================="
else
echo ""
echo "❌ HATA: Hiçbir paket yüklenemedi!"
exit 1
fi
# ================================================================
# ADIM 12: Temizlik
# ================================================================
- name: Cleanup
if: always()
run: |
echo "🧹 Temizlik yapılıyor..."
conda env remove -n test-env || true
rm -rf dist/ build/ || true
echo "✅ Temizlik tamamlandı"
# ================================================================
# ADIM 13: Özet
# ================================================================
- name: Summary
if: success()
run: |
echo "=========================================="
echo "✅ CONDA BUILD VE YAYINLAMA BAŞARILI"
echo "=========================================="
echo "📦 Paket: kha256"
echo "🏷️ Sürüm: $PKG_VERSION"
echo "🐍 Python: ${{ matrix.python-version }}"
echo "🔗 PyPI URL: $PYPI_URL"
echo "🔒 BLAKE2b-256: $PYPI_HASH"
echo "📤 Anaconda: https://anaconda.org/bilgi/kha256"
echo "=========================================="