Compare commits
No commits in common. "c9c854ed410a3292ed8d22e6961ff99a69c5cea0" and "1ff04d3e1e147c1bbcc92779eda79624eaeb916c" have entirely different histories.
c9c854ed41
...
1ff04d3e1e
30
docker/Dockerfile-app
Normal file
30
docker/Dockerfile-app
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
FROM ubuntu:focal
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
# Install Nginx, PHP and further necessary packages
|
||||||
|
RUN apt update --fix-missing
|
||||||
|
RUN apt install -y curl git unzip mariadb-client nginx \
|
||||||
|
php-apcu php-xdebug php7.4-cli php7.4-curl php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-zip php7.4-xml
|
||||||
|
|
||||||
|
# Configure Nginx with PHP
|
||||||
|
RUN mkdir -p /run/php
|
||||||
|
COPY configs/nginx.conf /etc/nginx/sites-available/default
|
||||||
|
RUN echo "xdebug.remote_enable = 1" >> /etc/php/7.4/mods-available/xdebug.ini
|
||||||
|
RUN echo "xdebug.remote_autostart = 1" >> /etc/php/7.4/mods-available/xdebug.ini
|
||||||
|
RUN echo "xdebug.remote_connect_back = 1" >> /etc/php/7.4/mods-available/xdebug.ini
|
||||||
|
|
||||||
|
# Install Composer
|
||||||
|
COPY scripts/install-composer.sh install-composer.sh
|
||||||
|
RUN ./install-composer.sh
|
||||||
|
|
||||||
|
# Install Node.js and required packages
|
||||||
|
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
|
||||||
|
RUN apt install -y nodejs
|
||||||
|
RUN npm install -g uglify-js clean-css-cli svgo yarn
|
||||||
|
|
||||||
|
EXPOSE 80
|
||||||
|
VOLUME /var/www/rvr
|
||||||
|
WORKDIR /var/www/rvr
|
||||||
|
|
||||||
|
ENTRYPOINT /usr/sbin/php-fpm7.4 -F & /usr/sbin/nginx -g 'daemon off;'
|
6
docker/Dockerfile-test
Normal file
6
docker/Dockerfile-test
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
FROM ubuntu:focal
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
RUN apt update && apt install -y curl git unzip php7.4-cli php7.4-mbstring php7.4-xml
|
||||||
|
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
@ -22,6 +22,6 @@ find public/static/css -type f -iname '*.css' -exec cleancss {} -o {} \;
|
|||||||
find public/static/img -type f -iname '*.svg' -exec svgo {} -o {} \;
|
find public/static/img -type f -iname '*.svg' -exec svgo {} -o {} \;
|
||||||
|
|
||||||
echo "Linking view files..."
|
echo "Linking view files..."
|
||||||
./rvr view:link
|
./mapg view:link
|
||||||
|
|
||||||
rm .env
|
rm .env
|
||||||
|
162
scripts/deploy-to-multiple-worktrees.py
Executable file
162
scripts/deploy-to-multiple-worktrees.py
Executable file
@ -0,0 +1,162 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
# Usage: ./deploy-to-multiple-worktrees.py REPO_PATH WORKTREE_DEVELOPMENT_PATH WORKTREE_PRODUCTION_PATH
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
|
||||||
|
WORKTREE_REGEX = r"^worktree (.*)\nHEAD ([a-f0-9]*)\n(?:branch refs\/heads\/(.*)|detached)$"
|
||||||
|
|
||||||
|
if len(sys.argv) < 4:
|
||||||
|
print("Usage: ./deploy-to-multiple-worktrees.py REPO_PATH WORKTREE_DEVELOPMENT_PATH WORKTREE_PRODUCTION_PATH")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
REPO = os.path.abspath(sys.argv[1])
|
||||||
|
WORKTREE_DEVELOPMENT = os.path.abspath(sys.argv[2])
|
||||||
|
WORKTREE_PRODUCTION = os.path.abspath(sys.argv[3])
|
||||||
|
|
||||||
|
class Worktree:
|
||||||
|
def __init__(self, path, branch, revision, version):
|
||||||
|
self.path = path
|
||||||
|
self.branch = branch
|
||||||
|
self.revision = revision
|
||||||
|
self.version = version
|
||||||
|
self.newRevision = None
|
||||||
|
self.newVersion = None
|
||||||
|
|
||||||
|
def getDataForWorktrees():
|
||||||
|
ret = subprocess.check_output(["git", "worktree", "list", "--porcelain"], cwd=REPO).decode().strip()
|
||||||
|
blocks = ret.split("\n\n")
|
||||||
|
|
||||||
|
worktrees = []
|
||||||
|
|
||||||
|
for block in blocks:
|
||||||
|
matches = re.search(WORKTREE_REGEX, block)
|
||||||
|
|
||||||
|
if matches:
|
||||||
|
path = matches.group(1)
|
||||||
|
revision = matches.group(2)
|
||||||
|
branch = matches.group(3)
|
||||||
|
version = getVersion(revision)
|
||||||
|
|
||||||
|
worktrees.append(Worktree(path, branch, revision, version))
|
||||||
|
|
||||||
|
return worktrees
|
||||||
|
|
||||||
|
def findWorktree(path):
|
||||||
|
for worktree in worktrees:
|
||||||
|
if worktree.path == path:
|
||||||
|
return worktree
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def getVersion(branch):
|
||||||
|
return subprocess.check_output(["git", "describe", "--tags", "--always", "--match", "Release_*", branch], cwd=REPO).decode().strip()
|
||||||
|
|
||||||
|
def getRevisionForRef(ref):
|
||||||
|
return subprocess.check_output(["git", "rev-list", "-1", ref], cwd=REPO).decode().strip()
|
||||||
|
|
||||||
|
def getLatestReleaseTag():
|
||||||
|
process = subprocess.Popen(["git", "for-each-ref", "refs/tags/Release*", "--sort=-creatordate", "--format=%(refname:short)"], stdout=subprocess.PIPE, cwd=REPO)
|
||||||
|
|
||||||
|
for line in process.stdout:
|
||||||
|
tag = line.decode().rstrip()
|
||||||
|
|
||||||
|
if isTagVerified(tag):
|
||||||
|
return tag
|
||||||
|
|
||||||
|
print(f"[WARNING] Tag '{tag}' is not verified, skipping.")
|
||||||
|
|
||||||
|
raise Exception("No verified 'Release*' tag found!")
|
||||||
|
|
||||||
|
def isTagVerified(tag):
|
||||||
|
process = subprocess.run(["git", "tag", "--verify", tag], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=REPO)
|
||||||
|
|
||||||
|
return process.returncode == 0
|
||||||
|
|
||||||
|
def updateRepoFromRemote():
|
||||||
|
subprocess.call(["git", "fetch", "origin", "--prune", "--prune-tags"], cwd=REPO)
|
||||||
|
|
||||||
|
def checkoutWorktree(worktreePath, ref):
|
||||||
|
subprocess.call(["git", "checkout", "-f", ref], cwd=worktreePath)
|
||||||
|
|
||||||
|
def cleanWorktree(worktreePath):
|
||||||
|
subprocess.call(["git", "clean", "-f", "-d"], cwd=worktreePath)
|
||||||
|
|
||||||
|
def updateAppInWorktree(worktreePath):
|
||||||
|
subprocess.call([worktreePath + "/scripts/update.sh"], cwd=worktreePath)
|
||||||
|
|
||||||
|
def updateAppVersionInWorktree(worktreePath):
|
||||||
|
subprocess.call([worktreePath + "/scripts/update-version.sh"], cwd=worktreePath)
|
||||||
|
|
||||||
|
worktrees = getDataForWorktrees()
|
||||||
|
|
||||||
|
updateRepoFromRemote()
|
||||||
|
|
||||||
|
print("Repo is updated from origin")
|
||||||
|
|
||||||
|
print("----------------------------------------------")
|
||||||
|
print("----------------------------------------------")
|
||||||
|
|
||||||
|
developmentWorktree = findWorktree(WORKTREE_DEVELOPMENT)
|
||||||
|
|
||||||
|
developmentWorktree.newRevision = getRevisionForRef(developmentWorktree.branch)
|
||||||
|
developmentWorktree.newVersion = getVersion(developmentWorktree.revision)
|
||||||
|
|
||||||
|
print("DEVELOPMENT (" + developmentWorktree.path + ") is on branch " + developmentWorktree.branch)
|
||||||
|
print(developmentWorktree.revision + " = " + developmentWorktree.branch + " (" + developmentWorktree.version + ")")
|
||||||
|
print(developmentWorktree.newRevision + " = origin/" + developmentWorktree.branch + " (" + developmentWorktree.newVersion + ")")
|
||||||
|
|
||||||
|
if developmentWorktree.revision != developmentWorktree.newRevision:
|
||||||
|
print("-> DEVELOPMENT (" + developmentWorktree.path + ") will be UPDATED")
|
||||||
|
print("----------------------------------------------")
|
||||||
|
|
||||||
|
checkoutWorktree(developmentWorktree.path, developmentWorktree.branch)
|
||||||
|
cleanWorktree(developmentWorktree.path)
|
||||||
|
|
||||||
|
print(developmentWorktree.path + " is checked out to " + developmentWorktree.branch + " and cleaned")
|
||||||
|
|
||||||
|
updateAppInWorktree(developmentWorktree.path)
|
||||||
|
updateAppVersionInWorktree(developmentWorktree.path)
|
||||||
|
|
||||||
|
print("RVR is updated in " + developmentWorktree.path)
|
||||||
|
elif developmentWorktree.version != developmentWorktree.newVersion:
|
||||||
|
print("-> DEVELOPMENT " + developmentWorktree.path + "'s version info will be UPDATED")
|
||||||
|
|
||||||
|
updateAppVersionInWorktree(developmentWorktree.path)
|
||||||
|
|
||||||
|
print("RVR version is updated in " + developmentWorktree.path)
|
||||||
|
else:
|
||||||
|
print("-> DEVELOPMENT (" + developmentWorktree.path + ") WON'T be updated")
|
||||||
|
|
||||||
|
print("----------------------------------------------")
|
||||||
|
print("----------------------------------------------")
|
||||||
|
|
||||||
|
productionWorktree = findWorktree(WORKTREE_PRODUCTION)
|
||||||
|
|
||||||
|
productionWorktree.newVersion = getLatestReleaseTag()
|
||||||
|
productionWorktree.newRevision = getRevisionForRef(productionWorktree.newVersion)
|
||||||
|
|
||||||
|
print("PRODUCTION (" + productionWorktree.path + ")")
|
||||||
|
print(productionWorktree.revision + " = " + productionWorktree.version)
|
||||||
|
print(productionWorktree.newRevision + " = " + productionWorktree.newVersion)
|
||||||
|
|
||||||
|
if productionWorktree.revision != productionWorktree.newRevision:
|
||||||
|
print("-> PRODUCTION (" + productionWorktree.path + ") will be UPDATED")
|
||||||
|
|
||||||
|
checkoutWorktree(productionWorktree.path, productionWorktree.newRevision)
|
||||||
|
cleanWorktree(productionWorktree.path)
|
||||||
|
|
||||||
|
print(productionWorktree.path + " is checked out to " + productionWorktree.newRevision + " and cleaned")
|
||||||
|
|
||||||
|
updateAppInWorktree(productionWorktree.path)
|
||||||
|
updateAppVersionInWorktree(productionWorktree.path)
|
||||||
|
|
||||||
|
print("RVR is updated in " + productionWorktree.path)
|
||||||
|
else:
|
||||||
|
print("-> PRODUCTION (" + productionWorktree.path + ") WON'T be updated")
|
||||||
|
|
||||||
|
print("----------------------------------------------")
|
||||||
|
print("----------------------------------------------")
|
32
scripts/install.sh
Executable file
32
scripts/install.sh
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ROOT_DIR=$(dirname $(readlink -f "$0"))/..
|
||||||
|
|
||||||
|
. ${ROOT_DIR}/.env
|
||||||
|
|
||||||
|
if [ -f ${ROOT_DIR}/installed ]; then
|
||||||
|
echo "RVR is already installed! To force reinstall, delete file 'installed' from the root directory!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing Yarn packages..."
|
||||||
|
(cd ${ROOT_DIR}/public/static && yarn install)
|
||||||
|
|
||||||
|
echo "Installing RVR DB..."
|
||||||
|
mysql --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} ${DB_NAME} < ${ROOT_DIR}/database/rvr.sql
|
||||||
|
|
||||||
|
echo "Migrating DB..."
|
||||||
|
(cd ${ROOT_DIR} && ./rvr db:migrate)
|
||||||
|
|
||||||
|
if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then
|
||||||
|
echo "Minifying JS, CSS and SVG files..."
|
||||||
|
${ROOT_DIR}/scripts/minify.sh
|
||||||
|
|
||||||
|
echo "Linking view files..."
|
||||||
|
(cd ${ROOT_DIR} && ./rvr view:link)
|
||||||
|
else
|
||||||
|
echo "Creating the first user..."
|
||||||
|
(cd ${ROOT_DIR} && ./rvr user:add rvr@rvr.dev 123456 admin)
|
||||||
|
fi
|
||||||
|
|
||||||
|
touch ${ROOT_DIR}/installed
|
11
scripts/minify.sh
Executable file
11
scripts/minify.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ROOT_DIR=$(dirname $(readlink -f "$0"))/..
|
||||||
|
|
||||||
|
. ${ROOT_DIR}/.env
|
||||||
|
|
||||||
|
find ${ROOT_DIR}/public/static/js -type f -iname '*.js' -exec uglifyjs {} -c -m -o {} \;
|
||||||
|
|
||||||
|
find ${ROOT_DIR}/public/static/css -type f -iname '*.css' -exec cleancss {} -o {} \;
|
||||||
|
|
||||||
|
find ${ROOT_DIR}/public/static/img -type f -iname '*.svg' -exec svgo {} -o {} \;
|
17
scripts/update-version.sh
Executable file
17
scripts/update-version.sh
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ROOT_DIR=$(dirname $(readlink -f "$0"))/..
|
||||||
|
|
||||||
|
. ${ROOT_DIR}/.env
|
||||||
|
|
||||||
|
cd ${ROOT_DIR}
|
||||||
|
|
||||||
|
echo "Updating version info..."
|
||||||
|
|
||||||
|
VERSION=$(git describe --tags --always --match "Release_*" HEAD)
|
||||||
|
REVISION=$(git rev-parse --short HEAD)
|
||||||
|
REVISION_DATE=$(git show -s --format=%aI HEAD)
|
||||||
|
|
||||||
|
sed -i -E "s/const VERSION = '(.*)';/const VERSION = '${VERSION}';/" app.php
|
||||||
|
sed -i -E "s/const REVISION = '(.*)';/const REVISION = '${REVISION}';/" app.php
|
||||||
|
sed -i -E "s/const REVISION_DATE = '(.*)';/const REVISION_DATE = '${REVISION_DATE}';/" app.php
|
26
scripts/update.sh
Executable file
26
scripts/update.sh
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ROOT_DIR=$(dirname $(readlink -f "$0"))/..
|
||||||
|
|
||||||
|
. ${ROOT_DIR}/.env
|
||||||
|
|
||||||
|
echo "Installing Composer packages..."
|
||||||
|
if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then
|
||||||
|
(cd ${ROOT_DIR} && composer install --no-dev)
|
||||||
|
else
|
||||||
|
(cd ${ROOT_DIR} && composer install --dev)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing Yarn packages..."
|
||||||
|
(cd ${ROOT_DIR}/public/static && yarn install)
|
||||||
|
|
||||||
|
echo "Migrating DB..."
|
||||||
|
(cd ${ROOT_DIR} && ./rvr db:migrate)
|
||||||
|
|
||||||
|
if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then
|
||||||
|
echo "Minifying JS, CSS and SVG files..."
|
||||||
|
${ROOT_DIR}/scripts/minify.sh
|
||||||
|
|
||||||
|
echo "Linking view files..."
|
||||||
|
(cd ${ROOT_DIR} && ./rvr view:link)
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user