Skip to content

Commit

Permalink
Docker-Compose based CI + Multiple PHP and DB types (#61)
Browse files Browse the repository at this point in the history
changed to Docker-Compose based CI with support for different PHP and DB types
  • Loading branch information
gesinn-it-evl committed Jul 14, 2023
1 parent fc3e1ec commit a0b348c
Show file tree
Hide file tree
Showing 8 changed files with 258 additions and 65 deletions.
46 changes: 45 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,69 @@ jobs:
include:
- mediawiki_version: '1.35'
smw_version: '4.1.0'
php_version: 7.4
database_type: mysql
database_image: "mysql:5.7"
coverage: true
experimental: false
- mediawiki_version: '1.35'
smw_version: '4.1.0'
php_version: 7.4
database_type: sqlite
database_image: "mysql:5.7"
coverage: true
experimental: false
- mediawiki_version: '1.35'
smw_version: dev-master
php_version: 7.4
database_type: mysql
database_image: "mysql:5.7"
coverage: false
experimental: false
- mediawiki_version: '1.38'
- mediawiki_version: '1.39'
smw_version: dev-master
php_version: 8.1
database_type: mysql
database_image: "mysql:5.7"
coverage: false
experimental: true
- mediawiki_version: '1.39'
smw_version: dev-master
php_version: 8.1
database_type: mysql
database_image: "mysql:8"
coverage: false
experimental: true
- mediawiki_version: '1.40'
smw_version: dev-master
php_version: 8.1
database_type: mysql
database_image: "mysql:8"
coverage: false
experimental: true
- mediawiki_version: '1.40'
smw_version: dev-master
php_version: 8.1
database_type: mysql
database_image: "mariadb:latest"
coverage: false
experimental: true
- mediawiki_version: '1.40'
smw_version: dev-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.smw_version }}
PHP_VERSION: ${{ matrix.php_version }}
DB_TYPE: ${{ matrix.database_type }}
DB_IMAGE: ${{ matrix.database_image }}


steps:
- name: Checkout
uses: actions/checkout@v3
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
coverage
.tmp
coverage
.env
49 changes: 26 additions & 23 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,39 +1,42 @@
ARG MW_VERSION
FROM gesinn/docker-mediawiki-sqlite:${MW_VERSION}
ARG PHP_VERSION
FROM gesinn/mediawiki-ci:${MW_VERSION}-php${PHP_VERSION}

ARG MW_VERSION
ARG SMW_VERSION
ARG PS_VERSION
ARG AL_VERSION
ARG MAPS_VERSION
ARG SRF_VERSION
RUN sed -i s/80/8080/g /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf && \
COMPOSER=composer.local.json composer require --no-update mediawiki/semantic-media-wiki ${SMW_VERSION} && \
curl -L https://github.com/wikimedia/mediawiki-extensions-PageSchemas/archive/refs/tags/${PS_VERSION}.tar.gz \
| tar zx --strip-components=1 --one-top-level=extensions/PageSchemas && \
curl -L https://github.com/wikimedia/mediawiki-extensions-AdminLinks/archive/refs/tags/${AL_VERSION}.tar.gz \
| tar zx --strip-components=1 --one-top-level=extensions/AdminLinks && \
COMPOSER=composer.local.json composer require --no-update mediawiki/maps ${MAPS_VERSION} && \
COMPOSER=composer.local.json composer require --no-update mediawiki/semantic-result-formats ${SRF_VERSION} && \
sudo -u www-data composer update && \
echo \
"wfLoadExtension( 'SemanticMediaWiki' );\n" \
"enableSemantics( 'localhost' );\n" \
"wfLoadExtension( 'PageSchemas' );\n" \
"wfLoadExtension( 'AdminLinks' );\n" \
"wfLoadExtension( 'Maps' );\n" \
"wfLoadExtension( 'SemanticResultFormats' );\n" \
>> LocalSettings.php && \
php maintenance/update.php --skip-external-dependencies --quick
ARG PHP_VERSION

# get needed dependencies for this extension
RUN sed -i s/80/8080/g /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

RUN COMPOSER=composer.local.json composer require --no-update mediawiki/semantic-media-wiki ${SMW_VERSION}
RUN curl -L https://github.com/wikimedia/mediawiki-extensions-PageSchemas/archive/refs/tags/${PS_VERSION}.tar.gz \
| tar zx --strip-components=1 --one-top-level=extensions/PageSchemas
RUN curl -L https://github.com/wikimedia/mediawiki-extensions-AdminLinks/archive/refs/tags/${AL_VERSION}.tar.gz \
| tar zx --strip-components=1 --one-top-level=extensions/AdminLinks
RUN COMPOSER=composer.local.json composer require --no-update mediawiki/maps ${MAPS_VERSION}
RUN COMPOSER=composer.local.json composer require --no-update mediawiki/semantic-result-formats ${SRF_VERSION}
RUN composer update


ENV EXTENSION=SemanticDrilldown
COPY composer*.json package*.json /var/www/html/extensions/$EXTENSION/

RUN cd extensions/$EXTENSION && \
npm ci && \
composer update
RUN cd extensions/$EXTENSION && npm ci
RUN cd extensions/$EXTENSION && composer update

COPY . /var/www/html/extensions/$EXTENSION

RUN echo \
"wfLoadExtension( 'SemanticMediaWiki' );\n" \
"enableSemantics( 'localhost' );\n" \
"wfLoadExtension( 'PageSchemas' );\n" \
"wfLoadExtension( 'AdminLinks' );\n" \
"wfLoadExtension( 'Maps' );\n" \
"wfLoadExtension( 'SemanticResultFormats' );\n" \
"wfLoadExtension( '$EXTENSION' );\n" \
>> LocalSettings.php
>> __setup_extension__
167 changes: 126 additions & 41 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,83 +1,146 @@
-include .env
export

# ======== Naming ========
EXTENSION := SemanticDrilldown
EXTENSION_FOLDER := /var/www/html/extensions/$(EXTENSION)
extension := $(shell echo $(EXTENSION) | tr A-Z a-z})
IMAGE_NAME := $(extension):test-$(MW_VERSION)-$(SMW_VERSION)-$(PS_VERSION)-$(AL_VERSION)-$(MAPS_VERSION)-$(SRF_VERSION)


# ======== CI ENV Variables ========
MW_VERSION ?= 1.35
SMW_VERSION ?= 4.1.0
PS_VERSION ?= 0.6.1
AL_VERSION ?= 0.4.2
MAPS_VERSION ?= 9.0.7
SRF_VERSION ?= 4.0.1
PHP_VERSION ?= 7.4
DB_TYPE ?= sqlite
DB_IMAGE ?= ""


environment = IMAGE_NAME=$(IMAGE_NAME) \
MW_VERSION=$(MW_VERSION) \
SMW_VERSION=$(SMW_VERSION) \
PS_VERSION=$(PS_VERSION) \
AL_VERSION=$(AL_VERSION) \
MAPS_VERSION=$(MAPS_VERSION) \
SRF_VERSION=$(SRF_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

EXTENSION_FOLDER := /var/www/html/extensions/$(EXTENSION)
extension := $(shell echo $(EXTENSION) | tr A-Z a-z})
IMAGE_NAME := $(extension):test-$(MW_VERSION)-$(SMW_VERSION)-$(PS_VERSION)-$(AL_VERSION)-$(MAPS_VERSION)-$(SRF_VERSION)
PWD := $(shell bash -c "pwd -W 2>/dev/null || pwd")# this way it works on Windows and Linux
DOCKER_RUN_ARGS := --rm -v $(PWD)/coverage:$(EXTENSION_FOLDER)/coverage -w $(EXTENSION_FOLDER) $(IMAGE_NAME)
docker_run := docker run $(DOCKER_RUN_ARGS)

.PHONY: all
all:
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-run = $(compose) run -T --rm
compose-exec-wiki = $(compose) exec -T wiki

show-current-target = @echo; echo "======= $@ ========"

# ======== CI ========
# ======== Global Targets ========

.PHONY: ci
ci: build test
ci: install composer-test npm-test

.PHONY: ci-coverage
ci-coverage: build test-coverage
ci-coverage: install composer-test-coverage npm-test-coverage

.PHONY: install
install: destroy up .install

.PHONY: build
build:
docker build --tag $(IMAGE_NAME) \
--build-arg=MW_VERSION=$(MW_VERSION) \
--build-arg=SMW_VERSION=$(SMW_VERSION) \
--build-arg=PS_VERSION=$(PS_VERSION) \
--build-arg=AL_VERSION=$(AL_VERSION) \
--build-arg=MAPS_VERSION=$(MAPS_VERSION) \
--build-arg=SRF_VERSION=$(SRF_VERSION) \
.
.PHONY: up
up: .init .build .up

.PHONY: test
test: composer-test npm-test
.PHONY: down
down: .init .down

.PHONY: test-coverage
test-coverage: composer-test-coverage npm-test-coverage
.PHONY: destroy
destroy: .init .destroy

.PHONY: bash
bash: up .bash

# ======== General Docker-Compose Helper Targets ========

.PHONY: .build
.build:
$(show-current-target)
$(compose-ci) build wiki
.PHONY: .up
.up:
$(show-current-target)
$(compose-ci) up -d

.PHONY: .install
.install: .wait-for-db
$(show-current-target)
$(compose-exec-wiki) bash -c "sudo -u www-data \
php maintenance/install.php \
--pass=wiki4everyone --server=http://localhost:8080 --scriptpath='' \
--dbname=wiki --dbuser=wiki --dbpass=wiki $(WIKI_DB_CONFIG) wiki WikiSysop && \
cat __setup_extension__ >> LocalSettings.php && \
sudo -u www-data php maintenance/update.php --skip-external-dependencies --quick \
"

.PHONY: .down
.down:
$(show-current-target)
$(compose-ci) down

.PHONY: .destroy
.destroy:
$(show-current-target)
$(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:
$(docker_run) composer test
$(show-current-target)
$(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test"

.PHONY: composer-test-coverage
composer-test-coverage:
$(docker_run) composer test-coverage
$(show-current-target)
$(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && composer test-coverage"

.PHONY: npm-test
npm-test:
$(docker_run) npm run test
$(show-current-target)
$(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && npm run test"

.PHONY: npm-test-coverage
npm-test-coverage:
$(docker_run) npm run test-coverage
$(show-current-target)
$(compose-exec-wiki) bash -c "cd $(EXTENSION_FOLDER) && npm run test-coverage"

.PHONY: bash
bash:
docker run -it -v $(PWD):/src $(DOCKER_RUN_ARGS) bash
# ======== Dev Targets ========

.PHONY: dev-bash
dev-bash:
docker run -it --rm -p 8080:8080 \
-v $(PWD):$(EXTENSION_FOLDER) \
-v $(EXTENSION_FOLDER)/vendor/ -v $(EXTENSION_FOLDER)/node_modules/ \
-w $(EXTENSION_FOLDER) $(IMAGE_NAME) bash -c 'service apache2 start && bash'
dev-bash: .init
$(compose-dev) run -it wiki bash -c 'service apache2 start && bash'

.PHONY: run
run:
docker run -d -p 8080:8080 --name $(extension) \
-v $(PWD):$(EXTENSION_FOLDER) \
-v $(EXTENSION_FOLDER)/vendor/ -v $(EXTENSION_FOLDER)/node_modules/ \
$(IMAGE_NAME)
$(compose-dev) -f docker-compose-dev.yml run -it wiki

# ======== Releasing ========

VERSION = `node -e 'console.log(require("./extension.json").version)'`

.PHONY: release
Expand All @@ -99,3 +162,25 @@ 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)
ifeq ($(DB_TYPE), mysql)
$(compose-run) wait-for $(DB_TYPE):3306 -t 120
else ifeq ($(DB_TYPE), postgres)
$(compose-run) wait-for $(DB_TYPE):5432 -t 120
endif
4 changes: 4 additions & 0 deletions docker-compose-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
services:
wiki:
volumes:
- ./coverage:${EXTENSION_FOLDER}/coverage
9 changes: 9 additions & 0 deletions docker-compose-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
wiki:
volumes:
- ./:${EXTENSION_FOLDER}
- ${EXTENSION_FOLDER}/vendor/
- ${EXTENSION_FOLDER}/node_modules/
ports:
- 8080:8080

Loading

0 comments on commit a0b348c

Please sign in to comment.