diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 76f86d6..337ff12 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -1,205 +1,208 @@ -name: Python Linting, Test and Upload - -on: - push: - pull_request: - workflow_dispatch: - -jobs: - # JOB - # This job runs unit tests, linting and format checks - tests: - runs-on: ubuntu-latest - - strategy: - # If either the tests for 3.11 or 3.12 fail, all workflows - # are terminated to save computing resources. - fail-fast: true - # To safe runtime least and latest version supported are - # chosen. For more info see the pyproject.toml - matrix: - python-version: ["3.11", "3.12"] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - - name: Install Task - run: | - sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d - - # Cache dependencies from poetry to speed things up - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v3 - with: - path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }} - - - name: Install and upgrade pip and uv - run: python -m pip install --upgrade pip uv - - - name: Install Dependencies - run: ./bin/task setup - - - name: Lint code - run: ./bin/task lint - - - name: Test code - run: ./bin/task test - - # JOB - # This job publishes the package to test-pipy. - test-publish: - # Will run after the job 'tests' - needs: [tests] - - if: > - startsWith(github.ref, 'refs/tags/') || - startsWith(github.ref, 'refs/heads/release/') - runs-on: ubuntu-latest - # Required for installation of the test package in the - # next job. - outputs: - version: ${{ steps.extract_version.outputs.version }} - - steps: - - uses: actions/checkout@v3 - - - name: Remember version - id: extract_version - run: | - VERSION=$(cat pyproject.toml | grep -oE -m 1 "version = \"(.*)\"" | cut -f2 -d '"') - echo "Version: ${VERSION}" - echo "version=${VERSION}" >> $GITHUB_OUTPUT - - # For publishing any version will do - - name: Set up Python 3.11 - uses: actions/setup-python@v4 - with: - python-version: "3.11" - - - name: Install Task - run: | - sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d - - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v3 - with: - path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip poetry - ./bin/task setup - - - name: Build packages for release - run: ./bin/task build - - - name: Publish distribution to Test PyPI - env: - TWINE_REPOSITORY_URL: https://test.pypi.org/legacy/ - TWINE_USERNAME: __token__ - TWINE_NON_INTERACTIVE: 1 - TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }} - run: poetry run twine upload --skip-existing --verbose 'dist/*' - - # JOB - # Test install from pypi to see if we have any installation bugs. - test-install: - needs: [test-publish] - if: > - startsWith(github.ref, 'refs/tags/') || - startsWith(github.ref, 'refs/heads/release/') - - runs-on: ubuntu-latest - - # Use the version from the previous job - env: - VERSION: ${{ needs.test-publish.outputs.version }} - - steps: - # Install python (be aware NO checkout action) - - name: Set up Python 3.11 - uses: actions/setup-python@v4 - with: - python-version: "3.11" - - # Check if it installs without errors - - name: Install package - run: | - python -m pip install \ - --index-url https://test.pypi.org/simple/ \ - --extra-index-url https://pypi.org/simple \ - lasso-python=="${VERSION}" - - # We run the D3plot import here as it is the most delicate piece of the - # package for importing C-libraries. - - name: Test if the installed package works - run: python -c 'from lasso.dyna import D3plot' - - # JOB - # Finally publish the code to pypi - publish: - needs: [test-install] - if: startsWith(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - # We need the entire git history for building the docs - with: - fetch-depth: 0 - - - name: Set up Python 3.11 - uses: actions/setup-python@v4 - with: - python-version: "3.11" - - - name: Install Task - run: | - sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d - - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v3 - with: - path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} - - - name: Install Dependencies - run: | - python -m pip install --upgrade poetry pip - ./bin/task setup - - - name: Build packages for release - run: ./bin/task build - - # Not required but this saves the distribution files - # with the package upload for debugging purposes. - - name: Save packages as artifacts - uses: actions/upload-artifact@v2 - with: - name: dist - path: dist - if-no-files-found: error - - - name: Publish distribution to PyPI - env: - TWINE_USERNAME: __token__ - TWINE_NON_INTERACTIVE: 1 - TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - run: poetry run twine upload --skip-existing --verbose 'dist/*' - - - name: Upload new docs - # We run a git pull first to ensure the runner has the latest pages - # branch. It did fail because of it in the past. - run: | - git pull origin gh-pages --rebase - ./bin/task docs:deploy +name: Python Linting, Test and Upload + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + # JOB + # This job runs unit tests, linting and format checks + tests: + runs-on: ubuntu-latest + + strategy: + # If either the tests for 3.11 or 3.12 fail, all workflows + # are terminated to save computing resources. + fail-fast: true + # To safe runtime least and latest version supported are + # chosen. For more info see the pyproject.toml + matrix: + python-version: ["3.11", "3.12"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Task + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d + + # Cache dependencies from poetry to speed things up + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }} + + - name: Install uv + run: curl -LsSf https://astral.sh/uv/install.sh | sh + + - name: Install Dependencies + run: ./bin/task setup + + - name: Lint code + run: ./bin/task lint + + - name: Test code + run: ./bin/task test + + # JOB + # This job publishes the package to test-pipy. + test-publish: + # Will run after the job 'tests' + needs: [tests] + + if: > + startsWith(github.ref, 'refs/tags/') || + startsWith(github.ref, 'refs/heads/release/') + runs-on: ubuntu-latest + # Required for installation of the test package in the + # next job. + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # For publishing any version will do + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: Install Task + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }} + + - name: Install uv + run: curl -LsSf https://astral.sh/uv/install.sh | sh + + - name: Install Dependencies + run: ./bin/task setup + + - name: Build packages for release + run: ./bin/task build + + - name: Get package version + id: get_version + run: | + VERSION=$(basename dist/*.whl | cut -d- -f2) + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Publish distribution to Test PyPI + env: + TWINE_REPOSITORY_URL: https://test.pypi.org/legacy/ + TWINE_USERNAME: __token__ + TWINE_NON_INTERACTIVE: 1 + TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }} + run: uv run twine upload --skip-existing --verbose 'dist/*' + + # JOB + # Test install from pypi to see if we have any installation bugs. + test-install: + needs: [test-publish] + if: > + startsWith(github.ref, 'refs/tags/') || + startsWith(github.ref, 'refs/heads/release/') + + runs-on: ubuntu-latest + + # Use the version from the previous job + env: + VERSION: ${{ needs.test-publish.outputs.version }} + + steps: + # Install python (be aware NO checkout action) + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + # Check if it installs without errors + - name: Install package + run: | + python -m pip install \ + --index-url https://test.pypi.org/simple/ \ + --extra-index-url https://pypi.org/simple \ + lasso-python=="${VERSION}" + + # We run the D3plot import here as it is the most delicate piece of the + # package for importing C-libraries. + - name: Test if the installed package works + run: python -c 'from lasso.dyna import D3plot' + + # JOB + # Finally publish the code to pypi + publish: + needs: [test-install] + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + # We need the entire git history for building the docs + with: + fetch-depth: 0 + + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: Install Task + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }} + + - name: Install uv + run: curl -LsSf https://astral.sh/uv/install.sh | sh + + - name: Install Dependencies + run: ./bin/task setup + + - name: Build packages for release + run: ./bin/task build + + # Not required but this saves the distribution files + # with the package upload for debugging purposes. + - name: Save packages as artifacts + uses: actions/upload-artifact@v2 + with: + name: dist + path: dist + if-no-files-found: error + + - name: Publish distribution to PyPI + env: + TWINE_USERNAME: __token__ + TWINE_NON_INTERACTIVE: 1 + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: uv run twine upload --skip-existing --verbose 'dist/*' + + - name: Upload new docs + # We run a git pull first to ensure the runner has the latest pages + # branch. It did fail because of it in the past. + run: | + git pull origin gh-pages --rebase + ./bin/task docs:deploy \ No newline at end of file diff --git a/Taskfile.yml b/Taskfile.yml index 29eecbd..3b364dc 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -15,7 +15,7 @@ tasks: build: desc: Builds the python package cmds: - - uv build + - uv build -v test: desc: Runs tests on the code