Browse Source

dev (#1)

accept a paremeter for build mode (and parameterized cron job to run both options), one to build the latest version from the master branch and one that check out the most recent tag/release and builds that. can also accept the name of a tag to build. reads the version number from configure.ac.
Co-Authored-By: ben <ben@sudo.is>
Co-Committed-By: ben <ben@sudo.is>
master
ben 7 months ago
parent
commit
b08e9001ff
4 changed files with 160 additions and 66 deletions
  1. +97
    -34
      Jenkinsfile
  2. +8
    -5
      README.md
  3. +32
    -20
      debian/Dockerfile
  4. +23
    -7
      debian/package.sh

+ 97
- 34
Jenkinsfile View File

@ -1,12 +1,32 @@
def version = ""
def amzn_prefix = "/home/bkristinsson/.local"
def debname = "emacs"
def amzn_prefix = "/home/benedikt.kristinsson/.local"
def timer = currentBuild.getBuildCauses()[0]["shortDescription"].matches("Started by timer")
def skip_build = false
def docker_tag = "latest"
def get_version() {
return sh(
script: "grep AC_INIT configure.ac | awk -F',' '{print \$2}'",
returnStdout: true
).trim()
}
def build_exists(String version) {
return fileExists(
"${env.JENKINS_HOME}/artifacts/emacs_${version}.deb"
)
}
pipeline {
agent any
parameters {
string(name: 'build_mode', defaultValue: 'master')
}
triggers {
cron('@daily')
parameterizedCron('''@daily%%build_mode=master
@daily%%build_mode=stable''')
}
options {
timestamps()
@ -33,7 +53,7 @@ pipeline {
url: 'https://git.sudo.is/mirrors/emacs.git'
]],
//branches: [[name: "refs/tags/emacs-${env.VERSION}"]]
branches: [[name: "master"]]
//branches: [[name: "master"]]
])
dir('emacs-src') {
@ -56,42 +76,56 @@ pipeline {
// to get the latest minor relase instead,
// check out the emacs-$MAJOR branch (not tag)
def latest_tag = sh(
script: 'git describe --tags --abbrev=0',
script: "git for-each-ref --sort=-creatordate --format='%(refname:lstrip=2)' 'refs/tags/emacs-*' --count 1",
returnStdout: true
)
version = latest_tag.split('-')[1].trim()
echo "latest tag reachable from master: ${latest_tag}"
sh "git checkout refs/tags/${latest_tag}"
sh "git --no-pager show --oneline -s"
if (params.build_mode == "master") {
debname = "emacs-nightly"
docker_tag = "latest"
// no `git checkout`, jenkins has already
// checked out master from origin.
}
else if (params.build_mode == "stable") {
def ref = "refs/tags/" + latest_tag
sh "git checkout -f ${ref}"
def build_exists = fileExists(
"${env.JENKINS_HOME}/artifacts/emacs-${version}.tar.gz"
)
skip_build = (timer && build_exists)
debname = "emacs"
docker_tag = "stable"
}
else if (params.build_mode.startsWith("emacs-")) {
def ref = "refs/tags/" + params.build_mode
sh "git checkout -f ${ref}"
echo "latest tag reachable from master: ${latest_tag}"
echo "build for ${version} exists: ${build_exists}"
echo "started by timer: ${timer}"
echo "skip building: ${skip_build}"
debname = "emacs"
docker_tag = version
}
else {
error("unkonwn build_mode param")
}
version = get_version()
currentBuild.displayName += " - ${debname} v${version}"
currentBuild.description = params.build_mode
echo "version: ${version}"
if (timer && build_exists(version)) {
echo "build for ${version} exists"
echo "skipping building steps"
skip_build = true
}
}
}
}
}
stage('amzn') {
when { expression { skip_build == false } }
steps {
sh "docker build -f amzn/Dockerfile --build-arg PREFIX=${amzn_prefix} --build-arg VERSION=${version} -t emacs-amzn:${version}-amzn ."
sh "docker container create --name emacs_amzn_builder emacs-amzn:${version}-amzn "
sh "docker container cp emacs_amzn_builder:/emacs/amzn/ dist/"
}
}
stage ('deb: build emacs') {
when { expression { skip_build == false } }
steps {
sh "docker build -f debian/Dockerfile --build-arg PREFIX=/emacs/target --build-arg VERSION=${version} --target builder -t benediktkr/emacs:builder-${version} ."
sh "docker build --pull -f debian/Dockerfile --build-arg VERSION=${version} --build-arg DEBNAME=${debname} --target builder -t benediktkr/emacs:builder-${version} ."
sh "docker container create --name emacs_debian_builder benediktkr/emacs:builder-${version}"
dir('dist/') {
@ -102,30 +136,59 @@ pipeline {
stage('deb: container') {
when { expression { skip_build == false } }
steps {
sh "docker build -f debian/Dockerfile -t benediktkr/emacs:${version} ."
sh "docker build --pull -f debian/Dockerfile --build-arg VERSION=${version} --build-arg DEBNAME=${debname} --target final -t benediktkr/emacs:${version} ."
sh "docker tag benediktkr/emacs:${version} benediktkr/emacs:${docker_tag}"
}
}
stage('amzn') {
when {
expression { skip_build == false }
expression { build_mode == "stable" }
}
steps {
sh "docker build -f amzn/Dockerfile --build-arg PREFIX=${amzn_prefix} --build-arg VERSION=${version} -t emacs-amzn:${version}-amzn ."
sh "docker container create --name emacs_amzn_builder emacs-amzn:${version}-amzn "
sh "docker container cp emacs_amzn_builder:/emacs/amzn/ dist/"
}
}
}
post {
success {
archiveArtifacts(
artifacts: 'dist/*/*.tar.gz,dist/debian/*.deb',
fingerprint: true
)
sh "cp dist/*/*.tar.gz ${env.JENKINS_HOME}/artifacts"
sh "cp dist/debian/*.deb ${env.JENKINS_HOME}/artifacts"
script {
if ( !skip_build ) {
archiveArtifacts(
artifacts: 'dist/*/*.tar.gz,dist/debian/*.deb',
fingerprint: true
)
sh "cp dist/*/*.tar.gz ${env.JENKINS_HOME}/artifacts"
sh "cp dist/debian/*.deb ${env.JENKINS_HOME}/artifacts"
build(
job: "/utils/apt",
wait: false,
parameters: [[
$class: 'StringParameterValue',
name: 'filename',
value: "${debname}_${version}_amd64.deb"
]]
)
sh "docker push benediktkr/emacs:${docker_tag}"
sh "docker push benediktkr/emacs:${version}"
build job: "/utils/apt", wait: false
}
}
}
cleanup {
script {
if (! skip_build ) {
sh "rm dist/*/*.tar.gz || true"
sh "rm dist/debian/*.deb || true"
sh "docker container rm emacs_debian_builder || true"
sh "docker container rm emacs_amzn_builder || true"
}


+ 8
- 5
README.md View File

@ -1,18 +1,21 @@
# emacs-docker
[![Build Status](https://jenkins.sudo.is/buildStatus/icon?job=ben%2Femacs-docker%2Fmaster&style=flat-square)](https://jenkins.sudo.is/job/ben/job/emacs-docker/job/master/)
![Docker Image Version (latest by date)](https://img.shields.io/docker/v/benediktkr/emacs?style=flat-square)
![Docker Image Version (latest semver)](https://img.shields.io/docker/v/benediktkr/emacs?sort=semver&style=flat-square)
![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/benediktkr/emacs?sort=date&style=flat-square)
Builds the latest stable emacs in a docker image, packages it as `.deb` and `.tar.gz` and then publishe a [docker image to Docker Hub](https://hub.docker.com/r/benediktkr/emacs-docker/) with emacs installed:
Builds both the latest version from `master` in the repo, and looks for the newest tag (release) and builds that. Builds are packaged as `.deb` and `.tar.gz` and then publishe a [docker image to Docker Hub](https://hub.docker.com/r/benediktkr/emacs/) with emacs installed.
The `latest` tag follows the master branch builds.
```
docker run --rm -it benediktkr/emacs:27.1
```
docker run --rm -it benedikt/emacs:latest
```
The `.deb` package is uploaded to [apt.sudo.is](https://apt.sudo.is).
The `.deb` packages are uploaded to [apt.sudo.is](https://apt.sudo.is).
```
wget -q -O - https://apt.sudo.is/KEY.gpg | sudo apt-key add -


+ 32
- 20
debian/Dockerfile View File

@ -1,44 +1,56 @@
FROM debian:bullseye as base
ARG VERSION=27.1
ARG CPU_COUNT=8
ARG PREFIX=/emacs/target
ARG EMACS_UID=1337
ENV VERSION=${VERSION}
ENV PREFIX=${PREFIX}
ENV PREFIX=/emacs/target
ENV DEBIAN_FRONTEND=noninteractive
RUN mkdir -p /emacs/target && \
apt-get update && \
RUN useradd -m -d /emacs -u ${EMACS_UID} emacs
RUN apt-get update && apt-get -y install nettle-dev
WORKDIR /emacs
FROM base as builder
RUN apt-get update && \
apt-get install -y wget build-essential autoconf texinfo gnutls-bin \
libgnutls28-dev pkg-config libncurses-dev patchelf \
libacl1-dev \
ruby ruby-dev rubygems build-essential git && \
gem install --no-document fpm
FROM base as builder
ADD emacs-src/ /emacs/emacs-${VERSION}
WORKDIR /emacs/emacs-${VERSION}
ARG VERSION
ENV VERSION=${VERSION}
COPY --chown=emacs:emacs emacs-src/ /emacs/emacs-src
USER emacs
WORKDIR /emacs/emacs-src
RUN mkdir /emacs/target
# --exec-prefix=$PREFIX
# --prefix=$PREFIX
RUN ./autogen.sh \
&& ./configure --with-x=no CFLAGS="-I$ORIGIN/include" LDFLAGS="-L$ORIGIN/lib -Wl,-rpath=\\\$\$ORIGIN/../lib"
RUN make -j${CPU_COUNT}
RUN make install prefix=$PREFIX -j${CPU_COUNT}
&& ./configure --with-x=no CFLAGS="-I$ORIGIN/include" LDFLAGS="-L$ORIGIN/lib -Wl,-rpath=\\\$\$ORIGIN/../lib" > /emacs/configure.log
RUN make -j${CPU_COUNT} > /emacs/make.log
RUN make install prefix=$PREFIX -j${CPU_COUNT} > /emacs/makeinstall.log
ARG DEBNAME=emacs
ADD debian/package.sh /usr/local/bin/package.sh
RUN chmod +x /usr/local/bin/package.sh
RUN /usr/local/bin/package.sh
RUN /usr/local/bin/package.sh ${BUILD_MODE}
FROM builder as final
FROM base as final
WORKDIR /emacs
RUN rm -rf /emacs/emacs-${VERSION} #&& rm -rf /emacs/target
# enable when everything is included
ARG VERSION
ARG DEBNAME=emacs
ENV DEBNAME=${DEBNAME}
RUN dpkg -i /emacs/debian/emacs_27.1_amd64.deb \
&& rm -rf /emacs/debian
RUN /usr/local/bin/emacs --version
COPY --from=builder /emacs/debian/${DEBNAME}_${VERSION}_amd64.deb /
RUN dpkg -i /${DEBNAME}_${VERSION}_amd64.deb \
&& rm /${DEBNAME}_${VERSION}_amd64.deb
USER emacs
RUN /usr/local/bin/emacs --version
CMD ["/usr/local/bin/emacs"]

+ 23
- 7
debian/package.sh View File

@ -7,6 +7,10 @@ if [ -z "$VERSION" ]; then
echo "varible VERSION must be set!"
exit 1
fi
if [ -z "$DEBNAME" ]; then
echo "varible DEBNAME must be set!"
exit 1
fi
BUILDS=/emacs/debian
@ -22,14 +26,19 @@ BUILDS=/emacs/debian
echo $PREFIX
## this is all commented out for now, since for me it is only on the
## amzn specific builds that i need an executable with the libs in the
## build.
## this also had some weird side effects on Ubuntu.
# copying some lib files
cp /lib/x86_64-linux-gnu/librt.so.1 $PREFIX/lib/
cp /lib/x86_64-linux-gnu/libtinfo.so.6 $PREFIX/lib/
cp /usr/lib/x86_64-linux-gnu/libgnutls.so.30 $PREFIX/lib/
#cp /lib/x86_64-linux-gnu/librt.so.1 $PREFIX/lib/
#cp /lib/x86_64-linux-gnu/libtinfo.so.6 $PREFIX/lib/
#cp /usr/lib/x86_64-linux-gnu/libgnutls.so.30 $PREFIX/lib/
# might not work on ubuntu
cp /usr/lib/x86_64-linux-gnu/libnettle.so.8 $PREFIX/lib/
cp /usr/lib/x86_64-linux-gnu/libhogweed.so.6 $PREFIX/lib/
#cp /usr/lib/x86_64-linux-gnu/libnettle.so.8 $PREFIX/lib/
#cp /usr/lib/x86_64-linux-gnu/libhogweed.so.6 $PREFIX/lib/
# shown as inlcuded by ldd but havent been needed so far
# cp /lib/x86_64-linux-gnu/libanl.so.1 $PREFIX/lib/
@ -51,6 +60,7 @@ cp /usr/lib/x86_64-linux-gnu/libhogweed.so.6 $PREFIX/lib/
# in the output we see that the binary is dynamically linking the
# files we copied
ldd $PREFIX/bin/emacs
$PREFIX/bin/emacs --version
mkdir -p $BUILDS
@ -64,10 +74,16 @@ mkdir -p $BUILDS
# make a .deb with fpm
(
# set dependencies (check with apt)
DEPENDS="-d nettle-dev"
#DEPENDS=""
fpm -t deb -v ${VERSION} -n emacs $DEPENDS -s dir $PREFIX/=/usr/local
# if [ "$DEBNAME" == "emacs-nightly" ]; then
# $SUFFIX="+$(date +'%Y%M%d')"
# else
# SUFFIX=""
# fi
fpm -t deb -v ${VERSION} -n ${DEBNAME} ${DEPENDS} -s dir $PREFIX/=/usr/local
cp *.deb $BUILDS
)


Loading…
Cancel
Save