Convert to Jenkins Pipeline

This commit is contained in:
Marc Baloup 2024-01-18 17:53:31 +01:00
parent 88d14916af
commit 6899a79ce5
3 changed files with 106 additions and 48 deletions

87
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,87 @@
/*
Required plugins in Jenkins:
- Pipeline Utility Steps
- Docker Pipeline
*/
def app_version
def app_build
def url_download
def app_filename
def docker_tag
def docker_tag_latest
pipeline {
agent any
parameters {
string(name: 'MC_VERSION', description: 'The Minecraft version to build.')
}
environment {
URL_BASE = 'https://api.papermc.io/v2/projects/paper'
URL_VERSION_INFOS = "${URL_BASE}/versions/${params.MC_VERSION}"
DOCKER_TAG_BASE = 'cr.pandacube.fr/paper'
DOCKER_REGISTRY_URL = 'https://cr.pandacube.fr'
DOCKER_REGISTRY_CREDENTIALS = 'cr-pandacube-credentials'
}
stages {
stage('Get build data') {
steps {
sh "curl -L -s '$URL_VERSION_INFOS' -o version_infos.json"
script {
def version_infos = readJSON file: 'version_infos.json'
app_version = params.MC_VERSION
app_build = version_infos.builds[-1]
url_download = "${URL_VERSION_INFOS}/builds/${app_build}/downloads/paper-${app_version}-${app_build}.jar"
app_filename = "Paper-${MC_VERSION}-${app_build}.jar"
docker_tag = "${DOCKER_TAG_BASE}:${app_version}-${app_build}"
docker_tag_version = "${DOCKER_TAG_BASE}:${app_version}"
}
echo "Paper version ${app_version} build #${app_build}"
}
}
stage('Download jar') {
steps {
sh "curl -L -o '$app_filename' '$url_download'"
}
post {
success {
archiveArtifacts artifacts: 'Paper-*.jar', fingerprint: true
}
}
}
stage('Build Docker image') {
steps {
script {
docker.build(docker_tag, "--build-arg RUNNABLE_SERVER_JAR=$app_filename .")
}
sh "docker tag ${docker_tag} ${docker_tag_version}"
}
}
stage('Push Docker image') {
steps {
script {
docker.withRegistry(DOCKER_REGISTRY_URL, DOCKER_REGISTRY_CREDENTIALS) {
docker.image(docker_tag).push()
docker.image(docker_tag_version).push()
}
}
}
}
}
post {
cleanup {
cleanWs()
}
}
}

View File

@ -1,4 +1,22 @@
Docker Compose Example
# PaperDockerBuilder
Jenkins pipeline to build a Docker image of Paper.
```bash
Dockerfile # used to build the Docker image
Jenkinsfile # the pipeline file
Readme.md # you are reading this file
run.sh # entrypoint of the Docker image
```
## Pipeline process
1. Fetches the information about the latest build of Paper for the provided MC version, from the [PaperMC API](https://api.papermc.io/v2/projects/paper)
2. Downloads the Paper jar file.
3. Builds the docker image with the downloaded jar and the entrypoint script, ensuring libraries are downloaded and Paper patch is applied.
4. Pushes the image to the container registry with the tags `$mc_version` (e.g. `1.20.1`) and `$mc_version-$paper_build` (e.g. `1.20.1-196`)
## Docker Compose Example
```yml
version: "3"

View File

@ -1,47 +0,0 @@
#!/bin/bash
URL_PROJECT='https://api.papermc.io/v2/projects/paper'
echo "Getting Paper last build id for MC "$MC_VERSION"..."
URL_VERSION=$URL_PROJECT'/versions/'$MC_VERSION
# get paper build version
if ! curl -s $URL_VERSION -o version_infos.json; then
echo -e "Error: Can't join API"
exit 1
fi
if ! jq -r '.builds[-1]' -e < version_infos.json > build_number.txt; then
echo -e "API returned an error (probably MC_VERSION is not valid)"
exit 1
fi
PAPER_BUILD=`cat build_number.txt`
URL_BUILD=$URL_VERSION'/builds/'$PAPER_BUILD
DOWNLOAD_REOBF=$URL_BUILD'/downloads/paper-'$MC_VERSION'-'$PAPER_BUILD'.jar'
# the runnable jar is actually paperclip
RUNNABLE_SERVER_JAR='Paper-'$MC_VERSION'-'$PAPER_BUILD'.jar'
#UBER_SERVER_JAR='Paper-uberjar-'$MC_VERSION'-'$PAPER_BUILD'.jar'
echo "Downloadling Paperclip for Paper-"$MC_VERSION"-"$PAPER_BUILD"..."
echo "From "$DOWNLOAD_REOBF
echo "To "$RUNNABLE_SERVER_JAR
curl -o $RUNNABLE_SERVER_JAR $DOWNLOAD_REOBF
DOCKER_TAG="cr.pandacube.fr/paper:"$MC_VERSION"-"$PAPER_BUILD
DOCKER_TAG_VERSION="cr.pandacube.fr/paper:"$MC_VERSION
echo "Building docker image with pre-downloaded and pre-patched files, with tag "$DOCKER_TAG
docker build --build-arg RUNNABLE_SERVER_JAR=$RUNNABLE_SERVER_JAR -t $DOCKER_TAG .
docker tag $DOCKER_TAG $DOCKER_TAG_VERSION
echo "Pushing image to Pandacube's container registry"
docker push $DOCKER_TAG
docker push $DOCKER_TAG_VERSION