From c2f97cf39e48736a7fd2de040d8df458844a292b Mon Sep 17 00:00:00 2001 From: librelois <elois@ifee.fr> Date: Fri, 2 Mar 2018 19:05:18 +0100 Subject: [PATCH] #1283 add build-lin-x86.sh --- release/arch/linux-x86/build-lin-x86.sh | 249 ++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 release/arch/linux-x86/build-lin-x86.sh diff --git a/release/arch/linux-x86/build-lin-x86.sh b/release/arch/linux-x86/build-lin-x86.sh new file mode 100644 index 000000000..06e5c29bc --- /dev/null +++ b/release/arch/linux-x86/build-lin-x86.sh @@ -0,0 +1,249 @@ +#!/bin/bash + +if [[ -z "${1}" ]]; then + echo "Fatal: no version given to build script" + exit 1 +fi +if [[ -s "$NVM_DIR/nvm.sh" ]]; then + source "$NVM_DIR/nvm.sh" +else + echo "Fatal: could not load nvm" + exit 1 +fi + +# --------- +# Functions +# --------- + +# Copy nw.js compiled module released library to node libraries. +# - +# Parameters: +# 1. Module name. +nw_copy() { + [[ -z ${1} ]] && exit 1 + cp lib/binding/Release/node-webkit-v${NW_VERSION}-linux-x86/${1}.node \ + lib/binding/Release/node-v${ADDON_VERSION}-linux-x86/${1}.node || exit 1 +} + +# Copy nw.js compiled module library to node libraries, prefixing with node_. +# - +# Parameters: +# 1. Module name. +nw_copy_node() { + [[ -z ${1} ]] && exit 1 + cp lib/binding/node-webkit-v${NW_VERSION}-linux-x86/node_${1}.node \ + lib/binding/node-v${ADDON_VERSION}-linux-x86/node_${1}.node || exit 1 +} + +# Compile the module with nw.js. +# - +# Parameters: +# 1. Module name. +# 2. Action to be done to module after compilation, if needed. +nw_compile() { + [[ -z ${1} ]] && exit 1 + cd ${1} || exit 1 + node-pre-gyp --runtime=node-webkit --target=${NW_VERSION} configure || exit 1 + node-pre-gyp --runtime=node-webkit --target=${NW_VERSION} build || exit 1 + [[ -z ${2} ]] || ${2} ${1} + cd .. +} + +# Create description. +# - +# Parameters: +# 1. Initial file name. +# 2. Building type (either “desktop” or “server”). +# 3. Category (OS, distribution). +create_desc() { + cat >"${1}".desc <<-EOF + { + "version": "${DUNITER_TAG}", + "job": "${CI_JOB_ID}", + "type": "${2^}", + "category": "${3}", + "arch": "x86" + } + EOF +} + +# Desktop specific building phase. +# - +# Parameters: +# 1. Building directory. +build_extra_desktop() { + cp -r "${ROOT}/release/extra/desktop/"* "${1}" || exit 1 +} + +# Server specific building phase. +# - +# Parameters: +# 1. Building directory. +build_extra_server() { + mkdir -p "${1}/lib/systemd/system" || exit 1 + cp "${ROOT}/release/extra/systemd/duniter.service" "${1}/lib/systemd/system" || exit 1 +} + +# Debian package building. +# - +# Parameters: +# 1. Building type (either “desktop” or “server”). +# 2. Debian package name. +build_deb_pack() { + rm -rf "${RELEASES}/duniter-x86" + mkdir "${RELEASES}/duniter-x86" || exit 1 + cp -r "${ROOT}/release/extra/debian/package/"* "${RELEASES}/duniter-x86" || exit 1 + build_extra_${1} "${RELEASES}/duniter-x86" + mkdir -p "${RELEASES}/duniter-x86/opt/duniter/" || exit 1 + chmod 755 "${RELEASES}/duniter-x86/DEBIAN/"post* || exit 1 + chmod 755 "${RELEASES}/duniter-x86/DEBIAN/"pre* || exit 1 + sed -i "s/Version:.*/Version:${DUNITER_DEB_VER}/g" "${RELEASES}/duniter-x86/DEBIAN/control" || exit 1 + + cd "${RELEASES}/${1}_/" + zip -qr "${RELEASES}/duniter-x86/opt/duniter/duniter.zip" * || exit 1 + + sed -i "s/Package: .*/Package: ${2}/g" "${RELEASES}/duniter-x86/DEBIAN/control" || exit 1 + + cd "${RELEASES}" + fakeroot dpkg-deb --build duniter-x86 || exit 1 + mv duniter-x86.deb "${BIN}/duniter-${1}-${DUNITER_TAG}-linux-x86.deb" || exit 1 + create_desc "${BIN}/duniter-${1}-${DUNITER_TAG}-linux-x86.deb" "${1}" "Linux (Ubuntu/Debian)" +} + +# ----------- +# Prepare +# ----------- + +NODE_VERSION=9.4.0 +NVER="v${NODE_VERSION}" +DUNITER_TAG="v${1}" +DUNITER_DEB_VER=" ${1}" +ADDON_VERSION=59 +NW_VERSION=0.28.0 +NW_RELEASE="v${NW_VERSION}" +NW="nwjs-${NW_RELEASE}-linux-x86" +NW_GZ="${NW}.tar.gz" +DUNITER_UI_VER="1.6.x" + +nvm install ${NVER} || exit 1 +nvm use ${NVER} || exit 1 +npm install -g node-pre-gyp || exit 1 +npm install -g nw-gyp || exit 1 + +# ----------- +# Folders +# ----------- + +ROOT="${PWD}" +WORK_NAME=work +WORK="${ROOT}/${WORK_NAME}" +DOWNLOADS="${WORK}/downloads" +RELEASES="${WORK}/releases" +BIN="${WORK}/bin" + +mkdir -p "${DOWNLOADS}" "${RELEASES}" "${BIN}" || exit 1 +rm -rf "${BIN}/"*.{deb,tar.gz}{,.desc} # Clean up + +# ----------- +# Downloads +# ----------- + +cd "${DOWNLOADS}" +curl -O https://dl.nwjs.io/${NW_RELEASE}/${NW_GZ} || exit 1 +tar xzf ${NW_GZ} || exit 1 +rm ${NW_GZ} +curl -O http://nodejs.org/dist/${NVER}/node-${NVER}-linux-x86.tar.gz || exit 1 +tar xzf node-${NVER}-linux-x86.tar.gz || exit 1 +rm node-${NVER}-linux-x86.tar.gz + +# ----------- +# Releases +# ----------- + +# Prepare sources +mkdir -p "${RELEASES}/duniter" || exit 1 +cp -r $(find "${ROOT}" -mindepth 1 -maxdepth 1 ! -name "${WORK_NAME}") "${RELEASES}/duniter" || exit 1 +cd "${RELEASES}/duniter" +rm -Rf .gitignore .git || exit 1 # Remove git files + +# Build +echo ">> VM: building modules..." +npm install || exit 1 + +# Duniter UI +npm install "duniter-ui@${DUNITER_UI_VER}" || exit 1 +npm prune --production || exit 1 + +rm -rf release coverage test # Non production folders +cp -r "${RELEASES}/duniter" "${RELEASES}/desktop_" || exit 1 +cp -r "${RELEASES}/duniter" "${RELEASES}/server_" || exit 1 + +# ------------------------------------- +# Build Desktop version against nw.js +# ------------------------------------- + +echo "${NW_RELEASE}" + +# FIX: bug of nw.js, we need to patch first. +# TODO: remove this patch once a correct version of Nw.js is out (NodeJS 8 or 9 if the above modules are compliant) +cd "${RELEASES}/desktop_/node_modules/wotb" +node-pre-gyp --runtime=node-webkit --target=$NW_VERSION configure \ + || echo "This failure is expected" + +cd "${RELEASES}/desktop_/node_modules/" +nw_compile wotb nw_copy +nw_compile naclb nw_copy +nw_compile scryptb nw_copy +nw_compile sqlite3 nw_copy_node + +# Unused binaries +cd "${RELEASES}/desktop_/" +rm -rf node_modules/sqlite3/build + +# -------------------------------- +# Embed nw.js in desktop version +# -------------------------------- + +# Install Nw.js +mkdir -p "${RELEASES}/desktop_release" || exit 1 +cp -r "${DOWNLOADS}/${NW}/"* "${RELEASES}/desktop_release/" || exit 1 +# Embed Node.js with Nw.js to make Duniter modules installable +cp -r "${DOWNLOADS}/node-${NVER}-linux-x86/lib" "${RELEASES}/desktop_release/" || exit 1 +cp -r "${DOWNLOADS}/node-${NVER}-linux-x86/include" "${RELEASES}/desktop_release/" || exit 1 +cp -r "${DOWNLOADS}/node-${NVER}-linux-86/bin" "${RELEASES}/desktop_release/" || exit 1 +# Add some specific files for GUI +cp "${RELEASES}/desktop_/gui/"* "${RELEASES}/desktop_release/" || exit 1 +# Add Duniter sources +cp -R "${RELEASES}/desktop_/"* "${RELEASES}/desktop_release/" || exit 1 +# Insert Nw specific fields while they do not exist (1.3.3) +sed -i "s/\"main\": \"index.js\",/\"main\": \"index.html\",/" "${RELEASES}/desktop_release/package.json" || exit 1 +# Add links for Node.js + NPM +cd "${RELEASES}/desktop_release/bin" +ln -s "../lib/node_modules/npm/bin/npm-cli.js" "./npm" -f || exit 1 +cd .. +ln -s "./bin/node" "node" -f || exit 1 +ln -s "./bin/npm" "npm" -f || exit 1 +#sed -i "s/\"node-main\": \"\.\.\/sources\/bin\/duniter\",/\"node-main\": \".\/bin\/duniter\",/" "$RELEASES/desktop_release/package.json" +rm -rf "${RELEASES}/desktop_" +mv "${RELEASES}/desktop_release" "${RELEASES}/desktop_" + +# --------------------------------- +# Embed node.js in server version +# --------------------------------- + +cp -r "${DOWNLOADS}/node-${NVER}-linux-x86" "${RELEASES}/server_/node" || exit 1 + +# --------------- +# Build .tar.gz +# --------------- + +cd "${RELEASES}/desktop_" +tar czf "${BIN}/duniter-desktop-${DUNITER_TAG}-linux-x86.tar.gz" * || exit 1 +create_desc "${BIN}/duniter-desktop-${DUNITER_TAG}-linux-x86.tar.gz" "Desktop" "Linux (generic)" + +# ----------------------- +# Build Debian packages +# ----------------------- + +build_deb_pack desktop duniter-desktop +build_deb_pack server duniter -- GitLab