Files
rocky-man/Jenkinsfile
T
admin ebb3925629 deploy: pull app source from upstream instead of duplicating it
This repo now holds only the deploy pipeline. The application code (src,
templates, Dockerfile, pyproject, etc.) is removed and instead cloned from
the upstream repository at build time via the new SOURCE_REPO / SOURCE_REF
parameters (default: git.resf.org/documentation/rocky-man @ main). The
Docker image is built from that clone, eliminating the duplicate copy.

Also drop an accidentally committed .ruff_cache blob and ignore the
build-time clone dir and ruff cache.

Assisted-by: Claude Opus 4 (Claude Code)
2026-06-16 08:04:30 -05:00

176 lines
4.7 KiB
Groovy

// Jenkinsfile for Rocky Man
//
// This repo holds only the deploy pipeline. The application source is pulled
// from the upstream repository at build time (see SOURCE_REPO / SOURCE_REF),
// so the code is not duplicated here.
pipeline {
agent {
kubernetes {
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
jenkins: agent
spec:
containers:
- name: docker
image: docker:24-dind
securityContext:
privileged: true
volumeMounts:
- name: docker-sock
mountPath: /var/run
command:
- dockerd-entrypoint.sh
- name: docker-cli
image: docker:24-cli
command:
- cat
tty: true
volumeMounts:
- name: docker-sock
mountPath: /var/run
volumes:
- name: docker-sock
emptyDir: {}
"""
}
}
parameters {
string(
name: 'SOURCE_REPO',
defaultValue: 'https://git.resf.org/documentation/rocky-man.git',
description: 'Upstream application repository to build'
)
string(
name: 'SOURCE_REF',
defaultValue: 'main',
description: 'Branch or tag of the application to build'
)
string(
name: 'VERSIONS',
defaultValue: '8.10 9.8 10.2',
description: 'Rocky Linux versions to build (space-separated)'
)
string(
name: 'REPO_TYPES',
defaultValue: 'BaseOS AppStream',
description: 'Rocky Linux repos to build against (space-separated)'
)
string(
name: 'R2_BUCKET_NAME',
defaultValue: 'rockyman',
description: 'R2 bucket name for uploads'
)
string(
name: 'EXISTING_VERSIONS',
defaultValue: '',
description: 'Existing versions already built (space-separated)'
)
string(
name: 'PARALLEL_DOWNLOADS',
defaultValue: '5',
description: 'Number of parallel downloads'
)
string(
name: 'PARALLEL_CONVERSIONS',
defaultValue: '10',
description: 'Number of parallel conversions'
)
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
timeout(time: 2, unit: 'HOURS')
}
stages {
stage('Checkout Source') {
steps {
dir('rocky-man') {
git url: "${params.SOURCE_REPO}", branch: "${params.SOURCE_REF}"
}
}
}
stage('Build Docker Image') {
steps {
container('docker-cli') {
sh '''
until docker info > /dev/null 2>&1; do
echo "Waiting for Docker daemon..."
sleep 2
done
docker build -t rocky-man:${BUILD_NUMBER} rocky-man
docker tag rocky-man:${BUILD_NUMBER} rocky-man:latest
'''
}
}
}
stage('Build Man Pages') {
steps {
container('docker-cli') {
sh '''
mkdir -p ./html ./tmp
docker run --rm \
-v "$(pwd)/html:/data/html" \
-v "$(pwd)/tmp:/data/tmp" \
rocky-man:${BUILD_NUMBER} \
--versions ${VERSIONS} \
--repo-types ${REPO_TYPES} \
--parallel-downloads ${PARALLEL_DOWNLOADS} \
--parallel-conversions ${PARALLEL_CONVERSIONS} \
--existing-versions ${EXISTING_VERSIONS}
'''
}
}
}
stage('Upload to R2') {
when {
expression { return params.R2_BUCKET_NAME != "" }
}
steps {
container('docker-cli') {
withCredentials([
string(credentialsId: 'r2-account-id', variable: 'R2_ACCOUNT_ID'),
string(credentialsId: 'r2-access-key-id', variable: 'AWS_ACCESS_KEY_ID'),
string(credentialsId: 'r2-secret-access-key', variable: 'AWS_SECRET_ACCESS_KEY')
]) {
sh '''
docker run --rm \
-v "$(pwd)/html:/workspace/html" \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
peakcom/s5cmd:latest \
--endpoint-url "https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com" \
sync --delete /workspace/html/ "s3://${R2_BUCKET_NAME}/"
'''
}
}
}
}
}
post {
success {
echo 'Build completed and uploaded to R2!'
}
failure {
echo 'Build failed!'
}
cleanup {
container('docker-cli') {
sh '''
docker rmi rocky-man:${BUILD_NUMBER} || true
docker rmi rocky-man:latest || true
'''
}
}
}
}