diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 34d65d817..9392b7f82 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -109,13 +109,13 @@ jobs: needs: build-deb strategy: matrix: - distro: - - debian10 - - debian11 - - debian12 - - ubuntu2004 - - ubuntu2204 - - ubuntu2404 + image: + - geerlingguy/docker-debian10-ansible:latest + - geerlingguy/docker-debian11-ansible:latest + - geerlingguy/docker-debian12-ansible:latest + - geerlingguy/docker-ubuntu2004-ansible:latest + - geerlingguy/docker-ubuntu2204-ansible:latest + - geerlingguy/docker-ubuntu2404-ansible:latest steps: - uses: actions/checkout@v4.1.7 - uses: actions/download-artifact@v4.1.8 @@ -129,7 +129,28 @@ jobs: with: molecule_working_dir: './deployment/ansible/gnomeshade' env: - MOLECULE_DISTRO: ${{ matrix.distro }} + MOLECULE_IMAGE: ${{ matrix.image }} + + test-deb: + name: Test debian package + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: build-deb + strategy: + matrix: + dir: + - deployment/docker/devuan/chimaera + - deployment/docker/devuan/daedalus + steps: + - uses: actions/checkout@v4.1.7 + - uses: actions/download-artifact@v4.1.8 + id: download + with: + name: Gnomeshade.WebApi_linux-x64.deb + + - name: Test debian package + working-directory: ${{ matrix.dir }} + run: ../../../test-deb.sh ${{ steps.download.outputs.download-path }}/gnomeshade.deb ${{ secrets.DEMO_ADMIN_PASSWORD }} docker: name: Test docker container diff --git a/deployment/ansible/gnomeshade/molecule/default/molecule.yml b/deployment/ansible/gnomeshade/molecule/default/molecule.yml index 3bcc827b1..296ee79dc 100644 --- a/deployment/ansible/gnomeshade/molecule/default/molecule.yml +++ b/deployment/ansible/gnomeshade/molecule/default/molecule.yml @@ -5,7 +5,7 @@ driver: name: docker platforms: - name: instance - image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest" + image: "${MOLECULE_IMAGE}" command: ${MOLECULE_DOCKER_COMMAND:-""} volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw diff --git a/deployment/debian.sh b/deployment/debian.sh index 2ec407fc3..9d0ef8912 100755 --- a/deployment/debian.sh +++ b/deployment/debian.sh @@ -1,50 +1,33 @@ #!/bin/bash set -e -sudo apt update -sudo apt install lintian -y +sudo apt-get update +sudo apt-get install lintian moreutils -y archive_path="$1" version=$(cat version) full_version="$version.$2" -changelog_path="gnomeshade/usr/share/doc/gnomeshade/changelog.gz" maintainer_email="valters.melnalksnis@gnomeshade.org" maintainer="Valters Melnalksnis <$maintainer_email>" -time="Fri, 24 Jun 2022 19:28:01 +0200" -mkdir -p gnomeshade/opt/gnomeshade -unzip "$archive_path" -d gnomeshade/opt/gnomeshade +mkdir -p ./deployment/debian/gnomeshade/opt/gnomeshade +unzip "$archive_path" -d ./deployment/debian/gnomeshade/opt/gnomeshade -chmod +x gnomeshade/opt/gnomeshade/Gnomeshade.WebApi +cd ./deployment/debian/ +mv gnomeshade/opt/gnomeshade/appsettings.json gnomeshade/etc/opt/gnomeshade/appsettings.json +chmod +x gnomeshade/opt/gnomeshade/Gnomeshade.WebApi chmod 0755 gnomeshade/opt/gnomeshade/libe_sqlite3.so strip gnomeshade/opt/gnomeshade/libe_sqlite3.so -mkdir -p gnomeshade/DEBIAN -cp deployment/debian/postinst gnomeshade/DEBIAN/postinst -cp deployment/debian/prerm gnomeshade/DEBIAN/prerm - export FULL_VERSION=$full_version export MAINTAINER=$maintainer -envsubst gnomeshade/DEBIAN/control - -mkdir -p gnomeshade/etc/opt/gnomeshade -mv gnomeshade/opt/gnomeshade/appsettings.json gnomeshade/etc/opt/gnomeshade/appsettings.json -echo "/etc/opt/gnomeshade/appsettings.json" >>gnomeshade/DEBIAN/conffiles - -mkdir -p gnomeshade/usr/share/doc/gnomeshade export MAINTAINER_EMAIL=$maintainer_email -envsubst gnomeshade/usr/share/doc/gnomeshade/copyright - -export CHANGELOG_TIME=$time -envsubst changelog -cat changelog -gzip -n --best changelog -mv changelog.gz $changelog_path - -mkdir -p gnomeshade/lib/systemd/system -cp deployment/debian/gnomeshade.service gnomeshade/lib/systemd/system/gnomeshade.service +envsubst < gnomeshade/DEBIAN/control | sponge gnomeshade/DEBIAN/control +envsubst < gnomeshade/usr/share/doc/gnomeshade/copyright | sponge gnomeshade/usr/share/doc/gnomeshade/copyright +envsubst < gnomeshade/usr/share/doc/gnomeshade/changelog | gzip --no-name --best > "gnomeshade/usr/share/doc/gnomeshade/changelog.gz" +rm gnomeshade/usr/share/doc/gnomeshade/changelog dpkg-deb --root-owner-group --build gnomeshade @@ -54,3 +37,6 @@ lintian \ --suppress-tags dir-or-file-in-opt,dir-or-file-in-etc-opt \ --suppress-tags unstripped-binary-or-object \ gnomeshade.deb + +cd ../../ +mv ./deployment/debian/gnomeshade.deb ./gnomeshade.deb diff --git a/deployment/debian/gnomeshade/DEBIAN/conffiles b/deployment/debian/gnomeshade/DEBIAN/conffiles new file mode 100644 index 000000000..520a81bb0 --- /dev/null +++ b/deployment/debian/gnomeshade/DEBIAN/conffiles @@ -0,0 +1,2 @@ +/etc/opt/gnomeshade/appsettings.json +/etc/init.d/gnomeshade diff --git a/deployment/debian/control b/deployment/debian/gnomeshade/DEBIAN/control similarity index 100% rename from deployment/debian/control rename to deployment/debian/gnomeshade/DEBIAN/control diff --git a/deployment/debian/postinst b/deployment/debian/gnomeshade/DEBIAN/postinst similarity index 58% rename from deployment/debian/postinst rename to deployment/debian/gnomeshade/DEBIAN/postinst index 71a760be8..b4c7f23c4 100755 --- a/deployment/debian/postinst +++ b/deployment/debian/gnomeshade/DEBIAN/postinst @@ -3,11 +3,13 @@ set -e GNOMESHADE_USER=gnomeshade -if [[ -z "$(getent group ${GNOMESHADE_USER})" ]]; then +if [[ -z "$(getent group ${GNOMESHADE_USER})" ]] +then addgroup --system ${GNOMESHADE_USER} fi -if [[ -z "$(getent passwd ${GNOMESHADE_USER})" ]]; then +if [[ -z "$(getent passwd ${GNOMESHADE_USER})" ]] +then adduser \ --system --ingroup ${GNOMESHADE_USER} ${GNOMESHADE_USER} \ --no-create-home --home /nonexistent \ @@ -17,4 +19,9 @@ fi chown gnomeshade /etc/opt/gnomeshade --recursive chown gnomeshade /opt/gnomeshade --recursive -deb-systemd-invoke enable gnomeshade.service +if [[ $(systemctl) =~ -\.mount ]] +then + deb-systemd-invoke enable gnomeshade.service +else + update-rc.d gnomeshade defaults +fi diff --git a/deployment/debian/gnomeshade/DEBIAN/postrm b/deployment/debian/gnomeshade/DEBIAN/postrm new file mode 100755 index 000000000..89760e8ce --- /dev/null +++ b/deployment/debian/gnomeshade/DEBIAN/postrm @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +if [[ $(systemctl) =~ -\.mount ]] +then + exit +else + update-rc.d gnomeshade remove +fi diff --git a/deployment/debian/gnomeshade/DEBIAN/prerm b/deployment/debian/gnomeshade/DEBIAN/prerm new file mode 100755 index 000000000..e703ecddd --- /dev/null +++ b/deployment/debian/gnomeshade/DEBIAN/prerm @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +if [[ $(systemctl) =~ -\.mount ]] +then + deb-systemd-invoke stop gnomeshade.service +else + exit +fi diff --git a/deployment/debian/gnomeshade/etc/init.d/gnomeshade b/deployment/debian/gnomeshade/etc/init.d/gnomeshade new file mode 100755 index 000000000..c12e84a1d --- /dev/null +++ b/deployment/debian/gnomeshade/etc/init.d/gnomeshade @@ -0,0 +1,119 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: gnomeshade +# Required-Start: $local_fs $network +# Required-Stop: $local_fs $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Gnomeshade server +### END INIT INFO + +# Source LSB helpers +. /lib/lsb/init-functions + +# Process name (for display only) +NAME=gnomeshade + +# Where is the actual executable for the daemon +DAEMON=/opt/gnomeshade/Gnomeshade.WebApi +WORKING_DIRECTORY=/etc/opt/gnomeshade + +# The user:group under which the daemon must run +RUN_AS_USER=gnomeshade + +# pid file for the daemon +PIDFILE=/var/run/gnomeshade.pid + +# If the daemon is not there, then exit. +if ! [ -x ${DAEMON} ] +then + log_failure_msg "Cannot find an executable at ${DAEMON}" + exit 1 +fi + +case $1 in + start) + # Check if pidfile exists + if [ -e ${PIDFILE} ] + then + # Check the actual status of process + status_of_proc -p ${PIDFILE} ${DAEMON} ${NAME} && status="0" || status="$?" + # If the status is successfully, no need to start again. + [ "${status}" = "0" ] && exit 0 + fi + # Start the daemon. + log_daemon_msg "Starting ${NAME}" + # Start the daemon with the help of start-stop-daemon + if ASPNETCORE_WEBROOT=/opt/gnomeshade/wwwroot DOTNET_gcServer=0 start-stop-daemon --start --quiet --oknodo --pidfile ${PIDFILE} --make-pidfile --background \ + --chuid ${RUN_AS_USER} --chdir ${WORKING_DIRECTORY} --no-close --startas ${DAEMON} -- --ENVIRONMENT=Production >> /var/log/gnomeshade + then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + stop) + if [ -e ${PIDFILE} ] + then + status_of_proc -p ${PIDFILE} ${DAEMON} ${NAME} && status="0" || status="$?" + if [ "$status" = "0" ]; then + log_daemon_msg "Stopping ${NAME}" + if start-stop-daemon -K --signal TERM --quiet --oknodo --pidfile ${PIDFILE} + then + log_end_msg 0 + rm -rf ${PIDFILE} + else + log_end_msg 1 + fi + fi + else + log_daemon_msg "${NAME} is not running" + log_end_msg 0 + fi + ;; + restart) + $0 stop && sleep 3 && $0 start + ;; + status) + # Check the status of the process. + if [ -e ${PIDFILE} ] + then + status_of_proc -p ${PIDFILE} ${DAEMON} ${NAME} && exit 0 || exit $? + else + log_daemon_msg "${NAME} is not running (no pidfile)" + log_end_msg 0 + fi + ;; + reload) + if [ -e ${PIDFILE} ]; then + log_daemon_msg "Reloading ${NAME}" + if start-stop-daemon -K --quiet --signal HUP --pidfile ${PIDFILE} + then + log_end_msg 0 + else + log_end_msg 1 + fi + else + log_failure_msg "Cannot find pidfile at ${PIDFILE}" + fi + ;; + force-reload) + if [ -e ${PIDFILE} ]; then + log_daemon_msg "Reloading ${NAME}" + if start-stop-daemon -K --quiet --signal HUP --pidfile ${PIDFILE} + then + log_end_msg 0 + else + log_end_msg 1 + fi + else + log_failure_msg "Cannot find pidfile at ${PIDFILE}" + fi + ;; + *) + # Invalid argument, print the usage message. + echo "Usage: $0 {start|stop|restart|reload|force-reload|status}" + exit 2 + ;; +esac diff --git a/deployment/debian/gnomeshade/etc/opt/gnomeshade/appsettings.json b/deployment/debian/gnomeshade/etc/opt/gnomeshade/appsettings.json new file mode 120000 index 000000000..b0416d90b --- /dev/null +++ b/deployment/debian/gnomeshade/etc/opt/gnomeshade/appsettings.json @@ -0,0 +1 @@ +C:/Users/valte/Documents/GitHub/Gnomeshade/source/Gnomeshade.WebApi/appsettings.json \ No newline at end of file diff --git a/deployment/debian/gnomeshade.service b/deployment/debian/gnomeshade/lib/systemd/system/gnomeshade.service similarity index 100% rename from deployment/debian/gnomeshade.service rename to deployment/debian/gnomeshade/lib/systemd/system/gnomeshade.service diff --git a/deployment/debian/changelog b/deployment/debian/gnomeshade/usr/share/doc/gnomeshade/changelog similarity index 56% rename from deployment/debian/changelog rename to deployment/debian/gnomeshade/usr/share/doc/gnomeshade/changelog index e6148d697..0e0b3ae26 100644 --- a/deployment/debian/changelog +++ b/deployment/debian/gnomeshade/usr/share/doc/gnomeshade/changelog @@ -2,4 +2,4 @@ gnomeshade (${FULL_VERSION}) stable; urgency=low * Placeholder - -- ${MAINTAINER} ${CHANGELOG_TIME} + -- ${MAINTAINER} Fri, 24 Jun 2022 19:28:01 +0200 diff --git a/deployment/debian/copyright b/deployment/debian/gnomeshade/usr/share/doc/gnomeshade/copyright similarity index 100% rename from deployment/debian/copyright rename to deployment/debian/gnomeshade/usr/share/doc/gnomeshade/copyright diff --git a/deployment/debian/prerm b/deployment/debian/prerm deleted file mode 100755 index 08727411a..000000000 --- a/deployment/debian/prerm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -e - -deb-systemd-invoke stop gnomeshade.service diff --git a/deployment/docker/devuan/chimaera/Dockerfile b/deployment/docker/devuan/chimaera/Dockerfile new file mode 100644 index 000000000..7cd2c7461 --- /dev/null +++ b/deployment/docker/devuan/chimaera/Dockerfile @@ -0,0 +1,8 @@ +FROM devuan/devuan:chimaera + +COPY gnomeshade.deb /gnomeshade.deb + +RUN apt-get update && apt-get install -y libicu67 libssl1.1 libgssapi-krb5-2 +RUN dpkg -i /gnomeshade.deb + +EXPOSE 5000 diff --git a/deployment/docker/devuan/daedalus/Dockerfile b/deployment/docker/devuan/daedalus/Dockerfile new file mode 100644 index 000000000..f45d93591 --- /dev/null +++ b/deployment/docker/devuan/daedalus/Dockerfile @@ -0,0 +1,8 @@ +FROM devuan/devuan:daedalus + +COPY gnomeshade.deb /gnomeshade.deb + +RUN apt-get update && apt-get install -y libicu72 libssl3 libgssapi-krb5-2 +RUN dpkg -i /gnomeshade.deb + +EXPOSE 5000 diff --git a/deployment/docker/Dockerfile b/deployment/docker/gnomeshade-build/Dockerfile similarity index 100% rename from deployment/docker/Dockerfile rename to deployment/docker/gnomeshade-build/Dockerfile diff --git a/deployment/publish.sh b/deployment/publish.sh index 6e3d2220d..ea37353b4 100755 --- a/deployment/publish.sh +++ b/deployment/publish.sh @@ -30,7 +30,7 @@ fi ( cd "$publish_dir" || exit - zip -r -9 "$archive_name" . + zip -r -9 "$archive_name" . -x ./Node/\* ) echo "artifact-name=$archive_name" >>"$GITHUB_OUTPUT" diff --git a/deployment/test-deb.sh b/deployment/test-deb.sh new file mode 100755 index 000000000..750a92519 --- /dev/null +++ b/deployment/test-deb.sh @@ -0,0 +1,70 @@ +#!/bin/bash +set -e + +name="test" + +function printLogs() { + docker logs $name + docker exec $name service --status-all + docker exec $name cat /var/log/gnomeshade +} + +trap printLogs EXIT + +cp "$1" ./gnomeshade.deb + +docker build --tag devuan:test ./ +docker run --detach --name $name --publish 5000:5000 \ + devuan:test /bin/bash -c \ + "while true; do sleep 2; done" + +url="http://[::]:5000" +cat > ./appsettings.Production.json<< EOF +{ + "Kestrel": { + "Endpoints": { + "Http": { + "Url": "$url" + } + } + }, + "Admin": { + "Password": "$2" + }, + "ConnectionStrings": { + "Gnomeshade": "Data Source=/opt/gnomeshade/gnomeshade.db" + }, + "Database": { + "Provider": "Sqlite" + }, + "Jwt": { + "ValidAudience": "$url", + "ValidIssuer": "$url", + "Secret": "00000000000000000000000000000000" + }, + "GNOMESHADE_DEMO": true +} +EOF + +docker cp ./appsettings.Production.json $name:/etc/opt/gnomeshade/appsettings.Production.json +docker exec $name service gnomeshade start + +wget --tries=10 --retry-connrefused --waitretry=1 --timeout=15 "http://localhost:5000/api/v1.0/health" + +if [[ $(cat health) != "Healthy" ]]; then + exit 1 +fi + +http_response=$(curl --header "Content-Type: application/json" \ + --request POST \ + --data '{"username":"demo", "password": "Demo1!" }' \ + --output response \ + --write-out "%{response_code}" \ + --verbose \ + http://localhost:5000/api/v1.0/Authentication/Login) +cat response + +if [[ $http_response != "200" ]] +then + exit 1 +fi diff --git a/deployment/test-docker.sh b/deployment/test-docker.sh index 755eaf40c..4c98f4934 100755 --- a/deployment/test-docker.sh +++ b/deployment/test-docker.sh @@ -11,15 +11,25 @@ function printLogs() { trap printLogs EXIT docker build --tag $tag --build-arg "BUILD_NUMBER=$1" ./ -docker run --name $name -d -p 8000:8080 -e "Admin__Password=$2" $tag +docker run --name $name -d -p 8000:8080 -e "Admin__Password=$2" -e "GNOMESHADE_DEMO=true" $tag wget --tries=10 --retry-connrefused --waitretry=1 --timeout=15 "http://localhost:8000/api/v1.0/health" -if [[ $(cat health) != "Healthy" ]]; then +if [[ $(cat health) != "Healthy" ]] +then exit 1 fi -curl --header "Content-Type: application/json" \ - --request POST \ - --data '{"username":"john.doe", "password": "Password123!", "email": "john.doe@example.com", "fullName": "John Doe" }' \ - http://localhost:8000/Authorization/Register +http_response=$(curl --header "Content-Type: application/json" \ + --request POST \ + --data '{"username":"demo", "password": "Demo1!" }' \ + --output response \ + --write-out "%{response_code}" \ + --verbose \ + http://localhost:8000/api/v1.0/Authentication/Login) +cat response + +if [[ $http_response != "200" ]] +then + exit 1 +fi