diff --git a/.gitea/workflows/setup_docker.yml b/.gitea/workflows/setup_docker.yml index 4fee3dd09..af0a9b970 100644 --- a/.gitea/workflows/setup_docker.yml +++ b/.gitea/workflows/setup_docker.yml @@ -3,9 +3,9 @@ on: push: branches: - main - jobs: setup_docker: + if: contains(github.event.head_commit.message, '@docker') runs-on: host strategy: matrix: @@ -46,7 +46,7 @@ jobs: run: make stop_server_docker - name: Generate Config - run: make gen_config + run: make gen_config_docker - name: Build Image run: make build_image diff --git a/.gitea/workflows/setup_native.yml b/.gitea/workflows/setup_native.yml new file mode 100644 index 000000000..130dc1179 --- /dev/null +++ b/.gitea/workflows/setup_native.yml @@ -0,0 +1,49 @@ +name: Setup Docker Action +on: + push: + branches: + - main + +jobs: + setup_docker: + runs-on: host + strategy: + matrix: + python: + - 3.12.7 + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + - name: Clean up Virtual Environment by branch + run: ./setup/clean_up_virtualenvs.sh 0 + + - name: Create Virtual Environment + run: | + export PATH="$HOME/.pyenv/bin:$PATH" + eval "$(pyenv init --path)" + eval "$(pyenv init -)" + eval "$(pyenv virtualenv-init -)" + pyenv virtualenv ${{ matrix.python }} "${{ github.ref_name }}-$(git rev-parse --short "$GITHUB_SHA")" + + - name: Activate Virtual Environment + run: | + export PATH="$HOME/.pyenv/bin:$PATH" + eval "$(pyenv init --path)" + eval "$(pyenv init -)" + eval "$(pyenv virtualenv-init -)" + pyenv activate "${{ github.ref_name }}-$(git rev-parse --short "$GITHUB_SHA")" + python --version # Confirm Python version + + - name: Install dotenv + run: pip install python-dotenv + + - name: Setup + run: make install + + - name: Generate Config + run: make gen_config + + - name: Run Tests + run: make run_test diff --git a/.github/workflows/setup_docker.yml b/.github/workflows/setup_docker.yml index 164a3d472..a50208b8d 100644 --- a/.github/workflows/setup_docker.yml +++ b/.github/workflows/setup_docker.yml @@ -40,7 +40,7 @@ jobs: run: make stop_server_docker - name: Generate Config - run: make gen_config + run: make gen_config_docker - name: Build Image run: make build_image diff --git a/Jenkinsfile b/Jenkinsfile index 012b0ace3..099bdd80e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,7 +11,7 @@ node('Node-Dev-100163') { stage('Build') { // sh 'make install' sh 'make stop_server_docker' - sh 'make gen_config' + sh 'make gen_config_docker' sh 'make build_image' } stage('Start'){ diff --git a/Makefile b/Makefile index 79bcfcc1f..d3cb17e8a 100644 --- a/Makefile +++ b/Makefile @@ -14,28 +14,35 @@ SETUP_PATH=${PWD}/setup CONFIG=odoo.conf DOCKER_SERVER=hub.nextzenos.com ORGANIZATION=nexterp -PROJECT=$(shell git remote get-url origin | sed 's/.*\/\([^\/]*\)\.git$/\1/' || echo "odoo") +PROJECT := $(shell git remote get-url origin 2>/dev/null | sed 's/.*\/\([^\/]*\)\.git$$/\1/' || echo "odoo") ODOO_IMAGE=${DOCKER_SERVER}/${ORGANIZATION}/$(PROJECT) -TAG := $(shell rev-parse --abbrev-ref HEAD) +TAG := $(shell git rev-parse --abbrev-ref HEAD) CONTAINER_ID=${PROJECT}-${TAG} VERSION := community +ADDONS=${PWD}/addons,${PWD}/odoo/addons + install: sudo apt -y update && \ sudo apt install -y build-essential python3-full python3-pip libldap2-dev libpq-dev libsasl2-dev && \ pip install -r requirements.txt -run_test_docker: - sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb --stop-after-init --config=/etc/odoo/${CONFIG} --xmlrpc-port=8071 && \ - sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} drop testdb -run_test_local: - odoo-bin -i all_modules --log-level=test --test-enable -d testdb --stop-after-init --config=${CONFIG} gen_config: - ${PWD}/setup/init_config.sh ${ODOO_IMAGE} ${TAG} ${CONTAINER_ID} ${VERSION} + ${PWD}/setup/init_config.sh --native ${ADDONS} +run_server: + ${PYTHON} odoo-bin --config=${CONFIG} +run_test: + ${PYTHON} odoo-bin --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb-${TAG} --stop-after-init --config=${CONFIG} + ${PYTHON} odoo-bin db --config=${CONFIG} drop testdb-${TAG} + +##### Docker Deployment ######### +run_test_docker: + sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb-${TAG} --stop-after-init --config=/etc/odoo/${CONFIG} --xmlrpc-port=8071 && \ + sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} drop testdb-${TAG} +gen_config_docker: + ${PWD}/setup/init_config.sh --docker ${ODOO_IMAGE} ${TAG} ${CONTAINER_ID} ${VERSION} build_image: DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}:${TAG} push_image: $(DOCKER_PUSH) ${ODOO_IMAGE}:${TAG} -run_server_local: - ${PYTHON} odoo-bin --config=${CONFIG} run_server_docker: @if ! docker ps | grep -q "${CONTAINER_ID}"; then \ echo "Container not found. Running docker-compose up -d"; \ diff --git a/deployment/env.template b/deployment/env.template index 61b59b595..7020421d3 100755 --- a/deployment/env.template +++ b/deployment/env.template @@ -10,7 +10,6 @@ ODOO_CONFIG=./etc ODOO_BACKUP=./backup/ce #Database PG_PORT= -PG_DB= PG_USER= PG_PASS= ENTRYPOINT=./entrypoint.sh diff --git a/deployment/etc/odoo.conf b/deployment/etc/odoo.conf new file mode 100644 index 000000000..a04529ae2 --- /dev/null +++ b/deployment/etc/odoo.conf @@ -0,0 +1,9 @@ +[options] +addons_path = /mnt/extra-addons +data_dir = /var/lib/odoo +db_host = db +db_port = 5432 +db_user = nexterp +db_password = smartyourlife +proxy_mode = True + diff --git a/odoo.conf.sample b/odoo.conf.template similarity index 52% rename from odoo.conf.sample rename to odoo.conf.template index adb122353..e27989fd7 100644 --- a/odoo.conf.sample +++ b/odoo.conf.template @@ -3,4 +3,7 @@ db_host = db_port = 5432 db_user = db_password = - +xmlrpc_port = +addons_path = +dbfilter = +proxy_mode = \ No newline at end of file diff --git a/setup/gen_config.py b/setup/gen_config.py new file mode 100644 index 000000000..1c36eec22 --- /dev/null +++ b/setup/gen_config.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +import argparse +import configparser +import shutil +import os +from dotenv import set_key +from pathlib import Path +import socket +import secrets +import string +import color_log +def find_available_port(start_port=80): + """Finds an available port starting from the given port.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + while True: + try: + sock.bind(('localhost', start_port)) + color_log.Show(3,f" {start_port} is Open") + return start_port + except OSError as e: + if e.errno == 98: # Address already in use + print(f"{start_port} already in use , Try other port ...") + start_port += 1 + else: + raise +def main(): + """ + Generates a random password and finds an available port. + Updates the Odoo configuration file and .env file with these values. + """ + parser = argparse.ArgumentParser(description="Generate Odoo configuration") + parser.add_argument('--db_user', type=str, help='') + parser.add_argument('--db_pass', type=str, help='') + parser.add_argument('--deploy_path', type=str, help='') + parser.add_argument('--addons_path', type=str, help='') + parser.add_argument('--db_filter', type=str, help='') + parser.add_argument('--db_port', type=int, help='') + args = parser.parse_args() + db_port = args.db_port + db_user = args.db_user + db_pass = args.db_pass + app_port = find_available_port(8069) + addons_path = args.addons_path + base_dir= args.deploy_path + db_filter= args.db_filter + # Copy template files + os.makedirs(f"{base_dir}/etc", exist_ok=True) + color_log.Show(3,f"Copy {base_dir}/odoo.conf.template to {base_dir}/etc/odoo.conf") + shutil.copyfile(f'{base_dir}/odoo.conf.template', f'{base_dir}/odoo.conf') + + # Update Odoo configuration file + config = configparser.ConfigParser() + config.read(f'{base_dir}/odoo.conf') + config['options']['db_host'] = "localhost" + config['options']['db_user'] = db_user + config['options']['db_password'] = db_pass + config['options']['db_port'] = str(db_port) + config['options']['addons_path'] = addons_path + config['options']['xmlrpc_port'] = str(app_port) + config['options']['dbfilter'] = str(db_filter) + config['options']['proxy_mode'] = "True" + with open(f'{base_dir}/odoo.conf', 'w') as configfile: + config.write(configfile) +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/setup/gen-config.py b/setup/gen_config_docker.py similarity index 100% rename from setup/gen-config.py rename to setup/gen_config_docker.py diff --git a/setup/init_config.sh b/setup/init_config.sh index c7fa0cdfa..610a265fb 100755 --- a/setup/init_config.sh +++ b/setup/init_config.sh @@ -5,16 +5,14 @@ export DEBIAN_FRONTEND=noninteractive set -euo pipefail DEPLOY_PATH=$(pwd)/deployment SETUP_PATH=$(pwd)/setup -ODOO_IMAGE=$1 -ODOO_TAG=$2 -ODOO_CONTAINER=$3 -VERSION=$4 + + PG_USER=nexterp ODOO_ADDONS=./addons ODOO_CONFIG=./etc # System -DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf') -DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf') +DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'postgresql-client') +DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'psql') ((EUID)) && sudo_cmd="sudo" || sudo_cmd="" readonly MINIMUM_DOCER_VERSION="20" UNAME_U="$(uname -s)" @@ -87,16 +85,6 @@ Check_OS() { exit 1 fi } -Generate_Config(){ - if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then - cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env" - fi - python "$SETUP_PATH/gen-config.py" --db_port 5432 --db_user $PG_USER --deploy_path "$DEPLOY_PATH" \ - --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" \ - --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}" --backup "${VERSION}" - Show 0 " Generate Config Complete" -} - Install_Depends() { for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do cmd=${DEPENDS_COMMAND[i]} @@ -189,9 +177,62 @@ Check_Docker_Install_Final() { exit 1 fi } -Check_OS -# Update_Package_Resource -# Install_Depends -# Check_Dependency_Installation -# Check_Docker_Install -Generate_Config \ No newline at end of file +Generate_Config_Docker(){ + ODOO_IMAGE=${1:-} + ODOO_TAG=${2:-} + ODOO_CONTAINER=${3:-} + VERSION=${4:-} + if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then + cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env" + fi + python "$SETUP_PATH/gen_config_docker.py" --db_port 5432 --db_user $PG_USER --deploy_path "$DEPLOY_PATH" \ + --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" \ + --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}" --backup "${VERSION}" + Show 0 " Generate Config Complete" +} +Generate_Config_Native(){ + ADDONS=${1:-} + REPO_NAME=$(basename "$(git rev-parse --show-toplevel)" | sed -E 's/[.-]/_/g') + USER="${REPO_NAME:-"default_repo"}" + DB_PORT=$(sudo -u postgres psql -t -c "SHOW port;" | awk '{print $1}' || echo 5432) + PASSWORD="$(openssl rand -hex 24)" + # Check if the user already exists + USER_EXISTS=$(sudo -u postgres psql -t -c "SELECT 1 FROM pg_roles WHERE rolname='$USER';") + +if [ -z "$USER_EXISTS" ]; then + # User does not exist, create the user + Show 2 "Create the new PostgreSQL username: $USER with password: $PASSWORD" + sudo -u postgres psql -c "CREATE USER $USER WITH PASSWORD '$PASSWORD';" + Show 2 " Grant $USER superuser (admin) privileges" + sudo -u postgres psql -c "ALTER USER $USER WITH SUPERUSER;" +else + # User exists, update the password + Show 2 "User $USER already exists, updating password to $PASSWORD" + sudo -u postgres psql -c "ALTER USER $USER WITH PASSWORD '$PASSWORD';" +fi + python "$SETUP_PATH/gen_config.py" --db_user $USER --db_pass $PASSWORD --deploy_path "$(pwd)" \ + --addons_path $ADDONS --db_port $DB_PORT + Show 0 " Generate Config Complete" +} +main(){ + TYPE=${1:-} + Check_OS + # Update_Package_Resource + # Install_Depends + # Check_Dependency_Installation + # Check_Docker_Install + case "$TYPE" in + --native) + Generate_Config_Native $2 + ;; + --docker) + Generate_Config_Docker $2 $3 $4 $5 + ;; + *) + # else + Show 1 "Invalid argument (--docker|--native)" + ;; + esac +} + +main ${1:-} ${2:-} ${3:-} ${4:-} ${5:-}