diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11f8a8cad..7fbfbc735 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,12 +19,12 @@ concurrency: permissions: repository-projects: read jobs: - build-linux: - + tests: + name: "Tests and Linting" runs-on: ${{ matrix.os }} strategy: matrix: - os: [ "ubuntu-22.04", "ubuntu-24.04" ] + os: [ "ubuntu-22.04", "ubuntu-24.04", "macos-14", "macos-15" , "windows-2022", "windows-2025" ] python-version: ["3.11", "3.12", "3.13"] steps: @@ -46,7 +46,14 @@ jobs: cache-dependency-glob: "requirements**.txt" cache-suffix: "${{ matrix.python-version }}" - - name: Installation - *nix + - name: Installation - macOS (Brew) + if: ${{ runner.os == 'macOS' }} + run: | + # brew update + # TODO: Should be the brew upgrade + brew install libomp + + - name: Installation (python) run: | uv pip install --upgrade wheel uv pip install -r requirements-dev.txt @@ -60,7 +67,7 @@ jobs: - name: Tests if: (!(runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')) run: | - pytest --random-order + pytest --random-order --durations 20 -n auto - name: Tests with Coveralls if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04') @@ -87,9 +94,9 @@ jobs: run: | python build_helpers/create_command_partials.py - - name: Check for repository changes + - name: Check for repository changes - *nix # TODO: python 3.13 slightly changed the output of argparse. - if: (matrix.python-version != '3.13') + if: ${{ (matrix.python-version != '3.13') && (runner.os != 'Windows') }} run: | if [ -n "$(git status --porcelain)" ]; then echo "Repository is dirty, changes detected:" @@ -100,13 +107,27 @@ jobs: echo "Repository is clean, no changes detected." fi + - name: Check for repository changes - Windows + if: ${{ runner.os == 'Windows' && (matrix.python-version != '3.13') }} + run: | + if (git status --porcelain) { + Write-Host "Repository is dirty, changes detected:" + git status + git diff + exit 1 + } + else { + Write-Host "Repository is clean, no changes detected." + } + - name: Backtesting (multi) run: | - cp tests/testdata/config.tests.json config.json freqtrade create-userdir --userdir user_data + cp tests/testdata/config.tests.json user_data/config.json freqtrade new-strategy -s AwesomeStrategy freqtrade new-strategy -s AwesomeStrategyMin --template minimal - freqtrade backtesting --datadir tests/testdata --strategy-list AwesomeStrategy AwesomeStrategyMin -i 5m + freqtrade new-strategy -s AwesomeStrategyAdv --template advanced + freqtrade backtesting --datadir tests/testdata --strategy-list AwesomeStrategy AwesomeStrategyMin AwesomeStrategyAdv -i 5m - name: Hyperopt run: | @@ -127,188 +148,13 @@ jobs: ruff format --check - name: Mypy - if: matrix.os == 'ubuntu-24.04' - run: | - mypy freqtrade scripts tests - - - name: Discord notification - uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) - with: - severity: error - details: Freqtrade CI failed on ${{ matrix.os }} - webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} - - build-macos: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ "macos-14", "macos-15" ] - python-version: ["3.11", "3.12", "3.13"] - - steps: - - uses: actions/checkout@v5 - with: - persist-credentials: false - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - check-latest: true - - - name: Install uv - uses: astral-sh/setup-uv@b75a909f75acd358c2196fb9a5f1299a9a8868a4 # v6.7.0 - with: - activate-environment: true - enable-cache: true - python-version: ${{ matrix.python-version }} - cache-dependency-glob: "requirements**.txt" - cache-suffix: "${{ matrix.python-version }}" - - - name: Installation - macOS (Brew) - run: | - # brew update - # TODO: Should be the brew upgrade - brew install libomp - - - name: Installation (python) - run: | - uv pip install wheel - uv pip install -r requirements-dev.txt - uv pip install -e ft_client/ - uv pip install -e . - - - name: Tests - run: | - pytest --random-order - - - name: Check for repository changes - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "Repository is dirty, changes detected:" - git status - git diff - exit 1 - else - echo "Repository is clean, no changes detected." - fi - - - name: Backtesting - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade new-strategy -s AwesomeStrategyAdv --template advanced - freqtrade backtesting --datadir tests/testdata --strategy AwesomeStrategyAdv - - - name: Hyperopt - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all - - - name: Sort imports (isort) - run: | - isort --check . - - - name: Run Ruff - run: | - ruff check --output-format=github - - - name: Run Ruff format check - run: | - ruff format --check - - - name: Mypy - if: matrix.os == 'macos-15' - run: | - mypy freqtrade scripts - - - name: Discord notification - uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) - with: - severity: info - details: Test Succeeded! - webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} - - build-windows: - - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ "windows-2022", "windows-2025" ] - python-version: ["3.11", "3.12", "3.13"] - - steps: - - uses: actions/checkout@v5 - with: - persist-credentials: false - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - - name: Install uv - uses: astral-sh/setup-uv@b75a909f75acd358c2196fb9a5f1299a9a8868a4 # v6.7.0 - with: - activate-environment: true - enable-cache: true - python-version: ${{ matrix.python-version }} - cache-dependency-glob: "requirements**.txt" - cache-suffix: "${{ matrix.python-version }}" - - - name: Installation - run: | - function uvpipFunction { uv pip $args } - Set-Alias -name pip -value uvpipFunction - - python -m pip install --upgrade pip - pip install -r requirements-dev.txt - pip install -e . - - - name: Tests - run: | - pytest --random-order --durations 20 -n auto - - - name: Check for repository changes - run: | - if (git status --porcelain) { - Write-Host "Repository is dirty, changes detected:" - git status - git diff - exit 1 - } - else { - Write-Host "Repository is clean, no changes detected." - } - - - name: Backtesting - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade backtesting --datadir tests/testdata --strategy SampleStrategy - - - name: Hyperopt - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all - - - name: Run Ruff - run: | - ruff check --output-format=github - - - name: Run Ruff format check - run: | - ruff format --check - - - name: Mypy + if: ${{ matrix.os == 'ubuntu-24.04' || matrix.os == 'macos-15' }} run: | mypy freqtrade scripts tests - name: Run Pester tests (PowerShell) + if: ${{ runner.os == 'Windows' }} + shell: powershell run: | $PSVersionTable Set-PSRepository psgallery -InstallationPolicy trusted @@ -317,18 +163,17 @@ jobs: Invoke-Pester -Path "tests" -CI if ($Error.Length -gt 0) {exit 1} - shell: powershell - - name: Discord notification uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) + if: ${{ failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) }} with: severity: error - details: Test Failed + details: Freqtrade CI failed on ${{ matrix.os }} with Python ${{ matrix.python-version }}! webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} mypy-version-check: - runs-on: ubuntu-22.04 + name: "Mypy Version Check" + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 with: @@ -345,6 +190,7 @@ jobs: python build_helpers/pre_commit_update.py pre-commit: + name: "Pre-commit checks" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 @@ -357,6 +203,7 @@ jobs: - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 docs-check: + name: "Documentation build" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 @@ -388,6 +235,7 @@ jobs: build-linux-online: # Run pytest with "live" checks + name: "Tests and Linting - Online tests" runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 @@ -425,9 +273,7 @@ jobs: # Notify only once - when CI completes (and after deploy) in case it's successful notify-complete: needs: [ - build-linux, - build-macos, - build-windows, + tests, docs-check, mypy-version-check, pre-commit, @@ -459,7 +305,7 @@ jobs: build: name: "Build" - needs: [ build-linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ] + needs: [ tests, docs-check, mypy-version-check, pre-commit ] runs-on: ubuntu-22.04 steps: @@ -556,7 +402,12 @@ jobs: docker-build: name: "Docker Build and Deploy" - needs: [ build-linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ] + needs: [ + tests, + docs-check, + mypy-version-check, + pre-commit + ] if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade' uses: ./.github/workflows/docker-build.yml permissions: