diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 184beb3..1f671cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,11 +17,15 @@ jobs: - uses: actions/checkout@v4 - name: Install dependencies run: | - sudo apt install -y bats + sudo apt install -y bats python3 - name: Test with Bats shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: | cd tests + python3 -m http.server --bind 127.0.0.1 --directory ${GITHUB_WORKSPACE}/tests/mock & + sleep 1 # wait for server start + export BASE_URL="http://127.0.0.1:8000" + curl -v "$BASE_URL/" bats -t . diff --git a/bin/jenkinsOp.sh b/bin/jenkinsOp.sh index db7bbe6..b0db7b1 100755 --- a/bin/jenkinsOp.sh +++ b/bin/jenkinsOp.sh @@ -3,14 +3,16 @@ SELECT=$1 JOB=core_ci -if [ ! -z "$3" ] - then - JOB=$3 +if [ ! -z "$3" ]; then + JOB=$3 fi JENKINS="jenkins.ivyteam.io" -URL="https://${JENKINS}/job/${JOB}/" +if [ -z "${BASE_URL}" ]; then + BASE_URL="https://${JENKINS}/" +fi DIR="$( cd "$( dirname "$BASH_SOURCE" )" && pwd )" +echo "working with ${BASE_URL}" ENV="$DIR/.env" if [ -f $ENV ]; then @@ -29,14 +31,14 @@ if ! [ -x "$(command -v curl)" ]; then fi getAvailableBranches(){ - local JSON=$(curl -sS "${URL}/api/json?tree=jobs\[name\]") + local JSON=$(curl -sS "${BASE_URL}/job/${JOB}/api/json?tree=jobs\[name\]") local BRANCHES="$(jsonField "${JSON}" "name" \ | sed -e 's|%2F|/|' )" echo ${BRANCHES} } getAvailableTestJobs(){ - local JSON=$(curl -sS "https://$JENKINS/api/json?tree=jobs\[name\]") + local JSON=$(curl -sS "${BASE_URL}/api/json?tree=jobs\[name\]") local JOBS="$(jsonField "$JSON" "name" \ | grep 'core_product\|core_test\|core_ci\|core_json-schema' \ | sed -e 's|%2F|/|' )" @@ -46,7 +48,7 @@ getAvailableTestJobs(){ getHealth(){ JOB="$1" BRANCH="$2" - API_URI="https://${JENKINS}/job/${JOB}/job/${BRANCH}/api/json?tree=color" + API_URI="${BASE_URL}/job/${JOB}/job/${BRANCH}/api/json?tree=color" JSON=$(curl -sS "${API_URI}") COLOR=$(jsonField "${JSON}" "color") colorToEmo $COLOR @@ -95,13 +97,13 @@ triggerBuild(){ RUN_JOB=$1 BRANCH=$2 - JOB_URL="https://$JENKINS/job/${RUN_JOB}/job/${BRANCH}" + JOB_URL="${BASE_URL}/job/${RUN_JOB}/job/${BRANCH}" RESPONSE=$( requestBuild ${JOB_URL} ) echo -e "[ $( statusColor ${RESPONSE} ) ] @ $JOB_URL" if [ "$RESPONSE" == 404 ] || [ "$RESPONSE" == 409 ] ; then # job may requires a manual rescan to expose our new branch | isolate in sub bash to avoid conflicts! - SCANNED=$( rescanBranches "https://$JENKINS/job/$RUN_JOB/" 3>&1 1>&2 2>&3 ) + SCANNED=$( rescanBranches "${BASE_URL}/job/$RUN_JOB/" 3>&1 1>&2 2>&3 ) # re-try RESPONSE=$( requestBuild ${JOB_URL} ) echo -e "[ $( statusColor ${RESPONSE} ) ] @ $JOB_URL" @@ -121,7 +123,7 @@ requestBuild(){ # get XSS preventention token if [ -z ${CRUMB+x} ]; then - ISSUER_URI="https://${JENKINS}/crumbIssuer/api/xml" + ISSUER_URI="${BASE_URL}/crumbIssuer/api/xml" CRUMB=$(curl -sS --basic -u "${JENKINS_USER}:${JENKINS_TOKEN}" "$ISSUER_URI") \ | grep -o -E '"crumb":"[^"]*' | sed -e 's|"crumb":"||' export CRUMB="$CRUMB" #re-use for follow up requests @@ -164,7 +166,7 @@ createView(){ BRANCH=$1 BRANCH_NAME=$( echo $BRANCH | sed -e 's|/|_|') ISSUE_REGEX=$( echo ".*${BRANCH}" | sed -e 's|.*/|\.*|' ) - MYVIEWS_URL="https://$JENKINS/user/${JENKINS_USER}/my-views" + MYVIEWS_URL="${BASE_URL}/user/${JENKINS_USER}/my-views" curl -sS -k -X POST -u "$JENKINS_USER:$JENKINS_TOKEN" -H "$CRUMB" \ --form name="${BRANCH_NAME}" --form mode=hudson.model.ListView \ --form json="{'name': '${BRANCH_NAME}', 'mode': 'hudson.model.ListView', 'useincluderegex': 'on', 'includeRegex': '${ISSUE_REGEX}', 'recurse': 'true'}" \ diff --git a/tests/jenkins_test.bats b/tests/jenkins_test.bats index 2af61bb..bc6b8a2 100644 --- a/tests/jenkins_test.bats +++ b/tests/jenkins_test.bats @@ -15,7 +15,6 @@ setup(){ } @test "loadBranches" { - skip "http" branches=$(getAvailableBranches) [[ " ${branches[@]} " =~ "master" ]] # contains master } @@ -29,7 +28,7 @@ setup(){ } @test "connectability" { - URL="http://jenkins.ivyteam.oblivion" + BASE_URL="http://jenkins.ivyteam.oblivion" rm -f /tmp/stderr getAvailableBranches 2> /tmp/stderr grep "Could not resolve host" /tmp/stderr diff --git a/tests/mock/job/core_ci/api/json b/tests/mock/job/core_ci/api/json new file mode 100644 index 0000000..a6ef6f8 --- /dev/null +++ b/tests/mock/job/core_ci/api/json @@ -0,0 +1,42 @@ +{"_class":"org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject", + "jobs":[ + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"PR-4741"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"PR-5076"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"PR-5287"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"PR-5412"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"PR-5435"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"XIVY-11800-zRemove"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"XIVY-13150%2Ffix-button"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"XIVY-13553_primefaces_update"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"XIVY-13553_primefaces_update_130"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"XIVY-13635-pjson-113"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"basicAuthLogs"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"coolstuff%2Fclassfile"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"coolstuff%2Fhealthcheck"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"crypto"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"crypto-base64"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"dev10.0"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"dev11.1"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"dev11.2"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"eclipse-2023-12"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"es-escape-whitspaces"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"exclude-CVE-2024-28752"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"java21"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"mail-semaphore"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"master"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"maven-mirror.ivyteam.io"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"priority"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"public-api-jar"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"public-api-jar-rule"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"r8-ticket-3999"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F10.0"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F11.2"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F8.0"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F9.1"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F9.2"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F9.3"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"release%2F9.4"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"snakeyaml-rexport"}, + {"_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob","name":"test_cluster_slave"} + ] +} \ No newline at end of file