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
136 changes: 136 additions & 0 deletions .harness/orgs/PROD/projects/Harness_Split/pipelines/go_toolkit_ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
pipeline:
name: go_toolkit_ci
identifier: go_toolkit_ci
projectIdentifier: Harness_Split
orgIdentifier: PROD
tags: {}
properties:
ci:
codebase:
connectorRef: fmegithubrunnersci
repoName: go-toolkit
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.18
shell: Bash
# Tests connect to localhost:6379. Harness Cloud Background steps run
# in a separate container (not localhost). Run redis-server inside this
# container so tests share the real localhost — matches GHA `services:`.
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.18
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}" \
-Dsonar.projectName=go-toolkit \
-Dsonar.projectKey=go-toolkit \
-Dsonar.exclusions='**/*_test.go,**/vendor/**,**/testdata/*' \
-Dsonar.go.coverage.reportPaths=coverage.out \
-Dsonar.links.ci="https://github.com/splitio/go-toolkit/actions" \
-Dsonar.links.scm="https://github.com/splitio/go-toolkit" \
${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.18
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-toolkit/statuses/<+codebase.commitSha>" \
-d "{\"state\":\"${GH_STATE}\",\"description\":\"${DESC}\",\"context\":\"sonarqube/quality-gate\",\"target_url\":\"https://sonar.harness.io/dashboard?id=go-toolkit\"}"
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_toolkit_ci_pr
identifier: go_toolkit_ci_pr
orgIdentifier: PROD
projectIdentifier: Harness_Split
pipeline:
identifier: go_toolkit_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_toolkit_ci_push
identifier: go_toolkit_ci_push
orgIdentifier: PROD
projectIdentifier: Harness_Split
pipeline:
identifier: go_toolkit_ci
properties:
ci:
codebase:
build:
type: branch
spec:
branch: <+trigger.branch>
6 changes: 6 additions & 0 deletions sonar-project.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
sonar.projectKey=go-toolkit
sonar.projectName=go-toolkit
sonar.exclusions=**/*_test.go,**/vendor/**,**/testdata/*
sonar.go.coverage.reportPaths=coverage.out
sonar.links.ci=https://github.com/splitio/go-toolkit/actions
sonar.links.scm=https://github.com/splitio/go-toolkit
2 changes: 1 addition & 1 deletion sse/sse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func TestSSE(t *testing.T) {

fmt.Fprintf(w, "data: %s\n\n", `{"id":"YCh53QfLxO:0:0","data":"some","timestamp":1591911770828}`)
flusher.Flush()
time.Sleep(2 * time.Second)
time.Sleep(5 * time.Second)
}))
defer ts.Close()

Expand Down
Loading