Verified Commit 9c055031 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Add python build package pipeline template

parent a616b04d
Loading
Loading
Loading
Loading
Loading
+101 −0
Original line number Diff line number Diff line
workflow:
  rules:
  - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
    when: never
  - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$$/
    variables:
      PUSH_PACKAGE: "true"
  - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+/
  - if: $CI_COMMIT_BRANCH


.python-pkg:
  image: python:3.10
  variables:
    PIP_CACHE_DIR: $CI_PROJECT_DIR/pip-cache
    PIP_NO_COMPILE: "true"
    PIP_NO_CLEAN: "true"
  cache:
    key: $CI_JOB_IMAGE
    paths: [pip-cache]


Check Tag:
  stage: .pre
  extends: [.python-pkg]
  rules:
  - if: $CI_COMMIT_TAG
  script:
  - pip install packaging toml
  - |
    python <<-END
    import sys
    import toml
    from glob import glob
    from packaging.version import Version

    with open("pyproject.toml", "r+") as proj_config:
      proj = toml.load(proj_config)
      proj_config.seek(0)
      version = Version(proj["project"]["version"])
      tag = Version("$CI_COMMIT_TAG")
      if version.base_version != str(version):
        sys.exit("Project version should be a release version")
      if tag == version:
        sys.exit(0)
      if tag.base_version == str(version):
        proj["project"]["version"] = str(tag)
        toml.dump(proj, proj_config)
        sys.exit(0)
      sys.exit(f"Versions do not match: {version} != {tag}")
    END
  artifacts:
    paths: [pyproject.toml]


Build Packages:
  stage: build
  extends: [.python-pkg]
  needs:
  - job: "Check Tag"
    optional: true
  script:
  - pip install build
  - python -m build
  artifacts:
    paths: [dist]


Upload Package (Test):
  stage: deploy
  extends: [.python-pkg]
  dependencies: ["Build Packages"]
  rules:
  - if: $CI_COMMIT_TAG
  script:
  - pip install twine
  - TWINE_USERNAME=gitlab-ci-token
    TWINE_PASSWORD=$CI_JOB_TOKEN
    twine upload
    --verbose
    --non-interactive
    --repository-url $CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/pypi
    dist/*


Upload Package (PyPI):
  stage: deploy
  extends: [.python-pkg]
  dependencies: ["Build Packages"]
  rules:
  - if: $PYPI_TOKEN && $PUSH_PACKAGE
    when: manual
  script:
  - pip install twine
  - TWINE_USERNAME=__token__
    TWINE_PASSWORD=$PYPI_TOKEN
    twine upload
    --verbose
    --non-interactive
    dist/*