name: CI/CD Pipeline - Aethero FastAPI on: push: branches: [ main, develop ] pull_request: branches: [ main ] env: REGISTRY: ghcr.io IMAGE_NAME: aethero-fastapi jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: [3.10] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Cache pip dependencies uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r Aethero_App/requirements.txt - name: Lint with flake8 run: | pip install flake8 # Stop the build if there are Python syntax errors or undefined names flake8 Aethero_App --count --select=E9,F63,F7,F82 --show-source --statistics # Exit-zero treats all errors as warnings flake8 Aethero_App --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | cd Aethero_App export PYTHONPATH=$PWD python -m pytest test_api.py -v --cov=. --cov-report=xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./Aethero_App/coverage.xml build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ github.repository }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=sha,prefix={{branch}}- type=raw,value=latest,enable={{is_default_branch}} - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: ./Aethero_App push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | BUILD_DATE=${{ github.event.head_commit.timestamp }} VCS_REF=${{ github.sha }} VERSION=${{ github.ref_name }} deploy-staging: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/develop' steps: - name: Deploy to staging run: | echo "Deploying to staging environment..." # Add staging deployment logic here deploy-production: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Deploy to production run: | echo "Deploying to production environment..." # Add production deployment logic here deploy-huggingface: needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - name: Deploy to Hugging Face Spaces env: HF_TOKEN: ${{ secrets.HF_TOKEN }} run: | pip install huggingface_hub python -c " from huggingface_hub import HfApi api = HfApi() # Upload the app files to Hugging Face Spaces api.upload_folder( folder_path='./Aethero_App', repo_id='${{ github.repository_owner }}/aethero-fastapi', repo_type='space', token='${{ secrets.HF_TOKEN }}' ) "