From 1857324f8bb24cbefc06ef3750e1ccaccdeb716a Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 15:55:44 -0300 Subject: [PATCH 01/10] ci: add Harness CI pipeline for split-openfeature-provider-python AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- ...plitopenfeatureproviderpythoninputset.yaml | 14 ++ .harness/pipeline.yaml | 158 ++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 .harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml create mode 100644 .harness/pipeline.yaml diff --git a/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml new file mode 100644 index 0000000..4ab613b --- /dev/null +++ b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml @@ -0,0 +1,14 @@ +inputSet: + identifier: splitopenfeatureproviderpyinputset + name: splitopenfeatureproviderpyinputset + orgIdentifier: PROD + projectIdentifier: Harness_Split + pipeline: + identifier: splitopenfeatureproviderpy + properties: + ci: + codebase: + build: + type: PR + spec: + number: <+trigger.prNumber> diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml new file mode 100644 index 0000000..090d065 --- /dev/null +++ b/.harness/pipeline.yaml @@ -0,0 +1,158 @@ +pipeline: + name: split-openfeature-provider-python + identifier: splitopenfeatureproviderpy + projectIdentifier: Harness_Split + orgIdentifier: PROD + tags: {} + properties: + ci: + codebase: + connectorRef: fmegithubharnessgitops + repoName: split-openfeature-provider-python + build: + type: branch + spec: + branch: <+input> + stages: + - stage: + name: Build and Test + identifier: Build_and_Test + description: "" + type: CI + spec: + cloneCodebase: true + caching: + enabled: true + override: true + platform: + os: Linux + arch: Amd64 + runtime: + type: Cloud + spec: + size: flex + execution: + steps: + - step: + type: Run + name: Install Python + identifier: Install_Python + spec: + shell: Bash + command: |- + curl https://mise.run | sh + export PATH="$HOME/.local/bin:$PATH" + mise use --global python@<+matrix.pythonVersion> + eval "$(mise activate bash)" + python --version + pip --version + - step: + type: Run + name: Install Dependencies + identifier: Install_Dependencies + spec: + shell: Bash + command: |- + export PATH="$HOME/.local/bin:$PATH" + eval "$(mise activate bash)" + pip install -e . + pip install -r requirements-dev.txt + - step: + type: Run + name: Run Tests + identifier: Run_Tests + spec: + shell: Bash + command: |- + export PATH="$HOME/.local/bin:$PATH" + eval "$(mise activate bash)" + pytest -v --cov=split_openfeature_provider --cov-report=xml:../coverage.xml + - step: + type: Run + name: SonarQube Scan + identifier: SonarQube_Scan + when: + stageStatus: Success + condition: <+matrix.pythonVersion> == "3.9.13" + spec: + shell: Sh + command: |- + export SONAR_SCANNER_VERSION=5.0.1.3006 + curl -sSLo sonar-scanner.zip \ + "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip" + unzip -q sonar-scanner.zip + export PATH="$PWD/sonar-scanner-${SONAR_SCANNER_VERSION}-linux/bin:$PATH" + apt-get install -y openjdk-17-jdk -qq + VERSION=$(python3 -c "import re; print(re.search(r'version\s*=\s*[\'\"]([^\'\"]+)[\'\"]', open('setup.py').read()).group(1))") + if [ "<+codebase.build.type>" = "PR" ]; then + sonar-scanner \ + -Dsonar.projectKey=split-openfeature-provider-python \ + -Dsonar.sources=split_openfeature_provider \ + -Dsonar.tests=tests \ + -Dsonar.host.url=https://sonar.harness.io \ + -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ + -Dsonar.python.version=<+matrix.pythonVersion> \ + -Dsonar.python.coverage.reportPaths=coverage.xml \ + -Dsonar.projectVersion="${VERSION}" \ + -Dsonar.pullrequest.key=<+codebase.prNumber> \ + -Dsonar.pullrequest.branch=<+codebase.branch> \ + -Dsonar.pullrequest.base=<+codebase.targetBranch> + else + sonar-scanner \ + -Dsonar.projectKey=split-openfeature-provider-python \ + -Dsonar.sources=split_openfeature_provider \ + -Dsonar.tests=tests \ + -Dsonar.host.url=https://sonar.harness.io \ + -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ + -Dsonar.python.version=<+matrix.pythonVersion> \ + -Dsonar.python.coverage.reportPaths=coverage.xml \ + -Dsonar.projectVersion="${VERSION}" \ + -Dsonar.branch.name=<+codebase.branch> + fi + - step: + type: Run + name: Post Quality Gate + identifier: Post_Quality_Gate + when: + stageStatus: Success + condition: <+matrix.pythonVersion> == "3.9.13" + spec: + shell: Bash + command: |- + #!/bin/bash + set -e + + SONAR_TOKEN="<+secrets.getValue("sonarqube-token")>" + SONAR_URL="https://sonar.harness.io" + SONAR_PROJECT_KEY="split-openfeature-provider-python" + GITHUB_TOKEN="<+secrets.getValue("github-devops-token")>" + GITHUB_REPO="split-openfeature-provider-python" + COMMIT_SHA="<+codebase.commitSha>" + + STATUS_JSON=$(curl -sf \ + -H "Authorization: Bearer ${SONAR_TOKEN}" \ + "${SONAR_URL}/api/qualitygates/project_status?projectKey=${SONAR_PROJECT_KEY}") + + QG_STATUS=$(echo "$STATUS_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['projectStatus']['status'])") + + case "$QG_STATUS" in + OK) GH_STATE="success"; DESCRIPTION="Quality gate passed" ;; + ERROR) GH_STATE="failure"; DESCRIPTION="Quality gate failed" ;; + WARN) GH_STATE="success"; DESCRIPTION="Quality gate passed with warnings" ;; + *) GH_STATE="pending"; DESCRIPTION="Quality gate status unknown" ;; + esac + + TARGET_URL="${SONAR_URL}/dashboard?id=${SONAR_PROJECT_KEY}" + + curl -sf -X POST \ + -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Content-Type: application/json" \ + -d "{\"state\":\"${GH_STATE}\",\"description\":\"${DESCRIPTION}\",\"context\":\"sonarqube/quality-gate\",\"target_url\":\"${TARGET_URL}\"}" \ + "https://api.github.com/repos/splitio/${GITHUB_REPO}/statuses/${COMMIT_SHA}" + + echo "Posted SonarQube quality gate status: ${GH_STATE}" + strategy: + matrix: + pythonVersion: + - "3.9.13" From 65a002b4bc71e6235f94997df8ed221f19f1de54 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 16:23:05 -0300 Subject: [PATCH 02/10] ci: allow pipeline codebase build type to be runtime-input The pipeline previously fixed codebase.build.type to "branch", which rejected the PR-type override supplied by the input set/trigger. AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .harness/pipeline.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml index 090d065..c5d0d59 100644 --- a/.harness/pipeline.yaml +++ b/.harness/pipeline.yaml @@ -9,10 +9,7 @@ pipeline: codebase: connectorRef: fmegithubharnessgitops repoName: split-openfeature-provider-python - build: - type: branch - spec: - branch: <+input> + build: <+input> stages: - stage: name: Build and Test From a3e16c8991160151f1e9ad00438fd0683b15f081 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 16:26:57 -0300 Subject: [PATCH 03/10] ci: add Harness CI pipeline for split-openfeature-provider-python AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- ...plitopenfeatureproviderpythoninputset.yaml | 2 +- .harness/pipeline.yaml | 108 +++++++----------- 2 files changed, 43 insertions(+), 67 deletions(-) diff --git a/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml index 4ab613b..3e507a6 100644 --- a/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml +++ b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset.yaml @@ -1,6 +1,6 @@ inputSet: - identifier: splitopenfeatureproviderpyinputset name: splitopenfeatureproviderpyinputset + identifier: splitopenfeatureproviderpyinputset orgIdentifier: PROD projectIdentifier: Harness_Split pipeline: diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml index c5d0d59..cf9f5a1 100644 --- a/.harness/pipeline.yaml +++ b/.harness/pipeline.yaml @@ -63,92 +63,68 @@ pipeline: command: |- export PATH="$HOME/.local/bin:$PATH" eval "$(mise activate bash)" + cd split_openfeature_provider pytest -v --cov=split_openfeature_provider --cov-report=xml:../coverage.xml - step: type: Run - name: SonarQube Scan - identifier: SonarQube_Scan + name: SonarQube Scan Push + identifier: SonarQube_Scan_Push when: stageStatus: Success - condition: <+matrix.pythonVersion> == "3.9.13" + condition: <+matrix.pythonVersion> == "3.9.13" && <+codebase.build.type> == "branch" spec: shell: Sh command: |- + export PATH="$HOME/.local/bin:$PATH" + eval "$(mise activate bash)" + VERSION=$(python3 -c "import re; print(re.search(r'version\s*=\s*[\"\\']([^\"\\']+)[\"\\']', open('setup.py').read()).group(1))") + echo "Detected version: $VERSION" export SONAR_SCANNER_VERSION=5.0.1.3006 curl -sSLo sonar-scanner.zip \ "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip" unzip -q sonar-scanner.zip export PATH="$PWD/sonar-scanner-${SONAR_SCANNER_VERSION}-linux/bin:$PATH" apt-get install -y openjdk-17-jdk -qq - VERSION=$(python3 -c "import re; print(re.search(r'version\s*=\s*[\'\"]([^\'\"]+)[\'\"]', open('setup.py').read()).group(1))") - if [ "<+codebase.build.type>" = "PR" ]; then - sonar-scanner \ - -Dsonar.projectKey=split-openfeature-provider-python \ - -Dsonar.sources=split_openfeature_provider \ - -Dsonar.tests=tests \ - -Dsonar.host.url=https://sonar.harness.io \ - -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ - -Dsonar.python.version=<+matrix.pythonVersion> \ - -Dsonar.python.coverage.reportPaths=coverage.xml \ - -Dsonar.projectVersion="${VERSION}" \ - -Dsonar.pullrequest.key=<+codebase.prNumber> \ - -Dsonar.pullrequest.branch=<+codebase.branch> \ - -Dsonar.pullrequest.base=<+codebase.targetBranch> - else - sonar-scanner \ - -Dsonar.projectKey=split-openfeature-provider-python \ - -Dsonar.sources=split_openfeature_provider \ - -Dsonar.tests=tests \ - -Dsonar.host.url=https://sonar.harness.io \ - -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ - -Dsonar.python.version=<+matrix.pythonVersion> \ - -Dsonar.python.coverage.reportPaths=coverage.xml \ - -Dsonar.projectVersion="${VERSION}" \ - -Dsonar.branch.name=<+codebase.branch> - fi + sonar-scanner \ + -Dsonar.projectKey=split-openfeature-provider-python \ + -Dsonar.sources=split_openfeature_provider \ + -Dsonar.tests=tests \ + -Dsonar.host.url=https://sonar.harness.io \ + -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ + -Dsonar.python.coverage.reportPaths=coverage.xml \ + -Dsonar.projectVersion=$VERSION \ + -Dsonar.branch.name=<+codebase.branch> - step: type: Run - name: Post Quality Gate - identifier: Post_Quality_Gate + name: SonarQube Scan PR + identifier: SonarQube_Scan_PR when: stageStatus: Success - condition: <+matrix.pythonVersion> == "3.9.13" + condition: <+matrix.pythonVersion> == "3.9.13" && <+codebase.build.type> == "PR" spec: - shell: Bash + shell: Sh command: |- - #!/bin/bash - set -e - - SONAR_TOKEN="<+secrets.getValue("sonarqube-token")>" - SONAR_URL="https://sonar.harness.io" - SONAR_PROJECT_KEY="split-openfeature-provider-python" - GITHUB_TOKEN="<+secrets.getValue("github-devops-token")>" - GITHUB_REPO="split-openfeature-provider-python" - COMMIT_SHA="<+codebase.commitSha>" - - STATUS_JSON=$(curl -sf \ - -H "Authorization: Bearer ${SONAR_TOKEN}" \ - "${SONAR_URL}/api/qualitygates/project_status?projectKey=${SONAR_PROJECT_KEY}") - - QG_STATUS=$(echo "$STATUS_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['projectStatus']['status'])") - - case "$QG_STATUS" in - OK) GH_STATE="success"; DESCRIPTION="Quality gate passed" ;; - ERROR) GH_STATE="failure"; DESCRIPTION="Quality gate failed" ;; - WARN) GH_STATE="success"; DESCRIPTION="Quality gate passed with warnings" ;; - *) GH_STATE="pending"; DESCRIPTION="Quality gate status unknown" ;; - esac - - TARGET_URL="${SONAR_URL}/dashboard?id=${SONAR_PROJECT_KEY}" - - curl -sf -X POST \ - -H "Authorization: token ${GITHUB_TOKEN}" \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Content-Type: application/json" \ - -d "{\"state\":\"${GH_STATE}\",\"description\":\"${DESCRIPTION}\",\"context\":\"sonarqube/quality-gate\",\"target_url\":\"${TARGET_URL}\"}" \ - "https://api.github.com/repos/splitio/${GITHUB_REPO}/statuses/${COMMIT_SHA}" - - echo "Posted SonarQube quality gate status: ${GH_STATE}" + export PATH="$HOME/.local/bin:$PATH" + eval "$(mise activate bash)" + VERSION=$(python3 -c "import re; print(re.search(r'version\s*=\s*[\"\\']([^\"\\']+)[\"\\']', open('setup.py').read()).group(1))") + echo "Detected version: $VERSION" + export SONAR_SCANNER_VERSION=5.0.1.3006 + curl -sSLo sonar-scanner.zip \ + "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip" + unzip -q sonar-scanner.zip + export PATH="$PWD/sonar-scanner-${SONAR_SCANNER_VERSION}-linux/bin:$PATH" + apt-get install -y openjdk-17-jdk -qq + sonar-scanner \ + -Dsonar.projectKey=split-openfeature-provider-python \ + -Dsonar.sources=split_openfeature_provider \ + -Dsonar.tests=tests \ + -Dsonar.host.url=https://sonar.harness.io \ + -Dsonar.token=<+secrets.getValue("sonarqube-token")> \ + -Dsonar.python.coverage.reportPaths=coverage.xml \ + -Dsonar.projectVersion=$VERSION \ + -Dsonar.pullrequest.key=<+codebase.prNumber> \ + -Dsonar.pullrequest.branch=<+codebase.sourceBranch> \ + -Dsonar.pullrequest.base=<+codebase.targetBranch> strategy: matrix: pythonVersion: From 6eefa9922834e5fbd5c9968814e7bb86b3cfbce4 Mon Sep 17 00:00:00 2001 From: Mauro Sanz Date: Tue, 28 Jul 2026 19:33:50 +0000 Subject: [PATCH 04/10] Harness.io Git Commit --- .../splitopenfeatureproviderpythoninputset2.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset2.yaml diff --git a/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset2.yaml b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset2.yaml new file mode 100644 index 0000000..3e507a6 --- /dev/null +++ b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpythoninputset2.yaml @@ -0,0 +1,14 @@ +inputSet: + name: splitopenfeatureproviderpyinputset + identifier: splitopenfeatureproviderpyinputset + orgIdentifier: PROD + projectIdentifier: Harness_Split + pipeline: + identifier: splitopenfeatureproviderpy + properties: + ci: + codebase: + build: + type: PR + spec: + number: <+trigger.prNumber> From 0d0442721818f055f22cfd83b2f4b0fe254c6e05 Mon Sep 17 00:00:00 2001 From: Mauro Sanz Date: Tue, 28 Jul 2026 19:59:06 +0000 Subject: [PATCH 05/10] Harness.io Git Commit --- .../splitopenfeatureproviderpyinputset.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpyinputset.yaml diff --git a/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpyinputset.yaml b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpyinputset.yaml new file mode 100644 index 0000000..3e507a6 --- /dev/null +++ b/.harness/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/input_sets/splitopenfeatureproviderpyinputset.yaml @@ -0,0 +1,14 @@ +inputSet: + name: splitopenfeatureproviderpyinputset + identifier: splitopenfeatureproviderpyinputset + orgIdentifier: PROD + projectIdentifier: Harness_Split + pipeline: + identifier: splitopenfeatureproviderpy + properties: + ci: + codebase: + build: + type: PR + spec: + number: <+trigger.prNumber> From a39e5d41d3b6e1e16ff47a14759b86af1370a994 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 17:06:34 -0300 Subject: [PATCH 06/10] ci: disable mise GitHub attestation check for python install mise 2026.7.15 verifies GitHub artifact attestations by default, which fails for this python@3.9.13 build (no attestations published for it). AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .harness/pipeline.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml index cf9f5a1..0b25b17 100644 --- a/.harness/pipeline.yaml +++ b/.harness/pipeline.yaml @@ -39,6 +39,7 @@ pipeline: command: |- curl https://mise.run | sh export PATH="$HOME/.local/bin:$PATH" + export MISE_PYTHON_GITHUB_ATTESTATIONS=false mise use --global python@<+matrix.pythonVersion> eval "$(mise activate bash)" python --version From d385ca9a5f4a2d7979b7a418ef8e48b7fa501806 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 17:10:21 -0300 Subject: [PATCH 07/10] ci: run pytest from tests/ dir and upgrade pip tooling before install Matches the original GitHub Actions workflow: pytest runs with working-directory: tests, and pip/setuptools/wheel are upgraded before installing the package. AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .harness/pipeline.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml index 0b25b17..b70e70d 100644 --- a/.harness/pipeline.yaml +++ b/.harness/pipeline.yaml @@ -53,6 +53,7 @@ pipeline: command: |- export PATH="$HOME/.local/bin:$PATH" eval "$(mise activate bash)" + pip install -U setuptools pip wheel pip install -e . pip install -r requirements-dev.txt - step: @@ -64,7 +65,7 @@ pipeline: command: |- export PATH="$HOME/.local/bin:$PATH" eval "$(mise activate bash)" - cd split_openfeature_provider + cd tests pytest -v --cov=split_openfeature_provider --cov-report=xml:../coverage.xml - step: type: Run From 1aa3635bb0582db18fb261c4d5974e14296dfa22 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 17:12:38 -0300 Subject: [PATCH 08/10] ci: use Bash shell for SonarQube steps sh does not support the process-substitution syntax used by eval "\$(mise activate bash)", causing "eval: Syntax error" failures. AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .harness/pipeline.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.harness/pipeline.yaml b/.harness/pipeline.yaml index b70e70d..8947bdd 100644 --- a/.harness/pipeline.yaml +++ b/.harness/pipeline.yaml @@ -75,7 +75,7 @@ pipeline: stageStatus: Success condition: <+matrix.pythonVersion> == "3.9.13" && <+codebase.build.type> == "branch" spec: - shell: Sh + shell: Bash command: |- export PATH="$HOME/.local/bin:$PATH" eval "$(mise activate bash)" @@ -104,7 +104,7 @@ pipeline: stageStatus: Success condition: <+matrix.pythonVersion> == "3.9.13" && <+codebase.build.type> == "PR" spec: - shell: Sh + shell: Bash command: |- export PATH="$HOME/.local/bin:$PATH" eval "$(mise activate bash)" From bc349508e3c90e08b239858010c05e7f9013372e Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 17:15:38 -0300 Subject: [PATCH 09/10] ci: add Harness migration report for split-openfeature-provider-python AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .harness/migration/report-2026-07-28.md | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .harness/migration/report-2026-07-28.md diff --git a/.harness/migration/report-2026-07-28.md b/.harness/migration/report-2026-07-28.md new file mode 100644 index 0000000..86b6b92 --- /dev/null +++ b/.harness/migration/report-2026-07-28.md @@ -0,0 +1,26 @@ +## Harness Migration Report — 2026-07-28 + +**Repo:** splitio/split-openfeature-provider-python +**Language:** Python (versions: 3.9.13) +**Status:** ✅ PASSED + +### Steps +| Step | Result | Notes | +|------|--------|-------| +| Detect context | ✅ | Python, split-openfeature-provider-python | +| Read GH workflow | ✅ | .github/workflows/ci.yml | +| Generate Harness YAML | ✅ | Adapted from ruby-client reference pipeline | +| Write pipeline file | ✅ | .harness/pipeline.yaml | +| Create pipeline in Harness | ✅ | imported from Git | +| Create input set | ✅ | splitopenfeatureproviderpyinputset | +| Create webhook trigger | ✅ | splitopenfeatureproviderpython, GitHub PR webhook | +| Dry-run | ✅ | https://harness0.harness.io/ng/account/l7B_kbSEQD2wjrM7PShm5w/all/orgs/PROD/projects/Harness_Split/pipelines/splitopenfeatureproviderpy/deployments/YIwqFMr6QNuul5wUD6kZtA/pipeline | + +**Pipeline is working. PR opened targeting development.** + +### Fixes applied during migration +- Pipeline codebase `build` changed to `<+input>` (was fixed to `type: branch`) so PR-type input sets/triggers can override it. +- Disabled mise's GitHub attestation check (`MISE_PYTHON_GITHUB_ATTESTATIONS=false`) — no attestations are published for python@3.9.13. +- Run tests from `tests/` (matches the original workflow's `working-directory: tests`), not `split_openfeature_provider/`. +- Upgraded `pip`/`setuptools`/`wheel` before install, matching the original workflow. +- Switched SonarQube steps from `shell: Sh` to `shell: Bash` — `eval "$(mise activate bash)"` requires bash, not POSIX sh. From da0dc38bfae1d59abd5931046640797a84384f73 Mon Sep 17 00:00:00 2001 From: Mauro Antonio Sanz Date: Tue, 28 Jul 2026 17:22:29 -0300 Subject: [PATCH 10/10] ci: remove GitHub Actions workflow in favor of Harness pipeline AI-Session-Id: aa03f266-2bde-44a7-8910-7c13a606b4cf AI-Tool: claude-code AI-Model: unknown --- .github/workflows/CODEOWNERS | 1 - .github/workflows/ci.yml | 70 ------------------------------------ 2 files changed, 71 deletions(-) delete mode 100644 .github/workflows/CODEOWNERS delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/CODEOWNERS b/.github/workflows/CODEOWNERS deleted file mode 100644 index 9e31981..0000000 --- a/.github/workflows/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @splitio/sdk diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index ae4966e..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: ci - -on: - push: - branches: - - main - - development - pull_request: - branches: - - main - - development - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number }} - cancel-in-progress: true - -jobs: - test: - name: Test - runs-on: ubuntu-24.04 - steps: - - name: Checkout code - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Setup Python - uses: actions/setup-python@v6 - with: - python-version: '3.9.13' - - - name: Install dependencies - run: | - pip install -U setuptools pip wheel - pip install -e . - pip install -r requirements-dev.txt - - - name: Run tests with coverage - working-directory: tests - run: pytest -v --cov=split_openfeature_provider --cov-report=xml:../coverage.xml - - - name: Set VERSION env - run: echo "VERSION=$(cat setup.py | grep "version=" | cut -d'"' -f2)" >> $GITHUB_ENV - - - name: SonarQube Scan (Push) - if: github.event_name == 'push' - uses: SonarSource/sonarqube-scan-action@v6 - env: - SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - projectBaseDir: . - args: > - -Dsonar.host.url=${{ vars.SONARQUBE_HOST }} - -Dsonar.projectVersion=${{ env.VERSION }} - - - name: SonarQube Scan (Pull Request) - if: github.event_name == 'pull_request' - uses: SonarSource/sonarqube-scan-action@v6 - env: - SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - projectBaseDir: . - args: > - -Dsonar.host.url=${{ vars.SONARQUBE_HOST }} - -Dsonar.projectVersion=${{ env.VERSION }} - -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} - -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} - -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}