Building Alfresco - linux-on-ibm-z/docs GitHub Wiki

Building Alfresco

The instructions provided below specify the steps to build Alfresco version 7.4.0 container images on Linux on IBM Z for following distributions:

  • RHEL 8.6
  • Ubuntu (20.04, 22.04)

Additionally, binaries are available to install from here if not using a containerized environment. To use these binaries, different Java flavors can be installed on mentioned distributions. Instructions for installing the binaries can be found here. A checklist for verifying the binaries can be found here.

General Notes:

  • When following the steps below please use a standard permission user unless otherwise specified.
  • A directory /<source_root>/ will be referred to in these instructions, this is a temporary writable directory anywhere you'd like to place it.

Prerequisites:

  • Docker packages for RHEL and Ubuntu can be installed by following the instructions here.

Step 1: Build using script

If you want to build Alfresco using manual steps, go to STEP 2.

Use the following commands to build Alfresco using the build script. Please make sure you have wget installed.

wget -q https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Alfresco/7.4.0/build_alfresco.sh

# Build Alfresco
bash build_alfresco.sh

Step 2: Install dependencies

export SOURCE_ROOT=/<source_root>/
  • RHEL 8.6
    sudo yum install -y git gcc gcc-c++ python3 make wget ant iptables-services procps-ng xz curl patch
    
  • Ubuntu (20.04, 22.04)
    sudo apt-get update
    sudo apt-get install -y git gcc g++ python3 make wget ant iptables procps xz-utils curl patch
    

2.1) Download and Install Java

  • With IBM Semeru Runtime (previously known as AdoptOpenJDK openj9)
    • Download and install IBM Semeru Runtime (Java 11 or 17).
# For Java 11 only
cd $SOURCE_ROOT
curl -SL -o jre.tar.gz https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.19%2B7_openj9-0.38.0/ibm-semeru-open-jre_s390x_linux_11.0.19_7_openj9-0.38.0.tar.gz
sudo mkdir -p /opt/java/jre
sudo tar -zxvf  jre.tar.gz -C /opt/java/jre --strip-components 1
rm -f jre.tar.gz

curl -SL -o jdk.tar.gz https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.19%2B7_openj9-0.38.0/ibm-semeru-open-jdk_s390x_linux_11.0.19_7_openj9-0.38.0.tar.gz
sudo mkdir -p /opt/java/jdk
sudo tar -zxvf  jdk.tar.gz -C /opt/java/jdk --strip-components 1
rm -f jdk.tar.gz
export JAVA_HOME=/opt/java/jdk

sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk/bin/java" 40
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk/bin/javac" 40
sudo update-alternatives --set java "/opt/java/jdk/bin/java"
sudo update-alternatives --set javac "/opt/java/jdk/bin/javac"
export JAVA_HOME="$(readlink -f /etc/alternatives/javac | sed 's:/bin/javac::')"
# For Java 17 only
cd $SOURCE_ROOT
curl -SL -o jre.tar.gz https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.7%2B7_openj9-0.38.0/ibm-semeru-open-jre_s390x_linux_17.0.7_7_openj9-0.38.0.tar.gz
sudo mkdir -p /opt/java/jre
sudo tar -zxvf  jre.tar.gz -C /opt/java/jre --strip-components 1
rm -f jre.tar.gz

curl -SL -o jdk.tar.gz https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.7%2B7_openj9-0.38.0/ibm-semeru-open-jdk_s390x_linux_17.0.7_7_openj9-0.38.0.tar.gz
sudo mkdir -p /opt/java/jdk
sudo tar -zxvf  jdk.tar.gz -C /opt/java/jdk --strip-components 1
rm -f jdk.tar.gz
export JAVA_HOME=/opt/java/jdk

sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk/bin/java" 40
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk/bin/javac" 40
sudo update-alternatives --set java "/opt/java/jdk/bin/java"
sudo update-alternatives --set javac "/opt/java/jdk/bin/javac"
export JAVA_HOME="$(readlink -f /etc/alternatives/javac | sed 's:/bin/javac::')"
  • With Eclipse Adoptium Temurin Runtime (previously known as AdoptOpenJDK hotspot)
    • Download and install Eclipse Adoptium Temurin Runtime (Java 11 or 17).
# For Java 11 only
cd $SOURCE_ROOT
curl -SL -o jre.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_s390x_linux_hotspot_11.0.19_7.tar.gz
sudo mkdir -p /opt/java/jre
sudo tar -zxvf  jre.tar.gz -C /opt/java/jre --strip-components 1
rm -f jre.tar.gz

curl -SL -o jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.19_7.tar.gz
sudo mkdir -p /opt/java/jdk
sudo tar -zxvf  jdk.tar.gz -C /opt/java/jdk --strip-components 1
rm -f jdk.tar.gz
export JAVA_HOME=/opt/java/jdk

sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk/bin/java" 40
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk/bin/javac" 40
sudo update-alternatives --set java "/opt/java/jdk/bin/java"
sudo update-alternatives --set javac "/opt/java/jdk/bin/javac"
export JAVA_HOME="$(readlink -f /etc/alternatives/javac | sed 's:/bin/javac::')"
# For Java 17 only
cd $SOURCE_ROOT
curl -SL -o jre.tar.gz https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_s390x_linux_hotspot_17.0.7_7.tar.gz
sudo mkdir -p /opt/java/jre
sudo tar -zxvf  jre.tar.gz -C /opt/java/jre --strip-components 1
rm -f jre.tar.gz

curl -SL -o jdk.tar.gz https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_s390x_linux_hotspot_17.0.7_7.tar.gz
sudo mkdir -p /opt/java/jdk
sudo tar -zxvf  jdk.tar.gz -C /opt/java/jdk --strip-components 1
rm -f jdk.tar.gz
export JAVA_HOME=/opt/java/jdk

sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk/bin/java" 40
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk/bin/javac" 40
sudo update-alternatives --set java "/opt/java/jdk/bin/java"
sudo update-alternatives --set javac "/opt/java/jdk/bin/javac"
export JAVA_HOME="$(readlink -f /etc/alternatives/javac | sed 's:/bin/javac::')"
  • With OpenJDK Runtime
    • Install OpenJDK Runtime (Java 11 or 17).
# For RHEL with Java 11 only
sudo yum install -y java-11-openjdk-devel
export JAVA_HOME=/usr/lib/jvm/java-11
# For RHEL with Java 17 only
sudo yum install -y java-17-openjdk-devel
export JAVA_HOME=/usr/lib/jvm/java-17
# For Ubuntu with Java 11 only
sudo apt-get install -y openjdk-11-jdk
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-s390x
# For Ubuntu with Java 17 only
sudo apt-get install -y openjdk-17-jdk
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-s390x

2.2) Install Maven

cd $SOURCE_ROOT
wget https://archive.apache.org/dist/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz
tar -xzf apache-maven-3.9.2-bin.tar.gz
export PATH=$SOURCE_ROOT/apache-maven-3.9.2/bin:$PATH

2.3) Install Nodejs

cd $SOURCE_ROOT
wget https://nodejs.org/dist/v16.19.0/node-v16.19.0-linux-s390x.tar.gz
sudo tar -C /opt -xzf node-v16.19.0-linux-s390x.tar.gz
sudo chown -R root:root /opt/node-v16.19.0-linux-s390x/
export PATH=$PATH:/opt/node-v16.19.0-linux-s390x/bin

Step 3: Build component docker images

3.1) Build alfresco-base-java image

# Set the java version to use in all steps
export JAVA_VERSION="11" # If using Java 11 only
export JAVA_VERSION="17" # If using Java 17 only
cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-docker-base-java.git
cd alfresco-docker-base-java
# For IBM Semeru or Temurin JDKs only
git checkout 178324f2dd7f5b010cd93a17a414cd82d916d9b5
sed -i "s#FROM.*#FROM registry.access.redhat.com/ubi8:8.7-1112 AS ubi8#g" Dockerfile
sed -i "s#RUN export#RUN yum install -y glibc-langpack-en \&\& \\\\\n    yum clean all \&\& \\\\\n    export#" Dockerfile
cp $SOURCE_ROOT/jre.tar.gz .
docker build -t "alfresco/alfresco-base-java:jre${JAVA_VERSION}-ubi8" . \
  --build-arg JAVA_PKG="jre.tar.gz" \
  --build-arg CREATED="$(date --iso-8601=seconds)" \
  --build-arg REVISION="$(git rev-parse --verify HEAD)" \
  --no-cache
# For OpenJDK JDKs only
git checkout c5eafffef255e0fcb79e276afdd3146f3850c5da
sed -i "s#FROM rockylinux:8.*#FROM registry.access.redhat.com/ubi8:8.7-1112 AS ubi8#g" Dockerfile
docker build -t "alfresco/alfresco-base-java:jre${JAVA_VERSION}-ubi8" . \
  --build-arg DISTRIB_NAME=ubi --build-arg DISTRIB_MAJOR=8 \
  --build-arg JAVA_MAJOR="${JAVA_VERSION}" --build-arg JDIST=jre \
  --build-arg CREATED="$(date --iso-8601=seconds)" --build-arg REVISION="$(git rev-parse --verify HEAD)" --no-cache

3.2) Build alfresco-base-tomcat image

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-docker-base-tomcat 
cd alfresco-docker-base-tomcat
git checkout 36a98e9f593b0ac9727e40354f2db224c62ff08f
sed -i 's/quay.io\///g' Dockerfile
docker build -t "alfresco/alfresco-base-tomcat:tomcat9-jre${JAVA_VERSION}-ubi8" . \
  --build-arg DISTRIB_NAME=ubi --build-arg DISTRIB_MAJOR=8 \
  --build-arg JAVA_MAJOR="${JAVA_VERSION}" --build-arg JDIST=jre --build-arg TOMCAT_MAJOR=9 \
  --build-arg CREATED="$(date --iso-8601=seconds)" --build-arg REVISION="$(git rev-parse --verify HEAD)" --no-cache

3.3) Build alfresco-community-repo

export COMMUNITY_REPO_VERSION=20.164
cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-community-repo.git
cd alfresco-community-repo
git checkout "${COMMUNITY_REPO_VERSION}"
curl -sSL "https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Alfresco/7.4.0/patch/threadmxbean.patch" | git apply -
sed -i "s/FROM.*/FROM alfresco\/alfresco-base-tomcat:tomcat9-jre${JAVA_VERSION}-ubi8/g" packaging/docker-alfresco/Dockerfile
mvn clean install -DskipTests=true -Dversion.edition=Community -Pbuild-docker-images -Dimage.tag="${COMMUNITY_REPO_VERSION}"

3.4) Build Alfresco share

export COMMUNITY_SHARE_VERSION=20.165
cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-community-share.git
cd alfresco-community-share
git checkout "${COMMUNITY_SHARE_VERSION}"
sed -i "s/FROM.*/FROM alfresco\/alfresco-base-tomcat:tomcat9-jre${JAVA_VERSION}-ubi8/g" packaging/docker/Dockerfile
mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -Pbuild-docker-images -Dimage.tag="${COMMUNITY_SHARE_VERSION}" -Drepo.image.tag="${COMMUNITY_REPO_VERSION}"
docker tag "alfresco/alfresco-share-base:${COMMUNITY_SHARE_VERSION}" "alfresco/alfresco-share:7.4.0.1"

3.5) Build acs-community-packaging

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/acs-community-packaging.git
cd acs-community-packaging
git checkout "7.4.0.1"
mvn clean install -DskipTests=true -Pall-tas-tests -Pbuild-docker-images -Dmaven.javadoc.skip=true -Dimage.tag="7.4.0.1" -Drepo.image.tag="${COMMUNITY_REPO_VERSION}" -Dshare.image.tag="${COMMUNITY_SHARE_VERSION}"

3.6) Build Alfresco Search Services

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/SearchServices.git
cd SearchServices/
git checkout "2.0.7"
sed -i "s/FROM.*/FROM alfresco\/alfresco-base-java:jre${JAVA_VERSION}-ubi8/g" search-services/packaging/src/docker/Dockerfile
cd search-services/
curl -sSL "https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Alfresco/7.4.0/patch/search-restlet.patch" | git apply -
mvn clean install -DskipTests=true
cd packaging/target/docker-resources
docker build -t alfresco/alfresco-search-services:2.0.7 .

3.7) Build Alfresco Activemq

export ACTIVEMQ_VERSION="5.17.1"
cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-docker-activemq.git
cd alfresco-docker-activemq/
git checkout bbfe1f2f3d6fe7fdfe785445cfc26df79c025df9
docker build -t "alfresco/alfresco-activemq:${ACTIVEMQ_VERSION}-jre${JAVA_VERSION}-ubi8" . --build-arg ACTIVEMQ_VERSION=${ACTIVEMQ_VERSION} --build-arg DISTRIB_NAME=ubi --build-arg DISTRIB_MAJOR=8 --build-arg JAVA_MAJOR="${JAVA_VERSION}" --build-arg JDIST=jre --no-cache

3.8) Build Alfresco acs-community-ingress

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/acs-ingress.git
cd acs-ingress
git checkout 3.4.2
docker build -t alfresco/alfresco-acs-nginx:3.4.2 .

3.9) Build Alfresco transform core

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-transform-core.git
cd alfresco-transform-core
git checkout 3.1.0
grep -RiIl 'jre17-rockylinux8-202302221525' | xargs sed -i "s/jre17-rockylinux8-202302221525/jre${JAVA_VERSION}-ubi8/g"
grep -RiIl '5.17.1-jre11-rockylinux8' | xargs sed -i "s/5.17.1-jre11-rockylinux8/${ACTIVEMQ_VERSION}-jre${JAVA_VERSION}-ubi8/g"
grep -RiIl '2.0.1.alfresco-2' | xargs sed -i 's/2.0.1.alfresco-2/2.0.0/g'
grep -RiIl 'alfresco-activemq:5.16.1' | xargs sed -i "s/alfresco-activemq:5.16.1/alfresco-activemq:${ACTIVEMQ_VERSION}-jre${JAVA_VERSION}-ubi8/g"
grep -RiIl 'Apache ActiveMQ 5.16.1' | xargs sed -i "s/Apache ActiveMQ 5.16.1/Apache ActiveMQ ${ACTIVEMQ_VERSION}/g"
mvn clean install -pl '!engines/aio,!engines/imagemagick,!engines/libreoffice' -Plocal,docker-it-setup -DskipTests=true

3.10) Build Alfresco content app

cd $SOURCE_ROOT
git clone https://github.com/Alfresco/alfresco-content-app.git
cd alfresco-content-app/
git checkout 4.0.0
sudo chmod 777 /opt/node-v16.19.0-linux-s390x/lib/node_modules/ /opt/node-v16.19.0-linux-s390x/bin/
npm link @angular/cli
sudo chmod 755 /opt/node-v16.19.0-linux-s390x/lib/node_modules/ /opt/node-v16.19.0-linux-s390x/bin/
sudo chown -R root:root /opt/node-v16.19.0-linux-s390x/lib/node_modules/
NX_NON_NATIVE_HASHER=true npm run build.release
docker build -t alfresco/alfresco-content-app:4.0.0 . --build-arg PROJECT_NAME=content-ce

Step 4: Execute Test Suite (Optional)

Run a subset of tests that do not require a full Alfresco development environment to be setup.

cd "$SOURCE_ROOT/alfresco-community-repo"
mvn -B test -pl core,data-model -am -DfailIfNoTests=false
mvn -B test -pl "repository,mmt" -am "-Dtest=AllUnitTestsSuite,AllMmtUnitTestSuite" -DfailIfNoTests=false
cd "$SOURCE_ROOT/alfresco-transform-core"
mvn -U -Dmaven.wagon.http.pool=false clean test -DadditionalOption=-Xdoclint:none -Dmaven.javadoc.skip=true -Dparent.core.deploy.skip=true -Dtransformer.base.deploy.skip=true -Plocal,docker-it-setup,misc,pdf-renderer,tika

Step 5: Start Alfresco service

5.1) Get Alfresco docker compose file

cd $SOURCE_ROOT
mkdir -p docker-compose-source
cd docker-compose-source
wget -O docker-compose.yml https://raw.githubusercontent.com/Alfresco/acs-deployment/v6.0.0/docker-compose/community-docker-compose.yml

Note: Some third party Alfresco transformers (imagemagick, libreoffice) are not available on s390x. Please follow the steps given below to remove code relevant to these transformers and enable the available transformers.

cat << EOF | sed -i '64r /dev/stdin' docker-compose.yml
  transform-pdf-renderer:
    image: alfresco/alfresco-pdf-renderer:latest
    mem_limit: 1536m
    environment:
      JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80"
    ports:
      - "8090:8090"
  transform-tika:
    image: alfresco/alfresco-tika:latest
    mem_limit: 1536m
    environment:
      JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80"
    ports:
      - "8093:8090"
  transform-misc:
    image: alfresco/alfresco-transform-misc:latest
    mem_limit: 1536m
    environment:
      JAVA_OPTS: " -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80"
    ports:
      - "8094:8090"
EOF
cat << EOF | sed -i '53r /dev/stdin' docker-compose.yml
        -DlocalTransform.pdfrenderer.url=http://transform-pdf-renderer:8090/
        -DlocalTransform.tika.url=http://transform-tika:8090/
        -DlocalTransform.misc.url=http://transform-misc:8090/
EOF
sed -i '53d;59,67d' docker-compose.yml
sed -i "s#alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8#alfresco/alfresco-activemq:${ACTIVEMQ_VERSION}-jre${JAVA_VERSION}-ubi8#" docker-compose.yml

5.2) Start Alfresco

The Docker Compose plugin is required to start the alfresco docker-compose.yml script. Please ensure the docker-compose-plugin package is installed based on your distro.

cd $SOURCE_ROOT/docker-compose-source
docker compose up

Reference: