Skip to content

Commit 9ede8e7

Browse files
committed
ci: add Jenkins PR workflow
1 parent 095c3a8 commit 9ede8e7

2 files changed

Lines changed: 283 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: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
pipeline {
2+
agent none
3+
4+
options {
5+
timestamps()
6+
skipDefaultCheckout(true)
7+
parallelsAlwaysFailFast()
8+
}
9+
10+
parameters {
11+
string(name: 'BRANCH_NAME', defaultValue: 'main', description: 'Branch to build')
12+
string(name: 'GIT_COMMIT', defaultValue: '', description: 'Commit SHA to build, optional')
13+
string(name: 'REPO_URL', defaultValue: 'https://github.com/star-bnl/star-sw.git', description: 'Repository URL')
14+
}
15+
16+
environment {
17+
ARTIFACT_DIR = 'artifacts'
18+
BUILDKIT_STEP_LOG_MAX_SIZE = '10000000'
19+
}
20+
21+
stages {
22+
stage('Build Docker Images') {
23+
matrix {
24+
agent any
25+
26+
axes {
27+
axis {
28+
name 'STAR_BASE'
29+
values 'root5', 'root6'
30+
}
31+
axis {
32+
name 'COMPILER'
33+
values 'gcc485', 'gcc11'
34+
}
35+
}
36+
37+
stages {
38+
stage('Checkout') {
39+
steps {
40+
echo "PARAM_BRANCH_NAME=${params.BRANCH_NAME}"
41+
echo "PARAM_GIT_COMMIT=${params.GIT_COMMIT}"
42+
echo "PARAM_REPO_URL=${params.REPO_URL}"
43+
echo "JOB_NAME=${env.JOB_NAME}"
44+
echo "BUILD_NUMBER=${env.BUILD_NUMBER}"
45+
echo "BUILD_URL=${env.BUILD_URL}"
46+
echo "NODE_NAME=${env.NODE_NAME}"
47+
echo "WORKSPACE=${env.WORKSPACE}"
48+
echo "STAR_BASE=${env.STAR_BASE}"
49+
echo "COMPILER=${env.COMPILER}"
50+
checkout([
51+
$class: 'GitSCM',
52+
branches: [[name: "*/${params.BRANCH_NAME}"]],
53+
userRemoteConfigs: [[
54+
url: "${params.REPO_URL}",
55+
refspec: '+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*'
56+
]]
57+
])
58+
}
59+
}
60+
61+
stage('Checkout exact commit if provided') {
62+
when {
63+
expression { return params.GIT_COMMIT?.trim() }
64+
}
65+
steps {
66+
sh '''
67+
set -euxo pipefail
68+
echo "Checking out exact commit: ${GIT_COMMIT}"
69+
git fetch --all --tags
70+
git checkout "${GIT_COMMIT}"
71+
git rev-parse HEAD
72+
'''
73+
}
74+
}
75+
76+
stage('Inspect workspace') {
77+
steps {
78+
sh '''
79+
set -euxo pipefail
80+
echo "=== Shell environment snapshot ==="
81+
env | sort
82+
echo "=== Key variables ==="
83+
echo "JOB_NAME=${JOB_NAME:-}"
84+
echo "BUILD_NUMBER=${BUILD_NUMBER:-}"
85+
echo "BUILD_URL=${BUILD_URL:-}"
86+
echo "NODE_NAME=${NODE_NAME:-}"
87+
echo "WORKSPACE=${WORKSPACE:-}"
88+
echo "GIT_URL=${GIT_URL:-}"
89+
echo "GIT_BRANCH=${GIT_BRANCH:-}"
90+
echo "BRANCH_NAME=${BRANCH_NAME:-}"
91+
echo "CHANGE_ID=${CHANGE_ID:-}"
92+
echo "CHANGE_BRANCH=${CHANGE_BRANCH:-}"
93+
echo "CHANGE_TARGET=${CHANGE_TARGET:-}"
94+
echo "GITHUB_REF=${GITHUB_REF:-}"
95+
echo "GITHUB_SHA=${GITHUB_SHA:-}"
96+
echo "PARAM_BRANCH_NAME=${BRANCH_NAME:-}"
97+
echo "PARAM_GIT_COMMIT=${GIT_COMMIT:-}"
98+
echo "PARAM_REPO_URL=${REPO_URL:-}"
99+
echo "STAR_BASE=${STAR_BASE:-}"
100+
echo "COMPILER=${COMPILER:-}"
101+
pwd
102+
ls -la
103+
echo "=== Git status ==="
104+
git status || true
105+
echo "=== Git remotes ==="
106+
git remote -v || true
107+
echo "=== Git HEAD ==="
108+
git rev-parse HEAD || true
109+
'''
110+
}
111+
}
112+
113+
stage('Verify Docker') {
114+
steps {
115+
sh '''
116+
set -euxo pipefail
117+
echo "ARTIFACT_DIR=${ARTIFACT_DIR}"
118+
echo "STAR_BASE=${STAR_BASE}"
119+
echo "COMPILER=${COMPILER}"
120+
echo "PATH=${PATH}"
121+
command -v docker
122+
docker --version
123+
docker info
124+
docker buildx version
125+
'''
126+
}
127+
}
128+
129+
stage('Set up Docker Buildx') {
130+
steps {
131+
sh '''
132+
set -euxo pipefail
133+
builder_name="star-sw-${BUILD_NUMBER}-${STAR_BASE}-${COMPILER}"
134+
echo "${builder_name}" > .buildx-builder-name
135+
docker buildx rm "${builder_name}" || true
136+
docker buildx create \
137+
--name "${builder_name}" \
138+
--driver docker-container \
139+
--driver-opt "env.BUILDKIT_STEP_LOG_MAX_SIZE=${BUILDKIT_STEP_LOG_MAX_SIZE}" \
140+
--use
141+
docker buildx inspect "${builder_name}" --bootstrap
142+
'''
143+
}
144+
}
145+
146+
stage('Build Docker Image') {
147+
steps {
148+
sh '''
149+
set -euxo pipefail
150+
builder_name="$(cat .buildx-builder-name)"
151+
starenv="${STAR_BASE}-${COMPILER}"
152+
image_tag="ghcr.io/star-bnl/star-sw-${starenv}"
153+
image_tar="${ARTIFACT_DIR}/star-sw-${starenv}.tar"
154+
155+
mkdir -p "${ARTIFACT_DIR}"
156+
157+
echo "=== Building ${image_tag} ==="
158+
docker buildx build \
159+
--builder "${builder_name}" \
160+
--progress plain \
161+
--build-arg "starenv=${STAR_BASE}" \
162+
--build-arg "compiler=${COMPILER}" \
163+
--tag "${image_tag}" \
164+
--output "type=docker,dest=${image_tar}" \
165+
.
166+
167+
ls -lh "${image_tar}"
168+
'''
169+
}
170+
}
171+
172+
stage('Archive Docker Image') {
173+
steps {
174+
archiveArtifacts artifacts: "artifacts/star-sw-${STAR_BASE}-${COMPILER}.tar", fingerprint: true
175+
}
176+
}
177+
}
178+
179+
post {
180+
always {
181+
sh '''
182+
set +e
183+
if [ -f .buildx-builder-name ]; then
184+
builder_name="$(cat .buildx-builder-name)"
185+
docker buildx rm "${builder_name}" || true
186+
fi
187+
'''
188+
}
189+
}
190+
}
191+
}
192+
}
193+
194+
post {
195+
always {
196+
echo "Build finished: ${currentBuild.currentResult}"
197+
}
198+
}
199+
}

0 commit comments

Comments
 (0)