From 14f16d6c2e8db1d99268c44a59aa86132c00eca3 Mon Sep 17 00:00:00 2001 From: Thorben Date: Wed, 9 May 2018 16:52:51 +0200 Subject: [PATCH] snap-packaging for gitea (#2568) * Modify tbraeutigam/gogs-snap for gitea * Fix building on 16.04 (manually build go-bindata). -> add _source.tar.bz2 to .gitignore (used by snapcraft cleanbuild) * Streamline Snap packaging: - Take advantage of install-hooks (snapd 2.27) - Use snapctl configuration storage for unchanging values * Move to using Snap Hooks for configuration * Missed re-adding daemon statement * Fix two warnings from Codacy. --- .gitignore | 10 +++ snap/helpers/app.ini | 66 +++++++++++++++++ snap/helpers/configuration.sh | 126 ++++++++++++++++++++++++++++++++ snap/helpers/simple_launcher.sh | 23 ++++++ snap/hooks/configure | 3 + snap/hooks/install | 45 ++++++++++++ snap/snapcraft.yaml | 121 ++++++++++++++++++++++++++++++ 7 files changed, 394 insertions(+) create mode 100644 snap/helpers/app.ini create mode 100755 snap/helpers/configuration.sh create mode 100755 snap/helpers/simple_launcher.sh create mode 100755 snap/hooks/configure create mode 100755 snap/hooks/install create mode 100644 snap/snapcraft.yaml diff --git a/.gitignore b/.gitignore index 94fbb8adc..9a5f01bb9 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,13 @@ coverage.all /integrations/mysql.ini /integrations/pgsql.ini /node_modules + + +# Snapcraft +snap/.snapcraft/ +parts/ +stage/ +prime/ +*.snap +*.snap-build +*_source.tar.bz2 diff --git a/snap/helpers/app.ini b/snap/helpers/app.ini new file mode 100644 index 000000000..dd7fa3c88 --- /dev/null +++ b/snap/helpers/app.ini @@ -0,0 +1,66 @@ +APP_NAME = Gitea: Go Git Service +RUN_USER = root +RUN_MODE = prod +CUSTOM_PATH = SNAP_DIR_DATA/custom + +[server] +DOMAIN = localhost +PROTOCOL = http +HTTP_PORT = 3001 +ROOT_URL = http://localhost:3001/ +DISABLE_SSH = false +SSH_PORT = 22 +STATIC_ROOT_PATH = SNAP_DIR_DATA/static +APP_DATA_PATH = SNAP_DIR_COMMON/data +SSH_ROOT = SNAP_DIR_COMMON/ssh +SSH_KEY_TEST_PATH = SNAP_DIR_DATA/sshkeytest + +[database] +DB_TYPE = sqlite3 +PATH = SNAP_DIR_COMMON/gitea.db + +[repository] +ROOT = SNAP_DIR_COMMON/repositories/data + +[repository.upload] +ENABLED = true +ALLOWED_TYPES = "image/jpeg|image/png" +FILE_MAX_SIZE = 10 +MAX_FILES = 5 +TEMP_PATH = SNAP_DIR_COMMON/repositories/tmp + +[release.attachment] +PATH = SNAP_DIR_COMMON/releases/attachments + +[smartypants] +ENABLED = true + +[indexer] +ISSUE_INDEXER_PATH = SNAP_DIR_COMMON/indexers/issues.bleve + + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false + +[picture] +AVATAR_UPLOAD_PATH = SNAP_DIR_COMMON/pictures/avatars +DISABLE_GRAVATAR = true +ENABLE_FEDERATED_AVATAR = false + +[attachment] +PATH = SNAP_DIR_COMMON/attachments + +[session] +PROVIDER = memory + +[log] +MODE = file +LEVEL = Trace +ROOT_PATH = SNAP_DIR_COMMON/log diff --git a/snap/helpers/configuration.sh b/snap/helpers/configuration.sh new file mode 100755 index 000000000..34b7fc7af --- /dev/null +++ b/snap/helpers/configuration.sh @@ -0,0 +1,126 @@ +#!/bin/bash +if snapctl get gitea.snap.custom; then + cdir=$(snapctl get gitea.snap.custom) +else + cdir=$SNAP_COMMON +fi + +cfg="$cdir/conf/app.ini" +bak="$cdir/conf/app.ini.bak-$(date -Ins)" +basecfg="$SNAP/snap/helpers/app.ini" +smp="$SNAP/gitea/custom/conf/app.ini.sample" + +function toSnap() { +OIFS=$IFS +IFS=' +' + category="none" + src="$cfg" + [[ "$1" = "init" ]] && src="$smp" + [[ "$1" = "snap" ]] && src="$basecfg" + + for l in $(sed 's_;\([A-Z]*\)_\1_g' $src | grep -v -e '^;' -e '^$'); do + if echo $l | grep -q '^[[]'; then + category=$(CatToSnap "$l") + elif echo $l | grep -q '^[A-Z]'; then + option=$(OptToSnap "$l") + value=$(ValToSnap "$l") + if [[ $category = "none" ]]; then + snapctl set "$option=$value" + else + snapctl set "$category.$option=$value" + fi + fi + done +IFS=$OIFS +} + +function toIni() { +OIFS=$IFS +IFS=' +' + category="none"; option="none"; catUnset=true + src=$smp + [[ -f $cfg ]] && src="$cfg" + tmpIni="$cfg.tmp" + [[ -f $src ]] && cp "$src" "$tmpIni" + cp $tmpIni $bak + echo '' > $cfg + for l in $(grep -v -e '^;' -e '^$' $tmpIni); do + if echo $l | grep -q '^[[]'; then + category=$(CatToSnap "$l") + catUnset=true + elif echo $l | grep -q '^[A-Z]'; then + option=$(OptToSnap "$l") + if [[ $category = "none" ]]; then + value=$(snapctl get $option) + echo $(OptToIni "$option") = $value >> $cfg + else + value=$(snapctl get $category.$option) + if $catUnset; then + echo "" >> $cfg + echo "[$(CatToIni "$category")]" >> $cfg + catUnset=false + fi + echo $(OptToIni "$option") = $value >> $cfg + fi + fi + done; + IFS=$OIFS +} + +function CatToSnap { + ret=$(echo "$1" \ + | grep -oP '[A-Za-z0-9._]+' \ + | sed 's|\.|-|g' \ + | sed 's|_|99|g') + echo $ret +} +function OptToSnap { + ret=$(echo "$1" \ + | grep -oP '^[A-Z_]+' \ + | tr '[:upper:]' '[:lower:]' \ + | sed 's|_|-|g') + echo $ret +} +function ValToSnap { + ret=$(echo "$1" \ + | grep -oP '=.*$' \ + | sed 's_^= __g' \ + | sed 's_^=__g' \ + | sed "s|SNAP_DIR_DATA|$SDATA|g" \ + | sed "s|SNAP_DIR_COMMON|$SCOMMON|g" \ + | sed 's|{}||g') + echo $ret +} + +function CatToIni { + ret=$(echo "$1" \ + | sed 's|-|.|g' \ + | sed 's|\ |_|g' \ + | sed 's|99|_|g') + echo $ret +} +function OptToIni { + ret=$(echo "$1" \ + | tr '[:lower:]' '[:upper:]' \ + | sed 's|-|_|g') + echo $ret +} + +[[ "$1" = "configure" ]] \ + && toIni \ + && exit 0 + +[[ "$1" = "install" ]] \ + && echo "Initial Configuration..." \ + && mkdir -p $SNAP_COMMON/conf \ + && toSnap init \ + && toSnap snap \ + && toIni sample \ + && exit 0 + +[[ "$1" = "save" ]] \ + && echo "Saving current config..." \ + && toSnap \ + && exit 0 diff --git a/snap/helpers/simple_launcher.sh b/snap/helpers/simple_launcher.sh new file mode 100755 index 000000000..8a12e3b8d --- /dev/null +++ b/snap/helpers/simple_launcher.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if ! env | grep -q root; then + echo " + +----------------------------------------+ + | You are not running gitea as root. | + | This is required for the snap package. | + | Please re-run as root. | + +----------------------------------------+ +" + $SNAP/gitea/gitea --help + exit 1 +fi + +# Set usernames for gitea +export USERNAME=root +export USER=root + +export GITEA_WORK_DIR=$(snapctl get gitea.snap.workdir) +export GITEA_CUSTOM=$(snapctl get gitea.snap.custom) + +$SNAP/bin/gconfig save +cd $SNAP/gitea; ./gitea $@ diff --git a/snap/hooks/configure b/snap/hooks/configure new file mode 100755 index 000000000..fd7bc3da1 --- /dev/null +++ b/snap/hooks/configure @@ -0,0 +1,3 @@ +#!/bin/bash + +$SNAP/bin/gconfig configure diff --git a/snap/hooks/install b/snap/hooks/install new file mode 100755 index 000000000..dea6c268f --- /dev/null +++ b/snap/hooks/install @@ -0,0 +1,45 @@ +#!/bin/bash + +export SDATA=$(echo $SNAP_DATA | sed "s|$SNAP_REVISION|current|") +export SCOMMON="$SNAP_COMMON" +export isRoot=`true` +snapctl set gitea.snap.workdir="$SDATA/custom" +snapctl set gitea.snap.custom="$SCOMMON" + +function mkDirCommon(){ + for dir in $@; do + mkdir -p "$SCOMMON/$dir" + done +} + +function mkdirData(){ + for dir in $@; do + mkdir -p "$SDATA/$dir" + if [ -d $SNAP/$dir ]; then + cp -r --preserve=mode \ + $SNAP/$dir/* \ + $SNAP/$dir/.[a-zA-Z0-9-]* \ + $SDATA/$dir/ 2> $SCOMMON/log/snap-mkdirData.log + fi + done +} + +mkDirCommon pictures \ + repositories \ + attachments \ + data \ + log + +mkdirData certs \ + sshkeytest \ + custom/conf \ + static/templates \ + static/scripts \ + static/public + +[[ -f $SNAP_COMMON/conf/app.ini ]] || $SNAP/bin/gconfig install + +# Configure Git to use the right templates +mkdir -p $SDATA/git/ +cp -r --preserve=mode $SNAP/usr/share/git-core/templates $SDATA/git/ +$SNAP/usr/bin/git config --global init.templateDir $SDATA/git/templates/ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 000000000..7439f50f2 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,121 @@ +name: gitea +summary: Gitea - A painless self-hosted Git service +description: | + The goal of this project is to make the easiest, fastest, and most painless + way of setting up a self-hosted Git service. With Go, this can be done with + an independent binary distribution across ALL platforms that Go supports, + including Linux, Mac OS X, Windows and ARM. + +type: app +icon: public/img/gitea-lg.png +confinement: strict +grade: stable + +version: 'git' + +apps: + gitea: + command: bin/gitea + plugs: [network, network-bind] + web: + command: bin/gitea web + daemon: simple + plugs: [network, network-bind] + serv: + command: bin/gitea serv + plugs: [network, network-bind] + admin: + command: bin/gitea admin + plugs: [network, network-bind] + cert: + command: bin/gitea cert + hook: + command: bin/gitea hook + plugs: [network, network-bind] + dump: + command: bin/gitea dump + plugs: [home] + help: + command: bin/gitea --help + version: + command: bin/gitea --version + sqlite: + command: usr/bin/sqlite3 + +parts: + go: + source-tag: go1.8.3 + prime: + - -* + + gitea: + plugin: nil + source: . + source-type: git + after: [ go ] + stage-packages: [ git, sqlite3, openssh-client ] + build-packages: [ libpam0g-dev, libsqlite3-dev] + prepare: | + export PATH=$SNAPCRAFT_PART_INSTALL/../../go/install/bin:$PATH + export GOPATH=$SNAPCRAFT_PART_INSTALL/../go + export bld=$SNAPCRAFT_PART_INSTALL/../build + export src=$SNAPCRAFT_PART_INSTALL/../src + mkdir -p $GOPATH/src/code.gitea.io/gitea + cp -r $src/* $GOPATH/src/code.gitea.io/gitea + build: | + export PATH=$SNAPCRAFT_PART_INSTALL/../go/bin/:$SNAPCRAFT_PART_INSTALL/../../go/install/bin:$PATH + export GOPATH=$SNAPCRAFT_PART_INSTALL/../go + go get -u github.com/jteeuwen/go-bindata/... + cd $GOPATH/src/code.gitea.io/gitea + TAGS="bindata sqlite pam cert" make generate build + install: | + # Set Convenience Variables + src=$SNAPCRAFT_PART_INSTALL/../go/src/code.gitea.io/gitea + giteaBase=$SNAPCRAFT_PART_INSTALL/gitea + scurrent=/var/snap/$SNAPCRAFT_PROJECT_NAME/current + scommon=/var/snap/$SNAPCRAFT_PROJECT_NAME/common + # Copy build artifact and necessary files + mkdir -p $giteaBase/conf + # Workaround for gitea ignoring APP_DATA_PATH in app.ini after snap update. + ln -s $scurrent/custom $giteaBase/custom + ln -s $scommon/data $giteaBase/data + # Workaround for cmd/certs not knowing how to put files somewhere else + ln -s $scurrent/cert.pem $giteaBase/cert.pem + ln -s $scurrent/key.pem $giteaBase/key.pem + # Copy static content + mkdir -p $SNAPCRAFT_PART_INSTALL/static + cp $src/gitea $giteaBase/ + cp -r $src/LICENSE \ + $src/templates \ + $src/public \ + $src/scripts \ + $SNAPCRAFT_PART_INSTALL/static/ + cp -r $src/README.md \ + $src/LICENSE \ + $src/custom \ + $SNAPCRAFT_PART_INSTALL/ + prime: + - -etc + - -usr/lib/systemd + - -usr/lib/gcc + - -usr/lib/sasl2 + - -usr/lib/x86_64-linux-gnu/krb5 + - -usr/share/apport + - -usr/share/bash-completion + - -usr/share/doc + - -usr/share/git-core/contrib + - -usr/share/man + - -usr/share/upstart + - -var + + helpers: + plugin: dump + source: snap/helpers + organize: + simple_launcher.sh: bin/gitea + app.ini: gitea/snapApp.ini + configuration.sh: bin/gconfig + prime: + - bin/gitea + - bin/gconfig + - gitea/snapApp.ini