diff --git a/.config/make/docker.mak b/.config/make/docker.mak new file mode 100644 index 000000000..c950186ea --- /dev/null +++ b/.config/make/docker.mak @@ -0,0 +1,8 @@ +## —— Docker ————————————————————————————————————————————————————————————————————————————————————— +.PHONY: docker-build +docker-build: ## Run docker build image in local + docker build --tag postgresql_cluster:local --file .gitpod.Dockerfile . + +.PHONY: docker-lint +docker-lint: ## Run hadolint command to lint Dokerfile + docker run --rm -i hadolint/hadolint < .gitpod.Dockerfile \ No newline at end of file diff --git a/.config/make/help.mak b/.config/make/help.mak new file mode 100644 index 000000000..a71f2c7ca --- /dev/null +++ b/.config/make/help.mak @@ -0,0 +1,5 @@ +## —— Help ——————————————————————————————————————————————————————————————————————————————————————— +.PHONY: help +help: ## Help command + echo -e "$$HEADER" + grep -E '(^[a-zA-Z0-9_-]+:.*?## .*$$)|(^## )' $(MAKEFILE_LIST) | sed 's/^[^:]*://g' | awk 'BEGIN {FS = ":.*?## | #"} ; {printf "${cyan}%-30s${reset} ${white}%s${reset} ${green}%s${reset}\n", $$1, $$2, $$3}' | sed -e 's/\[36m##/\n[32m##/' diff --git a/.config/make/molecule.mak b/.config/make/molecule.mak new file mode 100644 index 000000000..6d4dd724c --- /dev/null +++ b/.config/make/molecule.mak @@ -0,0 +1,61 @@ +## —— Molecule ——————————————————————————————————————————————————————————————————————————————————— +.PHONY: molecule-test +molecule-test: ## Run test sequence for default scenario + source .venv/bin/activate + molecule test + +.PHONY: molecule-destroy +molecule-destroy: ## Run destroy sequence for default scenario + source .venv/bin/activate + molecule destroy + +.PHONY: molecule-converge +molecule-converge: ## Run converge sequence for default scenario + source .venv/bin/activate + molecule converge + +.PHONY: molecule-reconverge +molecule-reconverge: ## Run destroy and converge sequence for default scenario + source .venv/bin/activate + molecule destroy + molecule converge + +.PHONY: molecule-test-all +molecule-test-all: ## Run test sequence for all scenarios + source .venv/bin/activate + molecule test --all + +.PHONY: molecule-destroy-all +molecule-destroy-all: ## Run destroy sequence for all scenarios + source .venv/bin/activate + molecule destroy --all + +.PHONY: molecule-test-scenario +molecule-test-scenario: ## Run molecule test with specific scenario (example: make molecule-test-scenario MOLECULE_SCENARIO="using_maven_repo") + source .venv/bin/activate + molecule test --scenario-name $(MOLECULE_SCENARIO) + +.PHONY: molecule-destroy-scenario +molecule-destroy-scenario: ## Run molecule destroy with specific scenario (example: make molecule-destroy-scenario MOLECULE_SCENARIO="using_maven_repo") + source .venv/bin/activate + molecule destroy --scenario-name $(MOLECULE_SCENARIO) + +.PHONY: molecule-converge-scenario +molecule-converge-scenario: ## Run molecule converge with specific scenario (example: make molecule-converge-scenario MOLECULE_SCENARIO="using_maven_repo") + source .venv/bin/activate + molecule converge --scenario-name $(MOLECULE_SCENARIO) + +.PHONY: molecule-dependency +molecule-dependency: ## Run dependency sequence + source .venv/bin/activate + molecule dependency + +.PHONY: molecule-verify +molecule-verify: ## Run verify sequence + source .venv/bin/activate + molecule verify + +.PHONY: molecule-lint +molecule-lint: ## Run lint sequence + source .venv/bin/activate + molecule lint diff --git a/.config/make/python.mak b/.config/make/python.mak new file mode 100644 index 000000000..8bba777b7 --- /dev/null +++ b/.config/make/python.mak @@ -0,0 +1,75 @@ +# Python default launcher +python_launcher ?= python3.10 +python_requirements_file ?= requirements.txt +python_requirements_dev_file ?= requirements.dev.txt + +## —— Python ————————————————————————————————————————————————————————————————————————————————————— +.PHONY: python-bootstrap +python-bootstrap: ## Bootstrap python + $(MAKE) python-venv-init + $(MAKE) python-venv-upgrade + $(MAKE) python-venv-requirements + +.PHONY: python-bootstrap-dev +python-bootstrap-dev: ## Bootstrap python for dev env + $(MAKE) python-venv-requirements-dev + $(MAKE) python-venv-linters-install + +# =============================================================================================== +# .venv +# =============================================================================================== +.PHONY: python-venv-init +python-venv-init: ## Create venv ".venv/" if not exist + if [ ! -d .venv ] ; then + $(python_launcher) -m venv .venv + fi + +.PHONY: python-venv-upgrade +python-venv-upgrade: ## Upgrade venv with pip, setuptools and wheel + source .venv/bin/activate + pip install --upgrade pip setuptools wheel + +.PHONY: python-venv-requirements +python-venv-requirements: ## Install or upgrade from $(python_requirements_file) + source .venv/bin/activate + pip install --upgrade --requirement $(python_requirements_file) + +.PHONY: python-venv-requirements-dev +python-venv-requirements-dev: ## Install or upgrade from $(python_requirements_dev_file) + source .venv/bin/activate + pip install --upgrade --requirement $(python_requirements_dev_file) + +.PHONY: python-venv-linters-install +python-venv-linters-install: ## Install or upgrade linters + source .venv/bin/activate + pip install --upgrade flake8 + +.PHONY: python-venv-purge +python-venv-purge: ## Remove venv ".venv/" folder + rm -rf .venv + +# =============================================================================================== +# Utils +# =============================================================================================== +.PHONY: python-purge-cache +python-purge-cache: ## Purge cache to avoid used cached files + if [ -d .venv ] ; then + source .venv/bin/activate + pip cache purge + fi + +.PHONY: python-version +python-version: ## Displays the python version used for the .venv + source .venv/bin/activate + $(python_launcher) --version + +.PHONY: python-flake8 +python-flake8: ## Run flake8 linter for python + source .venv/bin/activate + flake8 --config .config/.flake8 + +.PHONY: python-pytest +python-pytest: ## Run pytest to test python scripts + source .venv/bin/activate + cd scripts/ + $(python_launcher) -m pytest diff --git a/.gitignore b/.gitignore index 4befed30a..d739a5074 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store .idea +.venv \ No newline at end of file diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 3f46c12d2..541bfcfbb 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -2,23 +2,36 @@ FROM ubuntu:jammy USER root -# update system and install packages -RUN apt update && apt upgrade -y \ - && apt install -y ca-certificates gnupg lsb-release -yq git git-lfs sudo python3 python3-pip \ - vim nano iproute2 wget curl htop - -# install docker -RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ +# Update system and install packages, including Docker +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + gnupg \ + lsb-release \ + git \ + git-lfs \ + sudo \ + make \ + python3.10 \ + python3.10-venv \ + python3-pip \ + vim \ + nano \ + iproute2 \ + wget \ + curl \ + htop \ + && python3 -m pip install --no-cache-dir --upgrade pip \ + && python3 -m pip install --no-cache-dir virtualenv \ + # Install Docker + && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ - && apt update \ - && apt install -y docker-ce docker-ce-cli containerd.io - -# install molecule and ansible -RUN pip3 install 'molecule[docker]<5.0.0' ansible ansible-lint yamllint - -# clean -RUN apt clean && rm -rf /var/lib/apt/lists/* /tmp/* + && apt-get update \ + && apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io \ + # Clean + && apt-get clean && rm -rf /var/lib/apt/lists/* tmp/* # Create the gitpod user. UID must be 33333. RUN useradd -l -u 33333 -G sudo -md /home/gitpod -s /bin/bash -p gitpod gitpod diff --git a/.gitpod.yml b/.gitpod.yml index cc2e31468..efc4c7722 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,3 +1,6 @@ --- -image: vitabaks/ansible-molecule-ubuntu:22.04 -... +image: + file: .gitpod.Dockerfile + +tasks: + - init: make bootstrap diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..3100e39d9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,66 @@ +# Contributing Guide + +Help improve this project by: + +- [Creating an issue](https://help.github.com/articles/creating-an-issue/) (Check for [known issues](https://github.com/search?q=user%3Avitabaks+is%3Aissue+state%3Aopen) first) +- [Submitting a pull request](https://docs.github.com/fr/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) to fix a problem or add a feature + +Your contributions are appreciated and will be taken seriously. + +## How to Contribute + +### 1. Create an issue + +Report problems or suggest improvements by [creating an issue](https://github.com/vitabaks/postgresql_cluster/issues). + +### 2. Fork the project + +[Fork the repository](https://github.com/vitabaks/postgresql_cluster) to your GitHub account. + +### 3. Make changes + +Clone your fork locally and make the necessary changes: + +``` +git clone git@github.com:YOURNAMESPACE/postgresql_cluster.git +``` + +### 4. Test your changes (Optional) + +#### 4.1 Gitpod + +Use Gitpod for a cloud-based development environment: + +1. Sign up for Gitpod: https://gitpod.io +2. Fork the `postgresql_cluster` repository +3. Open your fork in Gitpod: `https://gitpod.io/#https://github.com/username/postgresql_cluster` +4. Create a new branch: `git checkout -b my-feature-branch` +5. Make your changes and commit: `git add .` and `git commit -m "Description of changes"` +6. Test with Molecule: `make molecule-test` or `make molecule-converge` +7. Push your changes: `git push origin my-feature-branch` +8. Create a pull request on GitHub +9. Wait for a review + +Keep your Gitpod workspace synced with the main repository. + +#### 4.2 Desktop + +Install [make](https://www.gnu.org/software/make/), [Python3.10](https://www.python.org/), [venv](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/), and [docker](https://docs.docker.com/engine/install/ubuntu/). + +Run `make` for Makefile help. Initialize virtualenv and install dependencies with `make reinitialization` or `make bootstrap`. Test your changes with `make molecule-test` or `make molecule-converge`. + +To test a specific distribution, set `distro`, `tag`, and `namespace`: + +``` +IMAGE_NAMESPACE=geerlingguy IMAGE_DISTRO=debian10 make molecule-converge +``` + +### 5. Submit a pull request + +[Create a pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork) and [refer to the issue number](https://help.github.com/en/github/writing-on-github/autolinked-references-and-urls) using #123, where 123 is the issue number. + +### 6. Wait + +Your pull request will be reviewed, and you'll receive feedback. Thanks for contributing! + +Consider sponsoring the maintainer via [GitHub](https://github.com/sponsors/vitabaks) or [Patreon](https://patreon.com/vitabaks). \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..cdb025607 --- /dev/null +++ b/Makefile @@ -0,0 +1,65 @@ +.PHONY: all test SHELL + +# Makefile global config +.DEFAULT_GOAL:=help +.EXPORT_ALL_VARIABLES: +.ONESHELL: +.SILENT: +MAKEFLAGS += "-j$(NUM_CORES) -l$(NUM_CORES)" +MAKEFLAGS += --silent +SHELL:=/bin/bash + +# Makefile colors config +bold=$(shell tput bold) +normal=$(shell tput sgr0) +errorTitle=$(shell tput setab 1 && tput bold && echo '\n') +recommendation=$(shell tput setab 4) +underline=$(shell tput smul) +reset=$(shell tput -Txterm sgr0) +black=$(shell tput setaf 0) +red=$(shell tput setaf 1) +green=$(shell tput setaf 2) +yellow=$(shell tput setaf 3) +blue=$(shell tput setaf 4) +magenta=$(shell tput setaf 5) +cyan=$(shell tput setaf 6) +white=$(shell tput setaf 7) + +define HEADER +How to use me: + make && make bootstrap + make ${cyan}${reset} + +endef +export HEADER + +python_launcher := python3.10 + +-include .config/make/help.mak +-include .config/make/python.mak +-include .config/make/docker.mak +-include .config/make/molecule.mak + +## —— Bootstrap collection ——————————————————————————————————————————————————————————————————————— +.PHONY: bootstrap +bootstrap: ## Bootstrap Ansible collection + $(MAKE) python-bootstrap + $(MAKE) python-bootstrap-dev + +## —— Virtualenv ———————————————————————————————————————————————————————————————————————————————— +.PHONY: reinitialization +reinitialization: ## Return to an initial state of Bootstrap Ansible collection + rm -rf .venv/ + rm -rf vendor/ + rm -f *.mak + $(MAKE) bootstrap + +.PHONY: clean +clean: ## Clean collection + rm -rf .venv/ + rm -rf .pytest_cache/ + rm -rf scripts/.pytest_cache/ + rm -rf scripts/tests/__pycache__/ + rm -rf scripts/modules/__pycache__/ + rm -rf scripts/modules/services/__pycache__/ + rm -rf scripts/modules/utils/__pycache__/ \ No newline at end of file diff --git a/requirements.dev.txt b/requirements.dev.txt new file mode 100644 index 000000000..3ecaf2f3c --- /dev/null +++ b/requirements.dev.txt @@ -0,0 +1,5 @@ +ansible-lint==6.15.0 +yamllint==1.31.0 +molecule==5.0.0 +molecule-plugins[docker]==23.4.0 +docker==6.0.1 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..f454c55bc --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +ansible>=2.7