From 3bf13acfbbf10a711033addee310096f0ed7cc9b Mon Sep 17 00:00:00 2001 From: Luke Eversfield Date: Wed, 5 Jul 2023 11:57:57 +0200 Subject: [PATCH] WIP commit --- .env | 10 +++ .github/workflows/ci.yaml | 83 ++++++++++++++++++--- Dockerfile | 10 +-- Makefile | 147 +++++++++++++++++++++++++++----------- docker-compose-ci.yml | 4 ++ docker-compose-dev.yml | 8 +++ docker-compose.yml | 20 ++++-- env.template | 10 +++ 8 files changed, 235 insertions(+), 57 deletions(-) create mode 100644 .env create mode 100644 docker-compose-ci.yml create mode 100644 docker-compose-dev.yml create mode 100644 env.template diff --git a/.env b/.env new file mode 100644 index 0000000..3204e3a --- /dev/null +++ b/.env @@ -0,0 +1,10 @@ +# copy this to .env to easily modify local CI ENV variables + +# cp env.template .env + +# MW_VERSION=1.35 +# SMW_VERSION=4.1.1 +# AR_VERSION=1.8.2 +# PHP_VERSION=7.4 +# DB_TYPE=sqlite +# DB_IMAGE="mysql:5.7" \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6b64454..c9c4d69 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,30 +16,97 @@ jobs: strategy: matrix: include: - - mediawiki_version: 1.35 - semantic_mediawiki_version: 4.1.1 + # - mediawiki_version: 1.35 + # semantic_mediawiki_version: 4.1.1 + # approved_revs_version: 1.8.1 + # database_type: mysql + # coverage: true + # experimental: false + # - mediawiki_version: 1.35 + # semantic_mediawiki_version: 4.1.1 + # approved_revs_version: 1.8.1 + # database_type: sqlite + # coverage: false + # experimental: false + # - mediawiki_version: 1.38 + # semantic_mediawiki_version: dev-master + # approved_revs_version: master + # database_type: sqlite + # coverage: false + # experimental: true + + - mediawiki_version: '1.35' + smw_version: '4.1.1' approved_revs_version: 1.8.1 + php_version: 7.4 database_type: mysql + database_image: "mysql:5.7" coverage: true experimental: false - - mediawiki_version: 1.35 - semantic_mediawiki_version: 4.1.1 + - mediawiki_version: '1.35' + smw_version: '4.1.1' approved_revs_version: 1.8.1 + php_version: 7.4 database_type: sqlite + database_image: "mysql:5.7" + coverage: true + experimental: false + - mediawiki_version: '1.35' + smw_version: dev-master + approved_revs_version: master + php_version: 7.4 + database_type: mysql + database_image: "mysql:5.7" coverage: false experimental: false - - mediawiki_version: 1.38 - semantic_mediawiki_version: dev-master + - mediawiki_version: '1.39' + smw_version: dev-master approved_revs_version: master - database_type: sqlite + php_version: 8.1 + database_type: mysql + database_image: "mysql:5.7" + coverage: false + experimental: true + - mediawiki_version: '1.39' + smw_version: dev-master + approved_revs_version: master + php_version: 8.1 + database_type: mysql + database_image: "mysql:8" + coverage: false + experimental: true + - mediawiki_version: '1.40' + smw_version: dev-master + approved_revs_version: master + php_version: 8.1 + database_type: mysql + database_image: "mysql:8" + coverage: false + experimental: true + - mediawiki_version: '1.40' + smw_version: dev-master + approved_revs_version: master + php_version: 8.1 + database_type: mysql + database_image: "mariadb:latest" + coverage: false + experimental: true + - mediawiki_version: '1.40' + smw_version: dev-master + approved_revs_version: master + php_version: 8.1 + database_type: postgres + database_image: "postgres:14" coverage: false experimental: true env: MW_VERSION: ${{ matrix.mediawiki_version }} - SMW_VERSION: ${{ matrix.semantic_mediawiki_version }} + SMW_VERSION: ${{ matrix.smw_version }} AR_VERSION: ${{ matrix.approved_revs_version }} + PHP_VERSION: ${{ matrix.php_version }} DB_TYPE: ${{ matrix.database_type }} + DB_IMAGE: ${{ matrix.database_image }} steps: - name: Checkout diff --git a/Dockerfile b/Dockerfile index 1210976..3f5ef5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ ARG MW_VERSION -FROM gesinn/docker-mediawiki-sqlite:${MW_VERSION} +ARG PHP_VERSION + +FROM gesinn/mediawiki-ci:${MW_VERSION}-php${PHP_VERSION} RUN rm -f /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini && \ - sed -i s/80/8080/g /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf && \ - # To be able to persist configuration and data via docker volumes - mkdir -p /data/sqlite /data/config /data/log && chown -R www-data. /data && \ - rm -f LocalSettings.php && ln -s /data/config/LocalSettings.php + sed -i s/80/8080/g /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf + ENV EXTENSION=SemanticExtraSpecialProperties COPY composer*.json /var/www/html/extensions/$EXTENSION/ diff --git a/Makefile b/Makefile index 437bc8d..2bc9cd5 100644 --- a/Makefile +++ b/Makefile @@ -1,36 +1,52 @@ -EXTENSION := SemanticExtraSpecialProperties +-include .env +export +# ======== Naming ======== +EXTENSION := SemanticExtraSpecialProperties +EXTENSION_FOLDER := /var/www/html/extensions/${EXTENSION} +extension := $(shell echo $(EXTENSION) | tr A-Z a-z}) +IMAGE_NAME := $(extension):test-$(MW_VERSION)-$(SMW_VERSION)-$(AR_VERSION)-$(PHP_VERSION) + + +# ======== CI ENV Variables ======== MW_VERSION ?= 1.35 SMW_VERSION ?= 4.1.1 AR_VERSION ?= 1.8.2 - -IMAGE_VERSION := $(MW_VERSION)-$(SMW_VERSION)-$(AR_VERSION) -BUILD_ARGS := \ - --build-arg MW_VERSION=$(MW_VERSION) \ - --build-arg SMW_VERSION=$(SMW_VERSION) \ - --build-arg AR_VERSION=$(AR_VERSION) - -# ------------------------------------------------------------------- +PHP_VERSION ?= 7.4 DB_TYPE ?= sqlite -extension := $(shell echo $(EXTENSION) | tr A-Z a-z}) -IMAGE_NAME := $(extension):test-$(IMAGE_VERSION) -EXTENSION_FOLDER := /var/www/html/extensions/${EXTENSION} +DB_IMAGE ?= "" + +environment = IMAGE_NAME=$(IMAGE_NAME) \ +MW_VERSION=$(MW_VERSION) \ +SMW_VERSION=$(SMW_VERSION) \ +AR_VERSION=$(AR_VERSION) \ +PHP_VERSION=$(PHP_VERSION) \ +DB_TYPE=$(DB_TYPE) \ +DB_IMAGE=$(DB_IMAGE) \ +EXTENSION_FOLDER=$(EXTENSION_FOLDER) + +ifneq (,$(wildcard ./docker-compose.override.yml)) + COMPOSE_OVERRIDE=-f docker-compose.override.yml +endif + +compose = $(environment) docker-compose $(COMPOSE_OVERRIDE) $(COMPOSE_ARGS) +compose-ci = $(environment) docker-compose -f docker-compose.yml -f docker-compose-ci.yml $(COMPOSE_OVERRIDE) $(COMPOSE_ARGS) +compose-dev = $(environment) docker-compose -f docker-compose.yml -f docker-compose-dev.yml $(COMPOSE_OVERRIDE) $(COMPOSE_ARGS) -compose = IMAGE_NAME=$(IMAGE_NAME) EXTENSION_FOLDER=$(EXTENSION_FOLDER) docker-compose $(COMPOSE_ARGS) compose-run = $(compose) run -T --rm compose-exec-wiki = $(compose) exec -T wiki show-current-target = @echo; echo "======= $@ ========" + +# ======== CI ======== +# ======== Global Targets ======== + .PHONY: ci -ci: install - $(show-current-target) - $(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test" +ci: install composer-test .PHONY: ci-coverage -ci-coverage: install - $(show-current-target) - $(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test-coverage" +ci-coverage: install composer-test-coverage .PHONY: install install: destroy up .install @@ -45,24 +61,23 @@ down: .init .down destroy: .init .destroy .PHONY: bash -bash: .init - $(show-current-target) - $(compose) exec wiki bash -c "cd $(EXTENSION_FOLDER) && bash" +bash: up .bash .PHONY: show-logs show-logs: .init $(show-current-target) $(compose) logs -f || true +# ======== General Docker-Compose Helper Targets ======== .PHONY: .build .build: $(show-current-target) - $(compose) build $(BUILD_ARGS) wiki + $(compose-ci) build wiki .PHONY: .up .up: $(show-current-target) - $(compose) up -d + $(compose-ci) up -d .PHONY: .install .install: .wait-for-db @@ -78,28 +93,80 @@ show-logs: .init .PHONY: .down .down: $(show-current-target) - $(compose) down + $(compose-ci) down .PHONY: .destroy .destroy: $(show-current-target) - $(compose) down -v + $(compose-ci) down -v + +.PHONY: .bash +.bash: .init + $(show-current-target) + $(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && bash" + +# ======== Test Targets ======== + +.PHONY: composer-test +composer-test: + $(show-current-target) + $(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test" + +.PHONY: composer-test-coverage +composer-test-coverage: + $(show-current-target) + $(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test-coverage" + +# ======== Dev Targets ======== + +.PHONY: dev-bash +dev-bash: .init + $(compose-dev) run -it wiki bash -c 'service apache2 start && bash' + +.PHONY: run +run: + $(compose-dev) -f docker-compose-dev.yml run -it wiki + +# ======== Releasing ======== +# VERSION = `node -e 'console.log(require("./extension.json").version)'` + +# .PHONY: release +# release: ci git-push gh-login +# gh release create $(VERSION) + +# .PHONY: git-push +# git-push: +# git diff --quiet || (echo 'git directory has changes'; exit 1) +# git push + +# .PHONY: gh-login +# gh-login: require-GH_API_TOKEN +# gh config set prompt disabled +# @echo $(GH_API_TOKEN) | gh auth login --with-token + +# .PHONY: require-GH_API_TOKEN +# require-GH_API_TOKEN: +# ifndef GH_API_TOKEN +# $(error GH_API_TOKEN is not set) +# endif + +# ======== Helpers ======== +.PHONY: .init +.init: + $(show-current-target) + $(eval COMPOSE_ARGS = --project-name ${extension}-$(DB_TYPE) --profile $(DB_TYPE)) +ifeq ($(DB_TYPE), sqlite) + $(eval WIKI_DB_CONFIG = --dbtype=$(DB_TYPE) --dbpath=/tmp/sqlite) +else + $(eval WIKI_DB_CONFIG = --dbtype=$(DB_TYPE) --dbserver=$(DB_TYPE) --installdbuser=root --installdbpass=database) +endif + @echo "COMPOSE_ARGS: $(COMPOSE_ARGS)" .PHONY: .wait-for-db .wait-for-db: $(show-current-target) -ifneq ($(DB_TYPE), sqlite) - $(compose-run) wait-for $(DB_TYPE):3306 -t 120 -endif - -.PHONY: .init -.init: - $(show-current-target) ifeq ($(DB_TYPE), mysql) - $(eval COMPOSE_ARGS = --project-name $(extension)-mysql --profile mysql) - $(eval WIKI_DB_CONFIG = --dbtype=mysql --dbserver=mysql --installdbuser=root --installdbpass=database) -else - $(eval COMPOSE_ARGS = --project-name $(extension)-sqlite) - $(eval WIKI_DB_CONFIG = --dbtype=sqlite --dbpath=/data/sqlite) -endif - @echo "COMPOSE_ARGS: $(COMPOSE_ARGS)" + $(compose-run) wait-for $(DB_TYPE):3306 -t 120 +else ifeq ($(DB_TYPE), postgres) + $(compose-run) wait-for $(DB_TYPE):5432 -t 120 +endif \ No newline at end of file diff --git a/docker-compose-ci.yml b/docker-compose-ci.yml new file mode 100644 index 0000000..9f4a0e0 --- /dev/null +++ b/docker-compose-ci.yml @@ -0,0 +1,4 @@ +services: + wiki: + volumes: + - ./coverage:${EXTENSION_FOLDER}/coverage diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..e09dcb6 --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,8 @@ +services: + wiki: + volumes: + - ./:${EXTENSION_FOLDER} + - ${EXTENSION_FOLDER}/vendor/ + ports: + - 8080:8080 + \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a789170..d1f63f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,29 @@ services: wiki: - build: . + build: + context: . + args: + MW_VERSION: ${MW_VERSION} + SMW_VERSION: ${SMW_VERSION} + AR_VERSION: ${AR_VERSION} + PHP_VERSION: ${PHP_VERSION} image: ${IMAGE_NAME} - volumes: - - ./coverage:${EXTENSION_FOLDER}/coverage mysql: - image: mysql:5 + image: ${DB_IMAGE:-mysql:5} environment: - MYSQL_ROOT_PASSWORD=database profiles: - mysql + postgres: + image: ${DB_IMAGE:-postgres:15} + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=database + profiles: + - postgres + wait-for: image: mintel/docker-wait-for-it profiles: diff --git a/env.template b/env.template new file mode 100644 index 0000000..e2fe185 --- /dev/null +++ b/env.template @@ -0,0 +1,10 @@ +# copy this to .env to easily modify local CI ENV variables + +# cp env.template .env + +MW_VERSION=1.39 +SMW_VERSION=4.1.1 +AR_VERSION=1.8.2 +PHP_VERSION=8.1 +DB_TYPE=mysql +DB_IMAGE="mysql:8" \ No newline at end of file