Skip to content

Commit b3bb0ff

Browse files
committed
ci: add Jenkins PR workflow
1 parent 36ab2a5 commit b3bb0ff

2 files changed

Lines changed: 197 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: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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+
}
19+
20+
stages {
21+
stage('Build Docker Images') {
22+
matrix {
23+
agent any
24+
25+
axes {
26+
axis {
27+
name 'STAR_BASE'
28+
values 'root5', 'root6'
29+
}
30+
axis {
31+
name 'COMPILER'
32+
values 'gcc485', 'gcc11'
33+
}
34+
}
35+
36+
stages {
37+
stage('Checkout') {
38+
steps {
39+
checkout([
40+
$class: 'GitSCM',
41+
branches: [[name: "*/${params.BRANCH_NAME}"]],
42+
userRemoteConfigs: [[
43+
url: "${params.REPO_URL}",
44+
refspec: '+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*'
45+
]]
46+
])
47+
}
48+
}
49+
50+
stage('Checkout exact commit if provided') {
51+
when {
52+
expression { return params.GIT_COMMIT?.trim() }
53+
}
54+
steps {
55+
sh '''
56+
set -euxo pipefail
57+
git fetch --all --tags
58+
git checkout "${GIT_COMMIT}"
59+
git rev-parse HEAD
60+
'''
61+
}
62+
}
63+
64+
stage('Prepare Docker Buildx') {
65+
steps {
66+
sh '''
67+
set -euxo pipefail
68+
command -v docker
69+
docker --version
70+
docker buildx version
71+
docker buildx use default || true
72+
docker buildx inspect default --bootstrap || docker buildx inspect --bootstrap
73+
'''
74+
}
75+
}
76+
77+
stage('Build Docker Image') {
78+
steps {
79+
sh '''
80+
set -euxo pipefail
81+
starenv="${STAR_BASE}-${COMPILER}"
82+
image_tag="ghcr.io/star-bnl/star-sw-${starenv}"
83+
image_tar="${ARTIFACT_DIR}/star-sw-${starenv}.tar"
84+
85+
mkdir -p "${ARTIFACT_DIR}"
86+
87+
docker buildx build \
88+
--progress plain \
89+
--build-arg "starenv=${STAR_BASE}" \
90+
--build-arg "compiler=${COMPILER}" \
91+
--tag "${image_tag}" \
92+
--output "type=docker,dest=${image_tar}" \
93+
.
94+
'''
95+
}
96+
}
97+
98+
stage('Archive Docker Image') {
99+
steps {
100+
archiveArtifacts artifacts: "artifacts/star-sw-${STAR_BASE}-${COMPILER}.tar", fingerprint: true
101+
}
102+
}
103+
}
104+
}
105+
}
106+
}
107+
108+
post {
109+
always {
110+
echo "Build finished: ${currentBuild.currentResult}"
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)