diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..3ae185a --- /dev/null +++ b/Jenkinsfile @@ -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() + } + } +} \ No newline at end of file diff --git a/Readme.md b/Readme.md index a0796bd..77727eb 100644 --- a/Readme.md +++ b/Readme.md @@ -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" diff --git a/build.sh b/build.sh deleted file mode 100644 index a6c7276..0000000 --- a/build.sh +++ /dev/null @@ -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 -