Skip to content

Commit 4a499bd

Browse files
committed
ci: add Jenkins PR workflow
1 parent 095c3a8 commit 4a499bd

2 files changed

Lines changed: 214 additions & 0 deletions

File tree

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Build Pull Request Jenkins
2+
3+
on:
4+
pull_request:
5+
paths-ignore:
6+
- '.github/**'
7+
- 'docs/**'
8+
- '!.github/workflows/**'
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
12+
cancel-in-progress: true
13+
14+
permissions:
15+
contents: read
16+
pull-requests: read
17+
18+
jobs:
19+
jenkins-ci-docker:
20+
runs-on: ubuntu-latest
21+
env:
22+
JENKINS_URL: ${{ vars.JENKINS_URL || 'https://starjenkins.sdcc.bnl.gov' }}
23+
JENKINS_JOB: ${{ vars.JENKINS_JOB || 'star-sw-ci-pipeline' }}
24+
JENKINS_USER: ${{ secrets.JENKINS_USER }}
25+
JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }}
26+
BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
27+
GIT_COMMIT: ${{ github.event.pull_request.head.sha }}
28+
REPO_URL: ${{ github.event.pull_request.head.repo.clone_url }}
29+
steps:
30+
- name: Validate Jenkins configuration
31+
run: |
32+
set -euo pipefail
33+
for var in JENKINS_URL JENKINS_JOB JENKINS_USER JENKINS_TOKEN BRANCH_NAME GIT_COMMIT REPO_URL; do
34+
if [ -z "${!var:-}" ]; then
35+
echo "::error::Missing required value for ${var}"
36+
exit 1
37+
fi
38+
done
39+
40+
- name: Fetch Jenkins crumb
41+
id: crumb
42+
run: |
43+
set -euo pipefail
44+
curl_auth="${JENKINS_USER}:${JENKINS_TOKEN}"
45+
crumb="$(curl --silent --show-error --fail --retry 3 --retry-all-errors --user "$curl_auth" \
46+
"${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")"
47+
echo "::add-mask::$crumb"
48+
echo "value=$crumb" >> "$GITHUB_OUTPUT"
49+
50+
- name: Trigger Jenkins docker job
51+
env:
52+
JENKINS_CRUMB: ${{ steps.crumb.outputs.value }}
53+
run: |
54+
set -euo pipefail
55+
curl_auth="${JENKINS_USER}:${JENKINS_TOKEN}"
56+
response_headers="$(mktemp)"
57+
58+
curl --silent --show-error --fail \
59+
--request POST \
60+
--retry 3 \
61+
--retry-all-errors \
62+
--user "$curl_auth" \
63+
--header "$JENKINS_CRUMB" \
64+
--data-urlencode "BRANCH_NAME=${BRANCH_NAME}" \
65+
--data-urlencode "GIT_COMMIT=${GIT_COMMIT}" \
66+
--data-urlencode "REPO_URL=${REPO_URL}" \
67+
--dump-header "$response_headers" \
68+
--output /dev/null \
69+
"${JENKINS_URL}/job/${JENKINS_JOB}/buildWithParameters"
70+
71+
queue_url="$(awk 'BEGIN {IGNORECASE=1} /^Location:/ {print $2}' "$response_headers" | tr -d '\r')"
72+
73+
echo "Triggered Jenkins job ${JENKINS_JOB} for ${BRANCH_NAME}@${GIT_COMMIT}"
74+
if [ -n "$queue_url" ]; then
75+
echo "Queue item: ${queue_url}"
76+
{
77+
echo "### Jenkins Triggered"
78+
echo
79+
echo "- Job: \`${JENKINS_JOB}\`"
80+
echo "- Branch: \`${BRANCH_NAME}\`"
81+
echo "- Commit: \`${GIT_COMMIT}\`"
82+
echo "- Queue item: ${queue_url}"
83+
} >> "$GITHUB_STEP_SUMMARY"
84+
fi

Jenkinsfile

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
pipeline {
2+
agent any
3+
4+
options {
5+
timestamps()
6+
}
7+
8+
parameters {
9+
string(name: 'BRANCH_NAME', defaultValue: 'main', description: 'Branch to build')
10+
string(name: 'GIT_COMMIT', defaultValue: '', description: 'Commit SHA to build, optional')
11+
string(name: 'REPO_URL', defaultValue: 'https://github.com/plexoos/jenkins-ci.git', description: 'Repository URL')
12+
}
13+
14+
environment {
15+
TEST_IMAGE = 'ghcr.io/star-bnl/star-spack:v0.3.0-root5-gcc485'
16+
}
17+
18+
stages {
19+
stage('Checkout') {
20+
steps {
21+
echo "PARAM_BRANCH_NAME=${params.BRANCH_NAME}"
22+
echo "PARAM_GIT_COMMIT=${params.GIT_COMMIT}"
23+
echo "PARAM_REPO_URL=${params.REPO_URL}"
24+
echo "JOB_NAME=${env.JOB_NAME}"
25+
echo "BUILD_NUMBER=${env.BUILD_NUMBER}"
26+
echo "BUILD_URL=${env.BUILD_URL}"
27+
echo "NODE_NAME=${env.NODE_NAME}"
28+
echo "WORKSPACE=${env.WORKSPACE}"
29+
echo "GIT_URL=${env.GIT_URL}"
30+
echo "GIT_BRANCH=${env.GIT_BRANCH}"
31+
echo "BRANCH_NAME=${env.BRANCH_NAME}"
32+
echo "CHANGE_ID=${env.CHANGE_ID}"
33+
echo "CHANGE_BRANCH=${env.CHANGE_BRANCH}"
34+
echo "CHANGE_TARGET=${env.CHANGE_TARGET}"
35+
echo "GITHUB_REF=${env.GITHUB_REF}"
36+
echo "GITHUB_SHA=${env.GITHUB_SHA}"
37+
checkout([
38+
$class: 'GitSCM',
39+
branches: [[name: "*/${params.BRANCH_NAME}"]],
40+
userRemoteConfigs: [[url: "${params.REPO_URL}"]]
41+
])
42+
}
43+
}
44+
45+
stage('Checkout exact commit if provided') {
46+
when {
47+
expression { return params.GIT_COMMIT?.trim() }
48+
}
49+
steps {
50+
sh '''
51+
set -euxo pipefail
52+
echo "Checking out exact commit: ${GIT_COMMIT}"
53+
git fetch --all --tags
54+
git checkout "${GIT_COMMIT}"
55+
git rev-parse HEAD
56+
'''
57+
}
58+
}
59+
60+
stage('Inspect workspace') {
61+
steps {
62+
sh '''
63+
set -euxo pipefail
64+
echo "=== Shell environment snapshot ==="
65+
env | sort
66+
echo "=== Key variables ==="
67+
echo "JOB_NAME=${JOB_NAME:-}"
68+
echo "BUILD_NUMBER=${BUILD_NUMBER:-}"
69+
echo "BUILD_URL=${BUILD_URL:-}"
70+
echo "NODE_NAME=${NODE_NAME:-}"
71+
echo "WORKSPACE=${WORKSPACE:-}"
72+
echo "GIT_URL=${GIT_URL:-}"
73+
echo "GIT_BRANCH=${GIT_BRANCH:-}"
74+
echo "BRANCH_NAME=${BRANCH_NAME:-}"
75+
echo "CHANGE_ID=${CHANGE_ID:-}"
76+
echo "CHANGE_BRANCH=${CHANGE_BRANCH:-}"
77+
echo "CHANGE_TARGET=${CHANGE_TARGET:-}"
78+
echo "GITHUB_REF=${GITHUB_REF:-}"
79+
echo "GITHUB_SHA=${GITHUB_SHA:-}"
80+
echo "PARAM_BRANCH_NAME=${BRANCH_NAME:-}"
81+
echo "PARAM_GIT_COMMIT=${GIT_COMMIT:-}"
82+
echo "PARAM_REPO_URL=${REPO_URL:-}"
83+
pwd
84+
ls -la
85+
echo "=== Git status ==="
86+
git status || true
87+
echo "=== Git remotes ==="
88+
git remote -v || true
89+
echo "=== Git HEAD ==="
90+
git rev-parse HEAD || true
91+
echo "=== Git branches ==="
92+
git branch -a || true
93+
'''
94+
}
95+
}
96+
97+
stage('Verify Docker') {
98+
steps {
99+
sh '''
100+
set -euxo pipefail
101+
echo "TEST_IMAGE=${TEST_IMAGE}"
102+
echo "PATH=${PATH}"
103+
command -v docker
104+
docker --version
105+
docker info
106+
'''
107+
}
108+
}
109+
110+
stage('Pull test image') {
111+
steps {
112+
sh '''
113+
set -euxo pipefail
114+
echo "Pulling image: ${TEST_IMAGE}"
115+
docker pull "${TEST_IMAGE}"
116+
echo "=== Pulled image inspect ==="
117+
docker image inspect "${TEST_IMAGE}" --format '{{.Id}}'
118+
echo "=== Docker images matching test image ==="
119+
docker images "${TEST_IMAGE}" || true
120+
'''
121+
}
122+
}
123+
}
124+
125+
post {
126+
always {
127+
echo "Build finished: ${currentBuild.currentResult}"
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)