Skip to content

Commit 2545a27

Browse files
committed
SONAR-23970 Add conditions to CI
1 parent de6aa35 commit 2545a27

13 files changed

+415
-294
lines changed

.cirrus.star

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
load("github.com/SonarSource/cirrus-modules@v3", "load_features")
22
load("cirrus", "env", "fs", "yaml")
3+
load(".cirrus/tasks.star", "build_tasks")
4+
35

46
def main(ctx):
5-
return yaml.dumps(load_features(ctx)) + fs.read(".cirrus/tasks.yml")
7+
tasks = build_tasks(ctx)
8+
return yaml.dumps(load_features(ctx)) + tasks

.cirrus/package.sh

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,33 @@ set -xeuo pipefail
66
: "${BUILD_NUMBER:?}"
77
: "${CIRRUS_BASE_BRANCH:=}"
88

9-
[[ -n "${CIRRUS_BASE_BRANCH}" ]] && TARGET_BRANCH="${CIRRUS_BASE_BRANCH}" || TARGET_BRANCH="${CIRRUS_BRANCH}"
9+
if [[ -n "${CIRRUS_BASE_BRANCH}" ]]; then
10+
TARGET_BRANCH="${CIRRUS_BASE_BRANCH}"
11+
else
12+
TARGET_BRANCH="${CIRRUS_BRANCH}"
13+
fi
1014

1115
PREVIOUS_RELEASE=$(gh api "/repos/{owner}/{repo}/releases" --jq "[.[] | select(.target_commitish==\"${TARGET_BRANCH}\")][1].tag_name")
1216

13-
[[ -z "${PREVIOUS_RELEASE}" ]] && CHARTS=("charts/sonarqube-dce" "charts/sonarqube") || CHARTS=$(ct list-changed --since "${PREVIOUS_RELEASE}" --target-branch "${TARGET_BRANCH}")
17+
if [[ -z "${PREVIOUS_RELEASE}" ]]; then
18+
CHARTS=("charts/sonarqube-dce" "charts/sonarqube")
19+
else
20+
# shellcheck disable=SC2178 # This will output a string, we will use it only in the for-loop, which will split it
21+
CHARTS=$(ct list-changed --since "${PREVIOUS_RELEASE}" --target-branch "${TARGET_BRANCH}")
22+
fi
23+
24+
# If there is a $1 argument, and it is contained in the CHARTS array, then we will only package that chart
25+
ARG_CHART_NAME=${1:+charts/$1}
26+
if [[ -n "${ARG_CHART_NAME}" ]] && [[ "${CHARTS[*]}" =~ ${ARG_CHART_NAME} ]]; then
27+
CHARTS=("${ARG_CHART_NAME}")
28+
fi
1429

1530
BUILD_METADATA="-${BUILD_NUMBER}"
1631
[[ ${CIRRUS_RELEASE:-} != "" ]] && BUILD_METADATA=""
1732

1833
echo "${CHARTS[@]}"
1934

35+
# shellcheck disable=SC2068 # Because ct list-changed will return a string, we want the potential split here
2036
for chart in ${CHARTS[@]}; do
2137
_original_version=$(yq '.version' "${chart}"/Chart.yaml)
2238
_new_version="${_original_version}${BUILD_METADATA}"

.cirrus/sign_chart.sh

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
1-
#!/bin/sh
1+
#!/bin/bash
22

33
set -euo pipefail
44

5-
echo $SONARSOURCE_SIGN_KEY_PASSPHRASE | gpg --batch --yes --passphrase-fd 0 --import /tmp/key
5+
: "${SONARSOURCE_SIGN_KEY:?}"
6+
: "${SONARSOURCE_SIGN_KEY_ID:?}"
7+
: "${SONARSOURCE_SIGN_KEY_PASSPHRASE:?}"
8+
: "${CIRRUS_WORKING_DIR:?}"
69

7-
CURRENT_DIR=$(pwd)
10+
# If there is a $1 argument, treat it as the chart to sign by looking for $1*.tgz* files
11+
# Otherwise, look for all *.tgz* files in the working directory
12+
CHART_TO_SIGN=${1:-}
13+
NAME_GLOB="*.tgz*"
14+
if [[ -n "${CHART_TO_SIGN}" ]]; then
15+
NAME_GLOB="${CHART_TO_SIGN}-[0-9]*.tgz*"
16+
fi
817

9-
for chart in $(find $CIRRUS_WORKING_DIR -maxdepth 1 -name "*.tgz*" -type f -exec basename "{}" ";"); do
10-
cd $CIRRUS_WORKING_DIR
11-
echo $SONARSOURCE_SIGN_KEY_PASSPHRASE | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --output $chart.asc --detach-sig $chart
12-
cd $CURRENT_DIR
13-
done
18+
find_charts=$(find "${CIRRUS_WORKING_DIR}" -maxdepth 1 -name "${NAME_GLOB}" -type f -exec basename "{}" ";" || exit 1)
19+
20+
CHART_TO_SIGN=()
21+
while IFS= read -r chart; do
22+
CHART_TO_SIGN+=("${chart}")
23+
done <<< "${find_charts}"
24+
25+
if [[ ${#CHART_TO_SIGN[@]} -eq 0 ]]; then
26+
echo "No charts found to sign."
27+
exit 1
28+
fi
29+
30+
# Debugging: Print the charts to be signed
31+
echo "Charts to sign: ${CHART_TO_SIGN[*]}"
32+
33+
echo "${SONARSOURCE_SIGN_KEY_PASSPHRASE}" | gpg --batch --yes --passphrase-fd 0 --import /tmp/key
34+
35+
for chart in "${CHART_TO_SIGN[@]}"; do
36+
echo "Signing ${chart}"
37+
echo "${SONARSOURCE_SIGN_KEY_PASSPHRASE}" | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --output "${chart}.asc" --detach-sig "${chart}"
38+
done

.cirrus/tasks.star

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
load("cirrus", "fs")
2+
3+
4+
def build_tasks(ctx):
5+
tasks_env = fs.read(".cirrus/tasks_env.yml")
6+
tasks_templates = fs.read(".cirrus/tasks_templates.yml")
7+
tasks = fs.read(".cirrus/tasks.yml")
8+
tasks += fs.read(".cirrus/tasks_sonarqube.yml")
9+
tasks += fs.read(".cirrus/tasks_sonarqube_dce.yml")
10+
return tasks_env + tasks_templates + tasks

.cirrus/tasks.yml

Lines changed: 3 additions & 261 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,6 @@
1-
env:
2-
### Shared variables
3-
NIGHTLY_CRON: 'nightly-cron'
4-
DOCKER_USERNAME: VAULT[development/kv/data/docker/sonardockerrw data.username]
5-
DOCKER_PASSWORD: VAULT[development/kv/data/docker/sonardockerrw data.access_token_rwd]
6-
KUBE_VERSION: 1.32.0
7-
DOCKER_GCLOUD_SA_KEY: VAULT[development/team/sonarqube/kv/data/gcp-marketplace-registry-staging data.key]
8-
GCLOUD_REGISTRY: gcr.io/sonarqube-marketplace-provider # This is the staging registry
9-
GCLOUD_PRODUCT_NAME: sonarqube-dce-staging # This is the staging product name
10-
GCLOUD_TAG: 10.8.1
11-
ROSA_OPENSHIFT_URL: VAULT[development/team/sonarqube/kv/data/rosa-openshift data.url]
12-
ROSA_OPENSHIFT_USER: VAULT[development/team/sonarqube/kv/data/rosa-dev data.username]
13-
ROSA_OPENSHIFT_PASSWORD: VAULT[development/team/sonarqube/kv/data/rosa-dev data.password]
14-
15-
16-
17-
except_nightly_cron: &EXCEPT_ON_NIGHTLY_CRON
18-
only_if: $CIRRUS_CRON != $NIGHTLY_CRON
19-
20-
except_external_pr_or_cron: &EXCEPT_ON_PR_OR_CRON
21-
only_if: $CIRRUS_PRERELEASE != "true" && $CIRRUS_PR == "" && $CIRRUS_CRON != $NIGHTLY_CRON
22-
23-
only_on_non_release_draft_template: &ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
24-
only_if: $CIRRUS_PRERELEASE != "true"
25-
26-
docker_build_container_template: &CONTAINER_TEMPLATE
27-
dockerfile: .cirrus/Dockerfile
28-
docker_arguments:
29-
CIRRUS_AWS_ACCOUNT: ${CIRRUS_AWS_ACCOUNT}
30-
cluster_name: ${CIRRUS_CLUSTER_NAME}
31-
builder_role: cirrus-builder
32-
builder_image: docker-builder-v*
33-
builder_instance_type: t2.small
34-
region: eu-central-1
35-
namespace: default
36-
cpu: 1
37-
memory: 1Gb
38-
39-
container_template: &STD_CONTAINER_TEMPLATE
40-
image: ${CIRRUS_AWS_ACCOUNT}.dkr.ecr.eu-central-1.amazonaws.com/base:j11-latest
41-
cluster_name: ${CIRRUS_CLUSTER_NAME}
42-
region: eu-central-1
43-
namespace: default
44-
cpu: 1
45-
memory: 1Gb
46-
47-
vm_instance_template: &VM_TEMPLATE
48-
image: docker-builder-v*
49-
type: t2.xlarge
50-
region: eu-central-1
51-
cpu: 4
52-
memory: 16Gb
53-
54-
clone_script_template: &CLONE_SCRIPT_TEMPLATE
55-
clone_script: |
56-
if [ -z "$CIRRUS_PR" ]; then
57-
git clone --recursive --branch=$CIRRUS_BRANCH https://github.com/${CIRRUS_REPO_FULL_NAME}.git $CIRRUS_WORKING_DIR
58-
git reset --hard $CIRRUS_CHANGE_IN_REPO
59-
else
60-
git clone --recursive https://github.com/${CIRRUS_REPO_FULL_NAME}.git $CIRRUS_WORKING_DIR
61-
git fetch origin pull/$CIRRUS_PR/head:pull/$CIRRUS_PR
62-
git reset --hard $CIRRUS_CHANGE_IN_REPO
63-
fi
64-
65-
build_gcp_app_template: &BUILD_GCP_APP_TEMPLATE
66-
ec2_instance:
67-
<<: *VM_TEMPLATE
68-
login_to_gcr_script:
69-
- export DOCKER_GCLOUD_PASSWORD=$(echo ${DOCKER_GCLOUD_SA_KEY} | base64 -d)
70-
- docker login -u _json_key -p "$DOCKER_GCLOUD_PASSWORD" https://${GCLOUD_REGISTRY}
71-
install_helm_script:
72-
- curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
73-
- chmod 700 get_helm.sh
74-
- ./get_helm.sh
75-
helm_dependency_build_script:
76-
- ./.cirrus/build_chart_dependencies.sh charts/sonarqube-dce
77-
tag_and_promote_script:
78-
- export CURRENT_MINOR_VERSION=$(echo ${GCLOUD_TAG} | cut -d '.' -f 1,2)
79-
- docker build -f google-cloud-marketplace-k8s-app/Dockerfile --build-arg REGISTRY=${GCLOUD_REGISTRY} --build-arg TAG=${GCLOUD_TAG} --tag ${GCLOUD_REGISTRY}/${GCLOUD_PRODUCT_NAME}/deployer:${CURRENT_MINOR_VERSION} .
80-
- docker tag ${GCLOUD_REGISTRY}/${GCLOUD_PRODUCT_NAME}/deployer:${CURRENT_MINOR_VERSION} ${GCLOUD_REGISTRY}/${GCLOUD_PRODUCT_NAME}/deployer:${GCLOUD_TAG}
81-
- docker push ${GCLOUD_REGISTRY}/${GCLOUD_PRODUCT_NAME}/deployer:${GCLOUD_TAG}
82-
- docker push ${GCLOUD_REGISTRY}/${GCLOUD_PRODUCT_NAME}/deployer:${CURRENT_MINOR_VERSION}
83-
84-
build_gcp_staging_app_task:
85-
<<: *BUILD_GCP_APP_TEMPLATE
86-
only_if: $TRIGGER == "PUSH_STAGING_DEPLOYER" || $TRIGGER == "PUSH_PROD_DEPLOYER" || $BRANCH == "master"
87-
env:
88-
GCLOUD_PRODUCT_NAME: sonarqube-dce-staging
89-
90-
verify_gcp_app_template: &VERIFY_GCP_APP_TEMPLATE
91-
only_if: $TRIGGER == "PUSH_STAGING_DEPLOYER" || $BRANCH == "master"
92-
env:
93-
BASE_FOLDER: "/root/.gcp/cache"
94-
PATH: "${BASE_FOLDER}:${BASE_FOLDER}/google-cloud-sdk/bin:${PATH}"
95-
KUBE_CONFIG: "/tmp/kubeconfig"
96-
KUBECONFIG: "${KUBE_CONFIG}"
97-
HOME: "/tmp"
98-
GCLOUD_CLI_VERSION: 495.0.0
99-
MPDEV_VERSION: 0.12.4
100-
gcp_cache:
101-
folder: ${BASE_FOLDER}
102-
fingerprint_script: echo "${GCLOUD_CLI_VERSION}+${MPDEV_VERSION}"
103-
populate_script:
104-
- ./.cirrus/setup.sh
105-
ec2_instance:
106-
<<: *VM_TEMPLATE
107-
login_script:
108-
- echo ${DOCKER_GCLOUD_SA_KEY} | base64 -d > /tmp/key.json
109-
- gcloud auth activate-service-account cirrusciservice@sonarqube-marketplace-provider.iam.gserviceaccount.com --key-file /tmp/key.json --project=sonarqube-marketplace-provider
110-
- gcloud auth configure-docker gcr.io --quiet
111-
- gcloud container clusters get-credentials sonarqube-marketplace-staging-standard --zone=europe-west1-b --project=sonarqube-marketplace-provider
112-
verify_script:
113-
- kubectl get pods
114-
- mpdev verify --deployer=$GCLOUD_REGISTRY/$GCLOUD_PRODUCT_NAME/deployer:$GCLOUD_TAG --wait_timeout=1200 --parameters='{"name":"${GCLOUD_PRODUCT_NAME}-cirrus-test", "namespace":"test-cirrus","ApplicationNodes.jwtSecret":"dZ0EB0KxnF++nr5+4vfTCaun/eWbv6gOoXodiAMqcFo=", "postgresql.enabled":true, "jdbcOverwrite.enabled":false }'
115-
depends_on:
116-
- build_gcp_staging_app
117-
118-
verify_gcp_staging_app_task:
119-
<<: *VERIFY_GCP_APP_TEMPLATE
120-
only_if: $TRIGGER == "PUSH_STAGING_DEPLOYER" || $TRIGGER == "PUSH_PROD_DEPLOYER" || $BRANCH == "master"
121-
env:
122-
GCLOUD_PRODUCT_NAME: sonarqube-dce-staging
123-
depends_on:
124-
- build_gcp_staging_app
125-
126-
chart_static_compatibility_test_task:
127-
<<: *ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
128-
timeout_in: 30m
129-
eks_container:
130-
<<: *CONTAINER_TEMPLATE
131-
cpu: 1
132-
memory: 1Gb
133-
<<: *CLONE_SCRIPT_TEMPLATE
134-
script:
135-
- ./.cirrus/build_chart_dependencies.sh charts/sonarqube
136-
- ./.cirrus/unit_helm_compatibility_test.sh sonarqube
137-
- ./.cirrus/build_chart_dependencies.sh charts/sonarqube-dce
138-
- ./.cirrus/unit_helm_compatibility_test.sh sonarqube-dce
139-
1401
chart_fixture_test_task:
1412
<<: *ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
3+
skip: "!changesInclude('charts/**/*', '.cirrus/*')"
1424
timeout_in: 30m
1435
eks_container:
1446
<<: *CONTAINER_TEMPLATE
@@ -153,6 +15,7 @@ chart_fixture_test_task:
15315

15416
chart_testing_on_kind_task:
15517
<<: *ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
18+
skip: "!changesInclude('charts/**/*', '.cirrus/*')"
15619
timeout_in: 1h
15720
ec2_instance:
15821
<<: *VM_TEMPLATE
@@ -162,7 +25,7 @@ chart_testing_on_kind_task:
16225
- kind create cluster
16326
- kubectl cluster-info --context kind-kind
16427
- kubectl get nodes
165-
- kubectl create namespace test --dry-run=client -o yaml | kubectl apply -f -
28+
- kubectl create namespace test --dry-run=client -o yaml | kubectl apply -f -
16629
- kubectl create secret docker-registry pullsecret --namespace test --docker-username=${DOCKER_USERNAME} --docker-password=${DOCKER_PASSWORD} --dry-run=client -o yaml | kubectl apply -f -
16730
script:
16831
- ct lint --config test.yaml --all
@@ -173,124 +36,3 @@ chart_testing_on_kind_task:
17336
- ah lint
17437
depends_on:
17538
- chart_static_compatibility_test
176-
177-
chart_testing_on_openshift_task:
178-
<<: *ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
179-
timeout_in: 1h
180-
eks_container:
181-
<<: *CONTAINER_TEMPLATE
182-
cpu: 2
183-
memory: 4Gb
184-
authenticate_to_openshift_script:
185-
- ./.cirrus/openshift_auth.sh
186-
matrix:
187-
- name: chart_testing_on_openshift_sonarqube
188-
env:
189-
- VERIFYING_CHART: sonarqube
190-
- name: chart_testing_on_openshift_sonarqube_dce
191-
env:
192-
- VERIFYING_CHART: sonarqube-dce
193-
setup_script:
194-
- oc new-project "${VERIFYING_CHART}" --display-name="Test Project" --description="This is a test project for testing ${VERIFYING_CHART} from Cirrus" || oc project "${VERIFYING_CHART}"
195-
- kubectl create secret docker-registry pullsecret --namespace "${VERIFYING_CHART}" --docker-username=${DOCKER_USERNAME} --docker-password=${DOCKER_PASSWORD} --dry-run=client -o yaml | kubectl apply -f -
196-
- ./.cirrus/build_chart_dependencies.sh charts/"${VERIFYING_CHART}"
197-
- chart-verifier version
198-
script:
199-
- mkdir -p "$(pwd)/report-${VERIFYING_CHART}"
200-
- chart-verifier verify charts/"${VERIFYING_CHART}" --helm-install-timeout 20m -F charts/"${VERIFYING_CHART}"/openshift-verifier/values.yaml -n "${VERIFYING_CHART}" --openshift-version 4.16 > "$(pwd)/report-${VERIFYING_CHART}/report.yaml"
201-
verifier_report_artifacts:
202-
path: "report-*/*.yaml"
203-
check_violations_script:
204-
- cat "report-${VERIFYING_CHART}/report.yaml" | ./.cirrus/verify_openshift.sh
205-
always:
206-
cleanup_script:
207-
- oc delete project "${VERIFYING_CHART}"
208-
depends_on:
209-
- chart_static_compatibility_test
210-
211-
chart_packaging_task:
212-
<<: *ONLY_ON_NON_RELEASE_DRAFT_TEMPLATE
213-
timeout_in: 15m
214-
eks_container:
215-
<<: *CONTAINER_TEMPLATE
216-
cpu: 2
217-
memory: 1Gb
218-
<<: *CLONE_SCRIPT_TEMPLATE
219-
environment_cache:
220-
folder: ${CIRRUS_WORKING_DIR}/*.tgz*
221-
fingerprint_script: echo $CIRRUS_BUILD_ID
222-
env:
223-
GITHUB_TOKEN: VAULT[development/github/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-releases token]
224-
SONARSOURCE_SIGN_KEY: VAULT[development/kv/data/sign data.key]
225-
SONARSOURCE_SIGN_KEY_ID: VAULT[development/kv/data/sign data.key_id]
226-
SONARSOURCE_SIGN_KEY_PASSPHRASE: VAULT[development/kv/data/sign data.passphrase]
227-
key_file:
228-
path: /tmp/key
229-
variable_name: SONARSOURCE_SIGN_KEY
230-
script:
231-
- source cirrus-env BUILD
232-
- helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
233-
- helm repo add bitnami-pre2022 https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
234-
- helm repo update
235-
- ./.cirrus/package.sh
236-
- ./.cirrus/sign_chart.sh
237-
depends_on:
238-
- chart_testing_on_kind
239-
- chart_testing_on_openshift_sonarqube
240-
- chart_testing_on_openshift_sonarqube_dce
241-
242-
push_to_repox_task:
243-
<<: *EXCEPT_ON_PR_OR_CRON
244-
timeout_in: 15m
245-
eks_container:
246-
<<: *STD_CONTAINER_TEMPLATE
247-
cpu: 1
248-
memory: 1Gb
249-
<<: *CLONE_SCRIPT_TEMPLATE
250-
environment_cache:
251-
folder: ${CIRRUS_WORKING_DIR}/*.tgz*
252-
fingerprint_script: echo $CIRRUS_BUILD_ID
253-
env:
254-
ARTIFACTORY_URL: VAULT[development/kv/data/repox data.url]
255-
ARTIFACTORY_ACCESS_TOKEN: VAULT[development/artifactory/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-qa-deployer access_token]
256-
script:
257-
- source cirrus-env ""
258-
- ./.cirrus/upload_chart.sh
259-
depends_on:
260-
- chart_packaging
261-
262-
trigger_release_task:
263-
timeout_in: 15m
264-
eks_container:
265-
<<: *STD_CONTAINER_TEMPLATE
266-
cpu: 1
267-
memory: 1Gb
268-
only_if: $CIRRUS_PRERELEASE != "true" && $CIRRUS_RELEASE != ""
269-
<<: *CLONE_SCRIPT_TEMPLATE
270-
stateful: 'true'
271-
environment_cache:
272-
folder: ${CIRRUS_WORKING_DIR}/*.tgz*
273-
fingerprint_script: echo $CIRRUS_BUILD_ID
274-
env:
275-
GITHUB_TOKEN: VAULT[development/github/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-releases token]
276-
SLACK_TOKEN: VAULT[development/kv/data/slack data.token]
277-
gh_action_script: |
278-
source cirrus-env RELEASE
279-
CHARTS=$(find $CIRRUS_WORKING_DIR -maxdepth 1 -name "*.tgz*" -type f -exec basename "{}" ";")
280-
[[ "x$CHARTS" == "x" ]] && exit 0
281-
gh workflow run release.yml -f version=$CIRRUS_TAG -f buildNumber=$BUILD_NUMBER
282-
depends_on:
283-
- chart_packaging
284-
- push_to_repox
285-
on_failure:
286-
slack_notification_script:
287-
- ./.cirrus/slack-notification.sh
288-
289-
release_gcp_prod_app_task:
290-
<<: *BUILD_GCP_APP_TEMPLATE
291-
only_if: $TRIGGER == "PUSH_PROD_DEPLOYER"
292-
env:
293-
GCLOUD_REGISTRY: gcr.io/sonarsource-public
294-
GCLOUD_PRODUCT_NAME: official-sonarqube-data-center-edition
295-
depends_on:
296-
- verify_gcp_staging_app

0 commit comments

Comments
 (0)