From e0b813a46af40e8c80e879e14affe0d063a44c36 Mon Sep 17 00:00:00 2001 From: BAK BYEONG JUN Date: Wed, 9 Apr 2025 06:12:47 +0000 Subject: [PATCH] init --- tasks/git-clone-checkout/task.yaml | 18 ------ tasks/poetry/task.yaml | 69 -------------------- tasks/pybuild/task.yaml | 82 +++++++++++++++++++++++ tasks/pylint/task.yaml | 69 ++++++++++++++++++++ tasks/pypi/task.yaml | 100 +++++------------------------ tasks/pytest/task.yaml | 100 +++++++++++++++++------------ tasks/tekst/task.yaml | 10 --- 7 files changed, 227 insertions(+), 221 deletions(-) delete mode 100644 tasks/poetry/task.yaml create mode 100644 tasks/pybuild/task.yaml create mode 100644 tasks/pylint/task.yaml delete mode 100644 tasks/tekst/task.yaml diff --git a/tasks/git-clone-checkout/task.yaml b/tasks/git-clone-checkout/task.yaml index faa4426..50972b7 100644 --- a/tasks/git-clone-checkout/task.yaml +++ b/tasks/git-clone-checkout/task.yaml @@ -2,25 +2,7 @@ apiVersion: tekton.dev/v1 kind: Task metadata: name: git-clone-checkout - # labels: - # app.kubernetes.io/version: "0.9" - # annotations: - # tekton.dev/pipelines.minVersion: "0.38.0" - # tekton.dev/categories: Git - # tekton.dev/tags: git - # tekton.dev/displayName: "git clone and checkout" - # tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le,linux/arm64" spec: - description: >- - These Tasks are Git tasks to work with repositories used by other tasks - in your Pipeline. - - The git-clone Task will clone a repo from the provided url into the - output Workspace. By default the repo will be cloned into the root of - your Workspace. You can clone into a subdirectory by setting this Task's - subdirectory param. This Task also supports sparse checkouts. To perform - a sparse checkout, pass a list of comma separated directory patterns to - this Task's sparseCheckoutDirectories param. workspaces: - name: output description: The git repo will be cloned onto the volume backing this Workspace. diff --git a/tasks/poetry/task.yaml b/tasks/poetry/task.yaml deleted file mode 100644 index 492bfb5..0000000 --- a/tasks/poetry/task.yaml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: tekton.dev/v1 -kind: Task -metadata: - name: poetry - namespace: gitops-ci - labels: - app.kubernetes.io/version: "0.4" - annotations: - tekton.dev/pipelines.minVersion: "0.21.0" - tekton.dev/categories: Poetry - tekton.dev/tags: poetry - tekton.dev/displayName: "poetry" - tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le" -spec: - description: >- - This task can be used to perform python poetry operations. - - python poetry command that needs to be run can be passed as a script to - the task. - - workspaces: - - name: source - description: A workspace that contains python source. - - params: - - name: BASE_IMAGE - description: | - The base image for the task. - type: string - default: python:3.13.2-bullseye - - - name: POETRY_VERSION - description: | - The base version of the poetry. - type: string - default: 2.1.2 - - - name: POETRY_SCRIPT - description: The poetry and python script to run. - type: string - default: | - poetry help - - - name: VERBOSE - description: Log the commands that are executed during operation. - type: string - default: "true" - - steps: - - name: poetry - image: $(params.BASE_IMAGE) - workingDir: $(workspaces.source.path) - env: - - name: POETRY_VERSION - value: $(params.POETRY_VERSION) - - name: PARAM_VERBOSE - value: $(params.VERBOSE) - script: | - #!/usr/bin/env sh - set -eu - - if [ "${PARAM_VERBOSE}" = "true" ] ; then - set -x - fi - - pipx install poetry==${POETRY_VERSION} - export PATH="$HOME/.local/bin:$PATH" - - eval '$(params.POETRY_SCRIPT)' diff --git a/tasks/pybuild/task.yaml b/tasks/pybuild/task.yaml new file mode 100644 index 0000000..f489717 --- /dev/null +++ b/tasks/pybuild/task.yaml @@ -0,0 +1,82 @@ +apiVersion: tekton.dev/v1beta1 +kind: Task +metadata: + name: pybuild +spec: + params: + - name: subdirectory + type: string + description: Subdirectory within the repo where the source code is located + default: "" + - name: python-version + type: string + description: Python version to use (e.g., 3.9, 3.11) + default: "3.9" + workspaces: + - name: source + description: Workspace containing the cloned Git repository from git-clone-checkout + results: + - name: build-artifact-path + description: Path to the built artifact directory (e.g., dist/) + steps: + - name: install-dependencies + image: python:$(params.python-version)-slim + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) + fi + pip install --upgrade pip + # Poetry가 있는 경우 설치 및 의존성 처리 + if [ -f pyproject.toml ]; then + echo "Detected Poetry project (pyproject.toml found)" + pip install poetry + poetry config virtualenvs.in-project true + poetry install --no-root + # Pip fallback (requirements.txt 및 setup.py) + elif [ -f requirements.txt ] && [ -f setup.py ]; then + echo "Detected Pip project (requirements.txt and setup.py found)" + pip install -r requirements.txt + pip install build + else + echo "Error: No valid build configuration found (pyproject.toml or setup.py required)" + exit 1 + fi + - name: build-package + image: python:$(params.python-version)-slim + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) + fi + # Poetry가 사용된 경우 + if [ -f pyproject.toml ]; then + poetry build + echo "Built artifacts located in dist/" + ls -l dist/ + # Pip 및 setup.py 사용 + elif [ -f setup.py ]; then + python -m build + echo "Built artifacts located in dist/" + ls -l dist/ + else + echo "Error: No build tool available" + exit 1 + fi + # 빌드 결과 경로를 결과로 저장 + echo -n "/workspace/source/$(params.subdirectory)/dist" > /tekton/results/build-artifact-path + - name: verify-build + image: ubuntu + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + DIST_PATH=$(cat /tekton/results/build-artifact-path) + if [ -d "$DIST_PATH" ] && [ -n "$(ls -A $DIST_PATH)" ]; then + echo "Build artifacts successfully created in $DIST_PATH:" + ls -l $DIST_PATH + else + echo "Error: No build artifacts found in $DIST_PATH" + exit 1 + fi diff --git a/tasks/pylint/task.yaml b/tasks/pylint/task.yaml new file mode 100644 index 0000000..d36d876 --- /dev/null +++ b/tasks/pylint/task.yaml @@ -0,0 +1,69 @@ +apiVersion: tekton.dev/v1 +kind: Task +metadata: + name: pylint +spec: + params: + - name: subdirectory + type: string + description: Subdirectory within the repo where the source code is located + default: "" + - name: python-version + type: string + description: Python version to use (e.g., 3.9, 3.11) + default: "3.9" + - name: pylint-args + type: string + description: Additional arguments for pylint (e.g., --fail-under=8) + default: "" + workspaces: + - name: source + description: Workspace containing the cloned Git repository from git-clone-checkout + steps: + - name: install-dependencies + image: python:$(params.python-version)-slim + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) + fi + pip install --upgrade pip + # Poetry가 있는 경우 설치 및 의존성 처리 + if [ -f pyproject.toml ]; then + echo "Detected Poetry project (pyproject.toml found)" + pip install poetry + poetry config virtualenvs.in-project true + poetry install --no-root + poetry add pylint --group dev # Pylint를 개발 의존성으로 추가 + # Pip fallback (requirements.txt) + elif [ -f requirements.txt ]; then + echo "Detected Pip project (requirements.txt found)" + pip install -r requirements.txt + pip install pylint + else + echo "No dependency file found, installing pylint only" + pip install pylint + fi + - name: run-lint + image: python:$(params.python-version)-slim + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) + fi + # Poetry가 사용된 경우 가상환경에서 실행 + if [ -f pyproject.toml ]; then + poetry run pylint $(params.pylint-args) . + else + pylint $(params.pylint-args) . + fi + onError: continue # 린트 실패 시에도 파이프라인을 중단하지 않음 (선택적) + - name: check-results + image: ubuntu + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + echo "Pylint execution completed." + # Pylint 결과를 별도 파일로 저장하려면 run-lint에서 --output 옵션 추가 필요 diff --git a/tasks/pypi/task.yaml b/tasks/pypi/task.yaml index f4374c3..9874942 100644 --- a/tasks/pypi/task.yaml +++ b/tasks/pypi/task.yaml @@ -2,90 +2,24 @@ apiVersion: tekton.dev/v1 kind: Task metadata: name: pypi - namespace: gitops-ci - labels: - app.kubernetes.io/version: "0.2" - annotations: - tekton.dev/pipelines.minVersion: "0.12.1" - tekton.dev/categories: Publishing - tekton.dev/tags: build - tekton.dev/displayName: "pypi" - tekton.dev/platforms: "linux/amd64" spec: - description: >- - This Task publishes Python packages to PyPI index using Twine utility module. - - It provides build system independent uploads of source and binary distribution - artifacts for both new and existing projects. - params: - - name: TWINE_REPOSITORY_URL - description: The repository (package index) to upload the package to. - default: "https://upload.pypi.org/legacy/" - type: string - - name: SECRET_NAME - description: Name of the secret containing the username & password used to upload the package. - default: "pypi-secret" - type: string - - name: SECRET_USERNAME_KEY - description: Name of the secret key containing the username. - default: "username" - type: string - - name: SECRET_PASSWORD_KEY - description: Name of the secret key containing the password. - default: "password" - type: string - - name: PREBUILD_SCRIPT - description: Script to execute prior to running setup.py. - type: string - default: '' - - name: BUILDER_IMAGE - description: Image to use for building the package - type: string - default: 'python:3.9' - + - name: build-artifact-path + type: string + description: Path to the built artifact directory from python-build workspaces: - - name: source - + - name: source + description: Workspace containing the built artifacts steps: - - name: build-package - image: $(params.BUILDER_IMAGE) - workingDir: $(workspaces.source.path) - script: | - $(params.PREBUILD_SCRIPT) - - python setup.py sdist bdist_wheel - - name: upload-package - image: quay.io/thoth-station/twine:v0.0.2 #tag: v0.0.2 - workingDir: $(workspaces.source.path) - env: - - name: TWINE_REPOSITORY_URL - value: $(params.TWINE_REPOSITORY_URL) - - name: TWINE_USERNAME - valueFrom: - secretKeyRef: - name: $(params.SECRET_NAME) - key: $(params.SECRET_USERNAME_KEY) - - name: TWINE_PASSWORD - valueFrom: - secretKeyRef: - name: $(params.SECRET_NAME) - key: $(params.SECRET_PASSWORD_KEY) - script: | - twine upload --disable-progress-bar dist/* - # Now write out all our results, stripping newlines. - # sdist files are .tar.gz's - sha256sum dist/*.tar.gz | tr -d '\n' | tee $(results.sdist_sha.path) - # bdist files are .whls's - sha256sum dist/*.whl | tr -d '\n' | tee $(results.bdist_sha.path) - python setup.py --name | tr -d '\n' | tee $(results.package_name.path) - python setup.py --version | tr -d '\n' | tee $(results.package_version.path) - results: - - name: sdist_sha - description: sha256 (and filename) of the sdist package - - name: bdist_sha - description: sha256 (and filename) of the bdist package - - name: package_name - description: name of the uploaded package - - name: package_version - description: version of the uploaded package \ No newline at end of file + - name: upload-to-pypi + image: python:$(params.python-version)-slim + script: | + #!/usr/bin/env bash + pip install twine + twine upload --username "__token__" --password "$PYPI_TOKEN" $(params.build-artifact-path)/* + env: + - name: PYPI_TOKEN + valueFrom: + secretKeyRef: + name: pypi-credentials + key: token diff --git a/tasks/pytest/task.yaml b/tasks/pytest/task.yaml index 064a3ed..55d23da 100644 --- a/tasks/pytest/task.yaml +++ b/tasks/pytest/task.yaml @@ -1,50 +1,68 @@ -apiVersion: tekton.dev/v1 +apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: pytest - namespace: gitops-ci - labels: - app.kubernetes.io/version: "0.2" - annotations: - tekton.dev/pipelines.minVersion: "0.56.1" - tekton.dev/displayName: "pytest" - tekton.dev/categories: Developer Tools - tekton.dev/tags: pytest - tekton.dev/platforms: "linux/amd64" spec: - description: >- - These tasks make it possible to use pytest within your Tekton pipelines - - pytest is a tool for testing configuration files using Open Policy Agent. - + params: + - name: subdirectory + type: string + description: Subdirectory within the repo where the tests are located + default: "" + - name: python-version + type: string + description: Python version to use (e.g., 3.9, 3.11) + default: "3.9" workspaces: - name: source - params: - - name: BASE_IMAGE - description: | - The base image for the task. - type: string - default: python:3.13.2-bullseye - - name: VERBOSE - description: Log the commands that are executed during operation. - type: string - default: "true" - + description: Workspace containing the cloned Git repository from git-clone-checkout steps: - - name: pytest - image: $(params.BASE_IMAGE) - workingDir: $(workspaces.source.path) - env: - - name: PARAM_VERBOSE - value: $(params.VERBOSE) + - name: install-dependencies + image: python:$(params.python-version)-slim + workingDir: /workspace/source script: | - #!/usr/bin/env sh - set -eu - - if [ "${PARAM_VERBOSE}" = "true" ] ; then - set -x + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) fi - - pip install -U pytest - - pytest \ No newline at end of file + pip install --upgrade pip + # Poetry가 있는 경우 설치 및 의존성 처리 + if [ -f pyproject.toml ]; then + echo "Detected Poetry project (pyproject.toml found)" + pip install poetry + poetry config virtualenvs.in-project true + poetry install --no-root + # Pip fallback (requirements.txt) + elif [ -f requirements.txt ]; then + echo "Detected Pip project (requirements.txt found)" + pip install -r requirements.txt + else + echo "No dependency file found, installing pytest only" + fi + pip install pytest # pytest는 항상 설치 + - name: run-tests + image: python:$(params.python-version)-slim + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -n "$(params.subdirectory)" ]; then + cd $(params.subdirectory) + fi + # Poetry가 사용된 경우 가상환경에서 실행 + if [ -f pyproject.toml ]; then + poetry run pytest --verbose --junitxml=/workspace/source/pytest-results.xml + else + pytest --verbose --junitxml=/workspace/source/pytest-results.xml + fi + onError: continue # 테스트 실패 시에도 파이프라인을 중단하지 않음 (선택적) + - name: check-results + image: ubuntu + workingDir: /workspace/source + script: | + #!/usr/bin/env bash + if [ -f pytest-results.xml ]; then + echo "Test results generated: pytest-results.xml" + cat pytest-results.xml + else + echo "No test results found." + exit 1 + fi \ No newline at end of file diff --git a/tasks/tekst/task.yaml b/tasks/tekst/task.yaml deleted file mode 100644 index 5d41248..0000000 --- a/tasks/tekst/task.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: tekton.dev/v1 -kind: Task -metadata: - name: tekst -spec: - steps: - - name: echo - image: "alpine/git:2.47.2" - script: | - echo "Hello from Gitea Task!"