From a7897ca0f623a0940fe3613ae24da4f722e4569d Mon Sep 17 00:00:00 2001 From: rockandska Date: Mon, 8 Sep 2025 15:39:35 +0200 Subject: [PATCH] add bats test under docker --- .github/workflows/pyenv_tests.yml | 9 +++- Makefile | 90 ++++++++++++++++++++++++++++--- test/Dockerfile | 25 +++++++++ 3 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 test/Dockerfile diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml index 1597ea88..f4ef12f2 100644 --- a/.github/workflows/pyenv_tests.yml +++ b/.github/workflows/pyenv_tests.yml @@ -40,10 +40,15 @@ jobs: run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - - run: | + - name: Run test on the host + run: | make test + - name: Run test with docker + if: ${{ ! contains(matrix.os, 'macos') }} + run: | + make test-docker - env: PYENV_NATIVE_EXT: 1 run: | (cd src; ./configure; make) - bats/bin/bats test/{pyenv,hooks,versions}.bats \ No newline at end of file + bats/bin/bats test/{pyenv,hooks,versions}.bats diff --git a/Makefile b/Makefile index 64724f56..44185690 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,81 @@ -BATS_VERSION = v1.10.0 +TEST_BATS_VERSION = v1.10.0 +TEST_BASH_VERSIONS = 3.2.57 4.1.17 +TEST_UNIT_DOCKER_PREFIX = test-unit-docker +TEST_UNIT_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_UNIT_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_UNIT_DOCKER_PREFIX))) +TEST_PLUGIN_DOCKER_PREFIX = test-plugin-docker +TEST_PLUGIN_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_PLUGIN_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_PLUGIN_DOCKER_PREFIX))) +TEST_BATS_IMAGE_PREFIX = test-pyenv-docker-image +TEST_BATS_IMAGE_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_BATS_IMAGE_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_BATS_IMAGE_PREFIX))) + +.PHONY: +test-docker: $(TEST_UNIT_DOCKER_PREFIX) $(TEST_PLUGIN_DOCKER_PREFIX) + +# Run all unit test under bats docker +.PHONY: $(TEST_UNIT_DOCKER_PREFIX) +$(TEST_UNIT_DOCKER_PREFIX): $(TEST_UNIT_DOCKER_TARGETS) + +# Run each unit test under bats docker +.PHONY: $(TEST_UNIT_DOCKER_TARGETS) +$(TEST_UNIT_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_UNIT_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_UNIT_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_UNIT_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_UNIT_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) +$(TEST_UNIT_DOCKER_TARGETS): $(TEST_UNIT_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% + $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker run \ + --init \ + -v $(PWD):/code:ro \ + -v /etc/passwd:/etc/passwd:ro \ + -v /etc/group:/etc/group:ro \ + -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ + $(INTERACTIVE) \ + $(DOCKER_IMAGE):$(DOCKER_TAG) \ + test/run + +# Run all plugin test under bats docker +.PHONY: $(TEST_PLUGIN_DOCKER_PREFIX) +$(TEST_PLUGIN_DOCKER_PREFIX): $(TEST_PLUGIN_DOCKER_TARGETS) + +# Run each plugin test under bats docker +.PHONY: $(TEST_PLUGIN_DOCKER_TARGETS) +$(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_PLUGIN_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_PLUGIN_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_PLUGIN_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) +$(TEST_PLUGIN_DOCKER_TARGETS): $(TEST_PLUGIN_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% + $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker run \ + --init \ + -v $(PWD):/code:ro \ + -v /etc/passwd:/etc/passwd:ro \ + -v /etc/group:/etc/group:ro \ + -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ + $(INTERACTIVE) \ + $(DOCKER_IMAGE):$(DOCKER_TAG) \ + bats plugins/python-build/test + +# Build all images needed for bats under docker +.PHONY: $(TEST_BATS_IMAGE_PREFIX) +$(TEST_BATS_IMAGE_PREFIX): $(TEST_BATS_IMAGE_TARGETS) + +# Build each image needed for bats under docker +.PHONY: $(TEST_BATS_IMAGE_TARGETS) +$(TEST_BATS_IMAGE_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_BATS_IMAGE_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_BATS_IMAGE_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_BATS_IMAGE_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_BATS_IMAGE_TARGETS): + $(info Building docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker build \ + --quiet \ + -f "$(PWD)/test/Dockerfile" \ + --build-arg GNU="$(GNU)" \ + --build-arg BASH="$(BASH)" \ + --build-arg BATS_VERSION="$(TEST_BATS_VERSION)" \ + -t $(DOCKER_IMAGE):$(DOCKER_TAG) \ + ./ .PHONY: test test-build test-unit test-plugin @@ -27,11 +104,12 @@ test-build: [ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/pip ] $(PYTHON_BUILD_TEST_PREFIX)/bin/pip -V -.SECONDARY: bats-$(BATS_VERSION) -bats-$(BATS_VERSION): +.SECONDARY: bats-$(TEST_BATS_VERSION) +bats-$(TEST_BATS_VERSION): rm -rf bats - ln -sf bats-$(BATS_VERSION) bats - git clone --depth 1 --branch $(BATS_VERSION) https://github.com/bats-core/bats-core.git bats-$(BATS_VERSION) + ln -sf bats-$(TEST_BATS_VERSION) bats + git clone --depth 1 --branch $(TEST_BATS_VERSION) https://github.com/bats-core/bats-core.git bats-$(TEST_BATS_VERSION) .PHONY: bats -bats: bats-$(BATS_VERSION) +bats: bats-$(TEST_BATS_VERSION) + ln -sf bats-$(TEST_BATS_VERSION) bats diff --git a/test/Dockerfile b/test/Dockerfile new file mode 100644 index 00000000..659c2de7 --- /dev/null +++ b/test/Dockerfile @@ -0,0 +1,25 @@ +ARG BASH + +FROM alpine/git:v2.30.0 as bats +ARG BATS_VERSION + RUN git clone https://github.com/bats-core/bats-core.git /root/bats-core \ + && cd /root/bats-core \ + && git checkout "${BATS_VERSION}" + +FROM bash:$BASH + # Gnu tools + RUN if [[ "${GNU:-}" == True ]];then \ + apk add sed coreutils findutils \ + ;fi + # Bats + RUN apk add --update parallel ncurses git \ + && mkdir -p ~/.parallel \ + && touch ~/.parallel/will-cite + COPY --from=bats /root/bats-core /root/bats-core + RUN /root/bats-core/install.sh "/usr/local" + # Clean + RUN rm -rf /var/cache/apk/* + # Setup + RUN echo 'source /etc/profile' >> ~/.bashrc + WORKDIR /code/ + CMD ["bash"]