update pipeline

This commit is contained in:
hoangvv 2025-01-07 17:52:17 +07:00
parent 44f04d5c41
commit 785e8d4e9e
37 changed files with 159 additions and 181 deletions

3
.gitignore vendored
View File

@ -22,7 +22,7 @@ odoo/filestore
odoo/addons/base/maintenance
# window installation config file
/odoo.conf
/deployment/postgresql
# generated for windows installer?
install/win32/*.bat
install/win32/meta.py
@ -49,3 +49,4 @@ package.json
/man/
/share/
/src/
deployment/postgresql/*

24
Jenkinsfile vendored
View File

@ -1,15 +1,29 @@
node('Node-Dev-100163') {
try {
stage('Checkout') {
echo 'Pulling...' + env.BRANCH_NAME
checkout scm
}
stage('Setup') {
sh 'make install'
stage('Build') {
steps{
sh 'make install'
}
steps{
sh 'make build-image'
}
steps{
sh 'make push-image'
}
}
stage('Start Docker Container'){
steps{
sh 'make run-server-docker'
}
}
stage('Testing') {
sh 'make gen_test_config'
sh 'make run_test'
sh 'make clean_test'
steps{
sh 'make run_test_docker'
}
}
currentBuild.result = "SUCCESS" // Set success status after all stages complete
} catch (err) {

View File

@ -4,40 +4,46 @@ UID = $(shell id -u)
GID = $(shell id -g)
PYTHON=python
DOCKERCMD=docker
DOCKER_COMPOSE_CMD=docker-compose
DOCKER_BUILD=$(DOCKERCMD) build
DOCKER_PUSH=$(DOCKERCMD) push
DOCKER_IMAGE=$(DOCKERCMD) image
DEPLOY_PATH=${PWD}/deployment
SETUP_PATH=${PWD}/setup
BRANCH := main
HASH := $(shell git rev-parse HEAD)
CONFIG=odoo.conf
check_env:
@if [ ! -d "$(PYENV_ROOT)/versions/${BRANCH}" ]; then \
echo "Creating virtualenv for ${BRANCH}"; \
pyenv virtualenv ${BRANCH}; \
else \
echo "Virtualenv for ${BRANCH} already exists"; \
fi
ODOO_IMAGE=hub.nextzenos.com/nexterp/odoo
CONTAINER_ID=odoo-${TAG}
TAG := main
install:
$(MAKE) check_env
pyenv activate ${BRANCH} &&\
export DEBIAN_FRONTEND=noninteractive && \
sudo apt -y update && \
sudo apt install -y python3-full python3-pip libldap2-dev libpq-dev libsasl2-dev && \
pip install -r requirements.txt
gen_test_config:
${PWD}/setup/init_conf.sh
run_test:
${PYTHON} odoo-bin -i all_modules --log-level=test --test-enable -d testdb --stop-after-init --config=${CONFIG}
clean_test:
${PWD}/setup/clean_up.sh
gen_env:
${PWD}/setup/init_env.sh
build-image: gen_env
DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}
sudo apt install -y python3-full python3-pip libldap2-dev libpq-dev libsasl2-dev
run_test_docker:
sudo docker exec -it ${CONTAINER_ID} odoo -i all_modules --log-level=test --test-enable -d testdb --stop-after-init --config=/etc/odoo/${CONFIG} --xmlrpc-port=8070
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}
build-image: gen_config
DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}:${TAG}
push-image:
$(DOCKERPUSH) ${ODOO_IMAGE}
run-server:
$(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"; \
else \
echo "Container already running. Skipping docker-compose up -d."; \
fi
cd ${DEPLOY_PATH} &&\
${DOCKER_COMPOSE_CMD} up -d
clean_up:
@if ! docker ps | grep -q "${CONTAINER_ID}"; then \
echo "Container not found. Skipping"; \
else \
cd ${DEPLOY_PATH} &&\
${DOCKER_COMPOSE_CMD} down
fi
sudo rm -rf ${DEPLOY_PATH}/postgresql

View File

@ -1,13 +1,14 @@
version: '3.8'
services:
odoo18:
image: ${ODOO_IMAGE:-odoo:18}
app:
image: ${ODOO_IMAGE:-odoo}:${ODOO_TAG:-18}
container_name: ${ODOO_CONTAINER:-odoo}
user: root
depends_on:
- db
ports:
- "{ODOO_PORT:-8069}:8069"
# - "{ODOO_CHAT_PORT:-8072}:8072"
- ${ODOO_PORT:-8069}:8069
# - "${ODOO_CHAT_PORT:-8072}:8072"
tty: true
command: --
environment:

View File

@ -2,6 +2,7 @@
ODOO_IMAGE=
ODOO_TAG=
ODOO_PORT=10017
ODOO_CONTAINER=
# ODOO_CHAT_PORT=
ODOO_ADDONS=./addons
ODOO_CONFIG=./etc

8
deployment/etc/odoo.conf Normal file
View File

@ -0,0 +1,8 @@
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
db_host = db
db_port = 5432
db_user = nexterp
db_password = 2Gltp2kbNgEwpikRdyYaUNO2

View File

@ -1,37 +0,0 @@
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
; admin_passwd = admin
; csv_internal_sep = ,
; db_maxconn = 64
; db_name = False
; db_template = template1
; dbfilter = .*
; debug_mode = False
; email_from = False
; limit_memory_hard = 2684354560
; limit_memory_soft = 2147483648
; limit_request = 8192
; limit_time_cpu = 60
; limit_time_real = 120
; list_db = True
; log_db = False
; log_handler = [':INFO']
; log_level = info
; logfile = None
; longpolling_port = 8072
; max_cron_threads = 2
; osv_memory_age_limit = 1.0
; osv_memory_count_limit = False
; smtp_password = False
; smtp_port = 25
; smtp_server = localhost
; smtp_ssl = False
; smtp_user = False
; workers = 0
; xmlrpc = True
; xmlrpc_interface =
; xmlrpc_port = 8069
; xmlrpcs = True
; xmlrpcs_interface =
; xmlrpcs_port = 8071

View File

@ -0,0 +1,7 @@
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
db_host =
db_port =
db_user =
db_password =

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

29
setup/color_log.py Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env python3
def colorize(text, code):
"""Colorizes text using ANSI escape codes."""
return f"\033[{code}m{text}\033[0m"
def Show(status, message):
"""Displays a message with a status indicator."""
colors = {
0: (colorize("[", "90")+colorize(" OK ", "38;5;154") + colorize("]", "90")), # Green, Grey
1: (colorize("[", "90")+colorize(" FAILED ", "91") + colorize("]", "90")), # Red, Grey
2: (colorize("[", "90")+colorize(" INFO ", "38;5;154") + colorize("]", "90")), # Green, Grey
3: (colorize("[", "90")+colorize(" NOTICE ", "33") + colorize("]", "90")), # Yellow, Grey
}
print(f"{colors.get(status, '')} {message}")
if status == 1:
exit(1)
def Warn(message):
"""Displays a warning message in red."""
print(colorize(message, "91"))
def GreyStart():
"""Starts a grey-colored output."""
print(colorize("", "90"), end="")
def ColorReset():
"""Resets the output color."""
print("\033[0m", end="")

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python3
import argparse
import configparser
import shutil
import os
@ -7,7 +8,7 @@ from pathlib import Path
import socket
import secrets
import string
import color_log
def generate_password(length=16):
"""Generates a random password of specified length."""
alphabet = string.ascii_letters + string.digits
@ -19,9 +20,11 @@ def find_available_port(start_port=5432):
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
@ -31,31 +34,54 @@ def main():
Generates a random password and finds an available port.
Updates the Odoo configuration file and .env file with these values.
"""
db_port = find_available_port()
parser = argparse.ArgumentParser(description="Generate Odoo configuration")
parser.add_argument('--db_port', type=int, help='')
parser.add_argument('--db_user', type=str, help='')
parser.add_argument('--deploy_path', type=str, help='')
parser.add_argument('--db', type=str, help='')
parser.add_argument('--image', type=str, help='')
parser.add_argument('--tag', type=str, help='')
parser.add_argument('--addons', type=str, help='')
parser.add_argument('--config', type=str, help='')
parser.add_argument('--container', type=str, help='')
args = parser.parse_args()
db_port = args.db_port
db_pass = generate_password(24)
db_user = "nextzen"
print(f"Available port found: {db_port}")
print(f"Database password generated: {db_pass}")
db_user = args.db_user
base_dir= args.deploy_path
db_name=args.db
image=args.image
tag=args.tag
container=args.container
addons=args.addons
config_path=args.config
app_port = 10017
# Copy template files
shutil.copyfile('odoo.conf.sample', 'odoo.conf')
shutil.copyfile('testing_env/env.template', 'testing_env/.env')
shutil.copyfile(f'{base_dir}/odoo.conf.template', f'{base_dir}/etc/odoo.conf')
shutil.copyfile(f'{base_dir}/env.template', f'{base_dir}/.env')
# Update Odoo configuration file
config = configparser.ConfigParser()
config.read('odoo.conf')
config['options']['db_host'] = "localhost"
config.read(f'{base_dir}/etc/odoo.conf')
config['options']['db_host'] = "db"
config['options']['db_user'] = db_user
config['options']['db_password'] = db_pass
config['options']['db_port'] = str(db_port)
with open('odoo.conf', 'w') as configfile:
config['options']['addons_path'] = "/mnt/extra-addons"
config['options']['data_dir'] = "/var/lib/odoo"
with open(f'{base_dir}/etc/odoo.conf', 'w') as configfile:
config.write(configfile)
# Update .env file
env_file_path = Path("testing_env/.env")
set_key(dotenv_path=env_file_path, key_to_set="PG_USER", value_to_set=db_user)
set_key(dotenv_path=env_file_path, key_to_set="PG_PASS", value_to_set=db_pass)
set_key(dotenv_path=env_file_path, key_to_set="PG_PORT", value_to_set=str(db_port))
env_file_path = Path("deployment/.env")
set_key(dotenv_path=env_file_path, key_to_set="PG_DB", value_to_set=db_name,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="PG_USER", value_to_set=db_user,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="PG_PASS", value_to_set=db_pass,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_CONFIG", value_to_set=config_path,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_ADDONS", value_to_set=addons,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_PORT", value_to_set=find_available_port(app_port),quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_IMAGE", value_to_set=image,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_TAG", value_to_set=tag,quote_mode="never")
set_key(dotenv_path=env_file_path, key_to_set="ODOO_CONTAINER", value_to_set=container,quote_mode="never")
if __name__ == "__main__":
main()

View File

@ -1,65 +0,0 @@
#!/usr/bin/bash
export PATH=/usr/sbin:$PATH
export DEBIAN_FRONTEND=noninteractive
set -euo pipefail
((EUID)) && sudo_cmd="sudo" || sudo_cmd=""
readonly COLOUR_RESET='\e[0m'
readonly aCOLOUR=(
'\e[38;5;154m' # green | Lines, bullets and separators
'\e[1m' # Bold white | Main descriptions
'\e[90m' # Grey | Credits
'\e[91m' # Red | Update notifications Alert
'\e[33m' # Yellow | Emphasis
)
trap 'onCtrlC' INT
onCtrlC() {
echo -e "${COLOUR_RESET}"
exit 1
}
Show() {
# OK
if (($1 == 0)); then
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} OK $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
# FAILED
elif (($1 == 1)); then
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]}FAILED$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
exit 1
# INFO
elif (($1 == 2)); then
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} INFO $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
# NOTICE
elif (($1 == 3)); then
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]}NOTICE$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
fi
}
Warn() {
echo -e "${aCOLOUR[3]}$1$COLOUR_RESET"
}
GreyStart() {
echo -e "${aCOLOUR[2]}\c"
}
ColorReset() {
echo -e "$COLOUR_RESET\c"
}
generate_config() {
python setup/gen-config.py
echo "Generate Config Complete"
}
run_test_db() {
cd "$(pwd)/testing_env"
echo "Starting containers..."
docker-compose up -d
echo "Test Server is online"
}
generate_config
run_test_db

View File

@ -2,13 +2,14 @@
export PATH=/usr/sbin:$PATH
export DEBIAN_FRONTEND=noninteractive
set -euo pipefail
ODOO_IMAGE='hub.nextzenos.com/nexterp/odoo'
DEPLOY_PATH=$(pwd)/deployment
SETUP_PATH=$(pwd)/setup
ODOO_IMAGE=$1
ODOO_TAG=$2
ODOO_CONTAINER=$3
PG_DB=nexterp
PG_USER=nexterp
CURRENT_BRANCH=main
ODOO_ADDONS=./addons
ODOO_CONFIG=./etc
# System
@ -86,27 +87,13 @@ Check_OS() {
exit 1
fi
}
Generate_Env(){
if [[ "$CURRENT_BRANCH" == "main" ]]; then
ODOO_TAG="latest"
else
ODOO_TAG="$CURRENT_BRANCH"
fi
Generate_Config(){
if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then
cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env"
fi
sed -i \
-e "s|^PG_DB=.*|PG_DB=${PG_DB:=odoo}|" \
-e "s|^PG_USER=.*|PG_USER=${PG_USER:=changeme}|" \
-e "s|^PG_PASS=.*|PG_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 24)|" \
-e "s|^ODOO_IMAGE=.*|ODOO_IMAGE=${ODOO_IMAGE}|" \
-e "s|^ODOO_TAG=.*|ODOO_TAG=${ODOO_TAG:=latest}|" \
-e "s|^ODOO_PORT=.*|ODOO_PORT=${ODOO_PORT:=10017}|" \
-e "s|^ODOO_ADDONS=.*|ODOO_ADDONS=${ODOO_ADDONS}|" \
-e "s|^ODOO_CONFIG=.*|ODOO_CONFIG=${ODOO_CONFIG}|" \
"${DEPLOY_PATH}/.env"
Show 0 "Generate env file complete"
python "$SETUP_PATH/gen-config.py" --db_port 5432 --db_user $PG_USER --deploy_path "$DEPLOY_PATH" \
--db ${PG_DB:=odoo} --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}"
Show 0 " Generate Config Complete"
}
Install_Depends() {
@ -201,9 +188,9 @@ Check_Docker_Install_Final() {
exit 1
fi
}
Check_OS
Update_Package_Resource
Install_Depends
Check_Dependency_Installation
Check_Docker_Install
Generate_Env
# Check_OS
# Update_Package_Resource
# Install_Depends
# Check_Dependency_Installation
# Check_Docker_Install
Generate_Config