Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/CODEOWNERS

This file was deleted.

10 changes: 0 additions & 10 deletions .github/dependabot.yaml

This file was deleted.

11 changes: 0 additions & 11 deletions .github/pull_request_template.md

This file was deleted.

59 changes: 0 additions & 59 deletions .github/workflows/ci.yml

This file was deleted.

45 changes: 0 additions & 45 deletions .github/workflows/update-license-year.yml

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
pipeline:
name: go_split_commons_ci
identifier: go_split_commons_ci
projectIdentifier: Harness_Split
orgIdentifier: PROD
tags: {}
properties:
ci:
codebase:
connectorRef: fmegithubrunnersci
repoName: go-split-commons
build: <+input>
depth: 0
stages:
- stage:
name: CI
identifier: CI
type: CI
spec:
cloneCodebase: true
caching:
enabled: true
platform:
os: Linux
arch: Amd64
runtime:
type: Cloud
spec:
size: flex
execution:
steps:
- step:
identifier: test
name: Run tests
type: Run
spec:
connectorRef: dockerhub
image: golang:1.21
shell: Bash
# Redis tests hardcode localhost:6379 and do not skip on failure.
# A Harness Cloud Background step runs in a separate container (not
# localhost). Fix: run redis-server inside this container so it shares
# the real localhost, matching GHA `services:` behavior.
command: |-
apt-get update -qq && apt-get install -y -qq --no-install-recommends redis-server
redis-server --daemonize yes
for i in $(seq 1 30); do
redis-cli ping 2>/dev/null | grep -q PONG && { echo "Redis is up"; break; }
echo "Waiting for Redis... ($i/30)"; sleep 1
done
go mod tidy
go test -coverprofile=coverage.out -count=1 -race ./...
- step:
identifier: sonarqube_analysis
name: SonarQube Analysis
type: Run
spec:
connectorRef: dockerhub
image: golang:1.21
shell: Bash
command: |-
apt-get update -qq && apt-get install -y -qq --no-install-recommends unzip
export SONAR_SCANNER_VERSION=6.2.1.4610
curl -sSLo sonar-scanner.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip"
unzip -q sonar-scanner.zip
export PATH="$(pwd)/sonar-scanner-${SONAR_SCANNER_VERSION}-linux-x64/bin:$PATH"

SONAR_EXTRA_ARGS=""
if [ "<+codebase.build.type>" = "PR" ]; then
SONAR_EXTRA_ARGS="-Dsonar.pullrequest.key=<+codebase.prNumber> \
-Dsonar.pullrequest.branch=<+codebase.sourceBranch> \
-Dsonar.pullrequest.base=<+codebase.targetBranch>"
elif [ "<+codebase.branch>" != "main" ]; then
SONAR_EXTRA_ARGS="-Dsonar.branch.name=<+codebase.branch>"
fi

sonar-scanner \
-Dsonar.host.url="https://sonar.harness.io/" \
-Dsonar.token="${SONAR_TOKEN}" \
${SONAR_EXTRA_ARGS}
envVariables:
SONAR_TOKEN: <+secrets.getValue("sonarqube-token")>
- step:
identifier: post_quality_gate
name: Post Quality Gate
type: Run
spec:
connectorRef: dockerhub
image: golang:1.21
shell: Bash
command: |-
REPORT_FILE=".scannerwork/report-task.txt"
if [ ! -f "$REPORT_FILE" ]; then
echo "ERROR: $REPORT_FILE not found."
exit 1
fi
CE_TASK_URL=$(grep "ceTaskUrl" "$REPORT_FILE" | cut -d'=' -f2-)

MAX_RETRIES=30; RETRY_INTERVAL=10; TASK_STATUS="PENDING"
for i in $(seq 1 $MAX_RETRIES); do
echo "Attempt $i/$MAX_RETRIES - checking analysis task..."
TASK_RESPONSE=$(curl -s -u "${SONAR_TOKEN}:" "$CE_TASK_URL")
TASK_STATUS=$(echo "$TASK_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['task']['status'])" 2>/dev/null || echo "UNKNOWN")
echo "Task status: $TASK_STATUS"
[ "$TASK_STATUS" = "SUCCESS" ] || [ "$TASK_STATUS" = "FAILED" ] || [ "$TASK_STATUS" = "CANCELLED" ] && break
sleep $RETRY_INTERVAL
done
if [ "$TASK_STATUS" != "SUCCESS" ]; then
echo "Analysis task did not complete: $TASK_STATUS"; exit 1
fi

ANALYSIS_ID=$(echo "$TASK_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['task']['analysisId'])")
QG_RESPONSE=$(curl -s -u "${SONAR_TOKEN}:" "https://sonar.harness.io/api/qualitygates/project_status?analysisId=${ANALYSIS_ID}")
QG_STATUS=$(echo "$QG_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['projectStatus']['status'])")
echo "Quality Gate Status: $QG_STATUS"

case "$QG_STATUS" in
OK) GH_STATE="success"; DESC="Quality gate passed" ;;
ERROR) GH_STATE="failure"; DESC="Quality gate failed" ;;
WARN) GH_STATE="success"; DESC="Quality gate passed with warnings" ;;
*) GH_STATE="failure"; DESC="Quality gate status: $QG_STATUS" ;;
esac

curl -s -X POST \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/splitio/go-split-commons/statuses/<+codebase.commitSha>" \
-d "{\"state\":\"${GH_STATE}\",\"description\":\"${DESC}\",\"context\":\"sonarqube/quality-gate\",\"target_url\":\"https://sonar.harness.io/dashboard?id=go-split-commons\"}"
envVariables:
SONAR_TOKEN: <+secrets.getValue("sonarqube-token")>
GITHUB_TOKEN: <+secrets.getValue("fme-github-netrc-token")>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
inputSet:
name: go_split_commons_ci_pr
identifier: go_split_commons_ci_pr
orgIdentifier: PROD
projectIdentifier: Harness_Split
pipeline:
identifier: go_split_commons_ci
properties:
ci:
codebase:
build:
type: PR
spec:
number: <+trigger.prNumber>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
inputSet:
name: go_split_commons_ci_push
identifier: go_split_commons_ci_push
orgIdentifier: PROD
projectIdentifier: Harness_Split
pipeline:
identifier: go_split_commons_ci
properties:
ci:
codebase:
build:
type: branch
spec:
branch: <+trigger.branch>