diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index fafdf22ea..c656ed4ed 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -53,6 +53,10 @@ pipeline { name 'PHP_VERSION' values '7.2', '7.3', '7.4' } + axis { + name 'DOCKERFILE' + values 'Dockerfile', 'Dockerfile.alpine' + } } stages { stage('Build') { @@ -64,9 +68,9 @@ pipeline { // When running in the CI with multiple parallel stages // the access could be considered as a DDOS attack. retryWithSleep(retries: 3, seconds: 5, backoff: true) { - sh script: "PHP_VERSION=${PHP_VERSION} make -f .ci/Makefile prepare", label: 'prepare docker image' + sh script: "PHP_VERSION=${PHP_VERSION} DOCKERFILE=${DOCKERFILE} make -f .ci/Makefile prepare", label: 'prepare docker image' } - sh script: "PHP_VERSION=${PHP_VERSION} make -f .ci/Makefile build", label: 'build' + sh script: "PHP_VERSION=${PHP_VERSION} DOCKERFILE=${DOCKERFILE} make -f .ci/Makefile build", label: 'build' } } } @@ -75,7 +79,7 @@ pipeline { steps { withGithubNotify(context: "PHPT-Tests-${PHP_VERSION}", tab: 'tests') { dir("${BASE_DIR}"){ - sh script: "PHP_VERSION=${PHP_VERSION} make -f .ci/Makefile test", label: 'test' + sh script: "PHP_VERSION=${PHP_VERSION} DOCKERFILE=${DOCKERFILE} make -f .ci/Makefile test", label: 'test' } } } @@ -89,8 +93,8 @@ pipeline { steps { withGithubNotify(context: "Generate-For-Package-${PHP_VERSION}") { dir("${BASE_DIR}"){ - sh script: "PHP_VERSION=${PHP_VERSION} make -f .ci/Makefile generate-for-package", label: 'generate-for-package' - stash includes: 'src/ext/modules/*.so', name: "generate-for-package-${PHP_VERSION}" + sh script: "PHP_VERSION=${PHP_VERSION} DOCKERFILE=${DOCKERFILE} make -f .ci/Makefile generate-for-package", label: 'generate-for-package' + stash includes: 'src/ext/modules/*.so', name: "generate-for-package-${PHP_VERSION}-${DOCKERFILE}" } } } @@ -99,7 +103,7 @@ pipeline { steps { withGithubNotify(context: "PHPUnit-Tests-${PHP_VERSION}", tab: 'tests') { dir("${BASE_DIR}"){ - sh script: "PHP_VERSION=${PHP_VERSION} make -f .ci/Makefile composer", label: 'composer' + sh script: "PHP_VERSION=${PHP_VERSION} DOCKERFILE=${DOCKERFILE} make -f .ci/Makefile composer", label: 'composer' } } } @@ -118,9 +122,12 @@ pipeline { deleteDir() unstash 'source' dir("${BASE_DIR}"){ - unstash 'generate-for-package-7.2' - unstash 'generate-for-package-7.3' - unstash 'generate-for-package-7.4' + unstash 'generate-for-package-7.2-Dockerfile' + unstash 'generate-for-package-7.3-Dockerfile' + unstash 'generate-for-package-7.4-Dockerfile' + unstash 'generate-for-package-7.2-Dockerfile.alpine' + unstash 'generate-for-package-7.3-Dockerfile.alpine' + unstash 'generate-for-package-7.4-Dockerfile.alpine' sh script: "make -C packaging package", label: 'package' sh script: "make -C packaging info", label: 'package info' stash includes: 'build/packages/*', name: 'package' diff --git a/.ci/Makefile b/.ci/Makefile index 249af261d..b6ecee6e2 100644 --- a/.ci/Makefile +++ b/.ci/Makefile @@ -1,5 +1,11 @@ IMAGE := test-php PHP_VERSION ?= 7.2 +DOCKERFILE ?= Dockerfile +SUFFIX := +ifeq ($(DOCKERFILE), Dockerfile.alpine) + ## This is only required to tag the docker images used for building/testing this project + SUFFIX := -alpine +endif CURRENT_UID := $(shell id -u) CURRENT_GID := $(shell id -g) @@ -13,7 +19,8 @@ help: ## Display this help text prepare: ## Build docker image for building and testing the project docker build \ --build-arg PHP_VERSION=${PHP_VERSION} \ - --tag $(IMAGE):${PHP_VERSION} . + --tag $(IMAGE):${PHP_VERSION}$(SUFFIX) \ + -f ${DOCKERFILE} . .PHONY: build build: prepare ## Build the project @@ -21,7 +28,7 @@ build: prepare ## Build the project docker run --rm -t \ -u $(CURRENT_UID):$(CURRENT_GID) \ -v $(PWD):/app \ - $(IMAGE):${PHP_VERSION} + $(IMAGE):${PHP_VERSION}$(SUFFIX) .PHONY: test test: prepare ## Test the project @@ -29,7 +36,7 @@ test: prepare ## Test the project docker run --rm -t \ -u $(CURRENT_UID):$(CURRENT_GID) \ -v $(PWD):/app \ - $(IMAGE):${PHP_VERSION} \ + $(IMAGE):${PHP_VERSION}$(SUFFIX) \ make test .PHONY: generate-for-package @@ -37,7 +44,7 @@ generate-for-package: prepare ## Generate the agent extension for the package # docker as root to install the extension docker run --rm -t \ -v $(PWD):/app \ - $(IMAGE):${PHP_VERSION} \ + $(IMAGE):${PHP_VERSION}$(SUFFIX) \ /app/.ci/generate-for-package.sh .PHONY: composer @@ -45,7 +52,7 @@ composer: prepare ## Run composer # docker as root to install the extension docker run -t --rm \ -v $(PWD):/app \ - $(IMAGE):${PHP_VERSION} \ + $(IMAGE):${PHP_VERSION}$(SUFFIX) \ sh -c 'make install \ && echo 'extension=elastic_apm.so' > /usr/local/etc/php/php.ini \ && echo 'elastic_apm.bootstrap_php_part_file=/app/src/bootstrap_php_part.php' >> /usr/local/etc/php/php.ini \ diff --git a/.ci/generate-for-package.sh b/.ci/generate-for-package.sh index f0c6e4e84..b83f9d0d7 100755 --- a/.ci/generate-for-package.sh +++ b/.ci/generate-for-package.sh @@ -6,10 +6,13 @@ HYPHEN="-" MODULES_DIR=/app/src/ext/modules NAME=elastic_apm ## Prepare context where to copy the previous generated so files -GENERATED=$(mktemp -d /tmp/dir-XXXX) -SEARCH="${MODULES_DIR}/*${HYPHEN}*.so" -if ls "${SEARCH}" 1> /dev/null 2>&1; then - cp -f "${SEARCH}" "${GENERATED}" || true +GENERATED_DIR=$(mktemp -d /tmp/dirXXXXXX) +find "${MODULES_DIR}" -name "*${HYPHEN}*.so" -exec cp {} ${GENERATED_DIR} \; +ls -l ${GENERATED_DIR} + +## If alpine then add another suffix +if grep -q -i alpine /etc/os-release; then + SUFFIX=${HYPHEN}alpine fi ## Generate so file @@ -20,12 +23,10 @@ make PHP_API=$(php -i | grep -i 'PHP API' | sed -e 's#.* =>##g' | awk '{print $1}') ## Rename so file with the PHP api -mv "${MODULES_DIR}/${NAME}.so" "${MODULES_DIR}/${NAME}${HYPHEN}${PHP_API}.so" +mv "${MODULES_DIR}/${NAME}.so" "${MODULES_DIR}/${NAME}${HYPHEN}${PHP_API}${SUFFIX}.so" ## Remove la files find "${MODULES_DIR}" -name "*.la" -print0 | xargs -0 rm -f ## Restore previous so files. -if ls "${SEARCH}" 1> /dev/null 2>&1; then - cp -f "${SEARCH}" ${MODULES_DIR}/ -fi +find "${GENERATED_DIR}" -name "*${HYPHEN}*.so" -exec cp -f {} ${MODULES_DIR}/ \; diff --git a/.gitignore b/.gitignore index b6fa7c989..614f0a912 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,4 @@ phpunit.xml html_docs # Packaging artifacts -build/packages \ No newline at end of file +build/ \ No newline at end of file diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 68ede5ce2..67500a0d9 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -22,11 +22,17 @@ PHP_VERSION=7.2 make -f .ci/Makefile generate-for-package ## To install with composer PHP_VERSION=7.2 make -f .ci/Makefile composer +## To generate the agent extension with the existing PHP API for alpine +PHP_VERSION=7.2 DOCKERFILE=Dockerfile.alpine make -f .ci/Makefile generate-for-package + ## Help goal will provide further details make -f .ci/Makefile help ``` -_NOTE_: `PHP_VERSION` can be set to a different PHP version. +_NOTE_: + +* `PHP_VERSION` can be set to a different PHP version. +* Alpine specific binaries can be generated if using `DOCKERFILE=Dockerfile.alpine` To generate the packages then you can use the `packaging/Dockerfile`, see the below commands: diff --git a/Dockerfile.alpine b/Dockerfile.alpine new file mode 100644 index 000000000..79afaac09 --- /dev/null +++ b/Dockerfile.alpine @@ -0,0 +1,30 @@ +ARG PHP_VERSION=7.2 +FROM php:${PHP_VERSION}-fpm-alpine + +RUN apk update \ + && apk add \ + autoconf \ + bash \ + build-base \ + curl \ + curl-dev \ + git \ + procps \ + unzip + +RUN php -r "copy('https://raw.githubusercontent.com/composer/getcomposer.org/baecae060ee7602a9908f2259f7460b737839972/web/installer', 'composer-setup.php');" \ + && php -r "if (hash_file('sha384', 'composer-setup.php') === '572cb359b56ad9ae52f9c23d29d4b19a040af10d6635642e646a7caa7b96de717ce683bd797a92ce99e5929cc51e7d5f') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ + && php composer-setup.php --install-dir=/usr/bin --filename=composer --version=1.10.10 \ + && php -r "unlink('composer-setup.php');" + +WORKDIR /app/src/ext + +ENV REPORT_EXIT_STATUS=1 +ENV TEST_PHP_DETAILED=1 +ENV NO_INTERACTION=1 +ENV TEST_PHP_JUNIT=/app/junit.xml + +CMD phpize \ + && ./configure --enable-elastic_apm \ + && make clean \ + && make diff --git a/packaging/Dockerfile b/packaging/Dockerfile index 321d59d8b..815ad2336 100644 --- a/packaging/Dockerfile +++ b/packaging/Dockerfile @@ -1,11 +1,18 @@ FROM ruby:2.7.1-alpine3.12 +ENV FPM_VERSION 1.11.0 RUN apk add --no-cache \ alpine-sdk make cpio curl libarchive-tools make php-pear \ python3 py3-virtualenv py3-setuptools py3-pip \ rpm unzip xz git tar dpkg \ && ln -sf python3 /usr/bin/python \ - && gem install --no-document fpm + && gem install --no-document fpm -v ${FPM_VERSION} -ENTRYPOINT ["fpm"] -WORKDIR /src \ No newline at end of file +## Fix fpm issue, see https://github.com/jordansissel/fpm/issues/1227 +ADD fpm_apm.patch /tmp +RUN (cd /usr/local/bundle/gems/fpm-${FPM_VERSION}/ ; patch -p 1 < /tmp/fpm_apm.patch ) \ + && rm -f /tmp/fpm_apk.patch + +COPY create-package.sh /bin +WORKDIR /src +ENTRYPOINT ["/bin/create-package.sh"] \ No newline at end of file diff --git a/packaging/Makefile b/packaging/Makefile index f631ff69a..45c67f8e1 100644 --- a/packaging/Makefile +++ b/packaging/Makefile @@ -4,7 +4,9 @@ VERSION?=$(shell grep 'VERSION' ../src/ElasticApm/ElasticApm.php | cut -d= -f2 | OUTPUT:=build/packages PHP_AGENT_DIR:=/opt/elastic/apm-agent-php PHP_VERSION?=7.2 -GIT_SHA ?= $(shell git rev-parse HEAD || echo "unknown") +GIT_SHA?=$(shell git rev-parse HEAD || echo "unknown") + +export FPM_FLAGS= .PHONY: help .DEFAULT_GOAL := help @@ -20,41 +22,29 @@ prepare: ## Build docker image for the packaging @docker build -t $(IMAGE) . create-%: prepare ## Create the specific package - @echo 'Creating package ...' + @echo "Creating package $* ..." @mkdir -p $(PWD)/$(OUTPUT) @docker run --rm \ -v $(PWD):/app \ - -w /app $(IMAGE) \ - --input-type dir \ - --output-type $* \ - --name $(NAME) \ - --version $(VERSION) \ - --architecture all \ - --url 'https://github.com/elastic/apm-agent-php' \ - --maintainer 'APM Team ' \ - --license 'ASL 2.0' \ - --vendor 'Elasticsearch, Inc.' \ - --description "PHP agent for Elastic APM\nGit Commit: ${GIT_SHA}" \ - --package $(OUTPUT) \ - --chdir /app \ - --after-install=packaging/post-install.sh \ - packaging/post-install.sh=$(PHP_AGENT_DIR)/bin/post-install.sh \ - src/ext/modules/=$(PHP_AGENT_DIR)/extensions \ - README.md=$(PHP_AGENT_DIR)/docs/README.md \ - src/ElasticApm=$(PHP_AGENT_DIR)/src \ - src/bootstrap_php_part.php=$(PHP_AGENT_DIR)/src/bootstrap_php_part.php - @echo 'Creating sha512sum ...' - @BINARY=$$(ls -1 $(PWD)/$(OUTPUT)/*.$*) ;\ - sha512sum $$BINARY > $$BINARY.sha512 ;\ - sed -i.bck "s#$(PWD)/$(OUTPUT)/##g" $$BINARY.sha512 ;\ - rm $(PWD)/$(OUTPUT)/*.bck - -.PHONY: rpm -rpm: create-rpm ## Create the rpm installer + -e TYPE=$* \ + -e NAME=$(NAME) \ + -e VERSION=$(VERSION) \ + -e OUTPUT=$(OUTPUT) \ + -e FPM_FLAGS=${FPM_FLAGS} \ + -e PHP_AGENT_DIR=${PHP_AGENT_DIR} \ + -w /app $(IMAGE) + +.PHONY: apk +apk: FPM_FLAGS="--depends=bash" +apk: create-apk ## Create the apk installer .PHONY: deb deb: create-deb ## Create the deb installer +.PHONY: rpm +rpm: create-rpm ## Create the rpm installer + ## TODO: fpm replaces - with _ in the version + .PHONY: tar tar: create-tar ## Create the tar.gz @@ -63,17 +53,16 @@ version: ## Show the fpm version @docker run --rm $(IMAGE) --version .PHONY: package -package: rpm deb tar ## Create all the installers +package: apk deb rpm tar ## Create all the installers .PHONY: info -info: rpm-info deb-info tar-info ## Show the package metadata for all the installers +info: apk-info deb-info rpm-info tar-info ## Show the package metadata for all the installers -.PHONY: rpm-info -rpm-info: ## Show the rpm package metadata +.PHONY: apk-info +apk-info: ## Show the apk package metadata @cd $(PWD) ;\ - BINARY=$$(ls -1 $(OUTPUT)/*.rpm) ;\ - docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/rpm $(IMAGE) -qip $$BINARY ;\ - docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/rpm $(IMAGE) -qlp $$BINARY + BINARY=$$(ls -1 $(OUTPUT)/*.apk) ;\ + docker run --rm -v $(PWD):/app -w /app --entrypoint /sbin/apk $(IMAGE) manifest $$BINARY .PHONY: deb-info deb-info: ## Show the deb package metadata @@ -82,32 +71,46 @@ deb-info: ## Show the deb package metadata docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/dpkg $(IMAGE) --info $$BINARY ;\ docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/dpkg $(IMAGE) -c $$BINARY +.PHONY: rpm-info +rpm-info: ## Show the rpm package metadata + @cd $(PWD) ;\ + BINARY=$$(ls -1 $(OUTPUT)/*.rpm) ;\ + docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/rpm $(IMAGE) -qip $$BINARY ;\ + docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/rpm $(IMAGE) -qlp $$BINARY + .PHONY: tar-info tar-info: ## Show the tar package metadata @cd $(PWD) ;\ BINARY=$$(ls -1 $(OUTPUT)/*.tar) ;\ docker run --rm -v $(PWD):/app -w /app --entrypoint /usr/bin/tar $(IMAGE) -tvf $$BINARY -.PHONY: rpm-install -rpm-install: ## Install the rpm installer to run some smoke tests - @cd $(PWD)/packaging/test/centos ;\ - docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t rpm-install . ;\ +.PHONY: apk-install +apk-install: ## Install the apk installer to run some smoke tests + @cd $(PWD)/packaging/test/alpine ;\ + docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t $@ . ;\ cd - - docker run --rm -v $(PWD):/src -w /src -e TYPE=rpm rpm-install + docker run --rm -v $(PWD):/src -w /src $@ .PHONY: deb-install deb-install: ## Install the deb installer to run some smoke tests @cd $(PWD)/packaging/test/ubuntu ;\ - docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t deb-install . ;\ + docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t $@ . ;\ cd - - @docker run --rm -v $(PWD):/src -w /src -e TYPE=deb deb-install + @docker run --rm -v $(PWD):/src -w /src -e TYPE=deb $@ .PHONY: tar-install tar-install: ## Install the tar installer to run some smoke tests @cd $(PWD)/packaging/test/ubuntu ;\ - docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t tar-install . ;\ + docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t $@ . ;\ + cd - + @docker run --rm -v $(PWD):/src -w /src -e TYPE=tar $@ + +.PHONY: rpm-install +rpm-install: ## Install the rpm installer to run some smoke tests + @cd $(PWD)/packaging/test/centos ;\ + docker build --build-arg PHP_VERSION=$(PHP_VERSION) -t $@ . ;\ cd - - docker run --rm -v $(PWD):/src -w /src -e TYPE=tar tar-install + @docker run --rm -v $(PWD):/src -w /src -e TYPE=rpm $@ .PHONY: install -install: deb-install rpm-install tar-install ## Install all the distributions +install: apk-install deb-install rpm-install tar-install ## Install all the distributions diff --git a/packaging/create-package.sh b/packaging/create-package.sh new file mode 100755 index 000000000..ba68f16f4 --- /dev/null +++ b/packaging/create-package.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env sh +set -x + +## so files manipulation to avoid specific platform so files +## - If alpine then use only alpine so files +## - If deb/rpm then skip alpine so files +## - If tar then use all the so files +BUILD_EXT_DIR=build/ext/modules/ +mkdir -p ${BUILD_EXT_DIR} +cp -rf src/ext/modules/*.so ${BUILD_EXT_DIR} +if [ "${TYPE}" = 'apk' ] ; then + find ${BUILD_EXT_DIR} -type f -name '*.so' ! -name '*-alpine.so' -delete +elif [ "${TYPE}" = 'deb' ] || [ "${TYPE}" = 'rpm' ] ; then + find ${BUILD_EXT_DIR} -type f -name '*-alpine.so' -delete +fi + +## Create package +fpm --input-type dir \ + --output-type "${TYPE}" \ + --name "${NAME}" \ + --version "${VERSION}" \ + --architecture all \ + --url 'https://github.com/elastic/apm-agent-php' \ + --maintainer 'APM Team ' \ + --license 'ASL 2.0' \ + --vendor 'Elasticsearch, Inc.' \ + --description "PHP agent for Elastic APM\nGit Commit: ${GIT_SHA}" \ + --package "${OUTPUT}" \ + --chdir /app ${FPM_FLAGS} \ + --after-install=packaging/post-install.sh \ + packaging/post-install.sh=${PHP_AGENT_DIR}/bin/post-install.sh \ + ${BUILD_EXT_DIR}=${PHP_AGENT_DIR}/extensions \ + README.md=${PHP_AGENT_DIR}/docs/README.md \ + src/ElasticApm=${PHP_AGENT_DIR}/src \ + src/bootstrap_php_part.php=${PHP_AGENT_DIR}/src/bootstrap_php_part.php + +## Create sha512 +BINARY=$(ls -1 "${OUTPUT}"/*."${TYPE}") +SHA=${BINARY}.sha512 +sha512sum "${BINARY}" > "${SHA}" +sed -i.bck "s#${OUTPUT}/##g" "${SHA}" +rm "${OUTPUT}"/*.bck \ No newline at end of file diff --git a/packaging/fpm_apm.patch b/packaging/fpm_apm.patch new file mode 100644 index 000000000..fca506ac2 --- /dev/null +++ b/packaging/fpm_apm.patch @@ -0,0 +1,25 @@ +From b0c150228d9660d45144f470607bf796e36ba265 Mon Sep 17 00:00:00 2001 +From: Victor Martinez +Date: Thu, 23 Jul 2020 15:32:54 +0100 +Subject: [PATCH] As suggested in + https://github.com/jordansissel/fpm/issues/1227 + +--- + lib/fpm/package/apk.rb | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/fpm/package/apk.rb b/lib/fpm/package/apk.rb +index dd69067..9648e7f 100644 +--- a/lib/fpm/package/apk.rb ++++ b/lib/fpm/package/apk.rb +@@ -252,7 +252,7 @@ class FPM::Package::APK< FPM::Package + + # directories have a magic string inserted into their name + full_record_path = extension_header[TAR_NAME_OFFSET_START..TAR_NAME_OFFSET_END].delete("\0") +- full_record_path = add_paxstring(full_record_path) ++ # full_record_path = add_paxstring(full_record_path) + + # hash data contents with sha1, if there is any content. + if(typeflag == '5') +-- +2.24.3 (Apple Git-128) \ No newline at end of file diff --git a/packaging/post-install.sh b/packaging/post-install.sh index 6b123645f..8f5944715 100644 --- a/packaging/post-install.sh +++ b/packaging/post-install.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash +######### Let's support alpine installations +PATH=${PATH}:/usr/local/bin + ################################################################################ ############################ GLOBAL VARIABLES ################################## ################################################################################ @@ -79,7 +82,11 @@ function agent_extension_not_supported() { #### Function get_extension_file ############################################### function get_extension_file() { PHP_API=$(php_api) - echo "${EXTENSION_DIR}/elastic_apm-${PHP_API}.so" + ## If alpine then add another suffix + if grep -q -i alpine /etc/os-release; then + SUFFIX=-alpine + fi + echo "${EXTENSION_DIR}/elastic_apm-${PHP_API}${SUFFIX}.so" } ################################################################################ diff --git a/packaging/test/alpine/Dockerfile b/packaging/test/alpine/Dockerfile new file mode 100644 index 000000000..2bd8f780a --- /dev/null +++ b/packaging/test/alpine/Dockerfile @@ -0,0 +1,22 @@ +ARG PHP_VERSION=7.2 +FROM php:${PHP_VERSION}-fpm-alpine + +RUN apk update \ + && apk add \ + bash \ + curl \ + git \ + procps \ + unzip + +RUN php -r "copy('https://raw.githubusercontent.com/composer/getcomposer.org/baecae060ee7602a9908f2259f7460b737839972/web/installer', 'composer-setup.php');" \ + && php -r "if (hash_file('sha384', 'composer-setup.php') === '572cb359b56ad9ae52f9c23d29d4b19a040af10d6635642e646a7caa7b96de717ce683bd797a92ce99e5929cc51e7d5f') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ + && php composer-setup.php --install-dir=/usr/bin --filename=composer --version=1.10.10 \ + && php -r "unlink('composer-setup.php');" + +RUN php -v + +COPY entrypoint.sh /bin +WORKDIR /src + +ENTRYPOINT ["/bin/entrypoint.sh"] \ No newline at end of file diff --git a/packaging/test/alpine/entrypoint.sh b/packaging/test/alpine/entrypoint.sh new file mode 100755 index 000000000..994b660e0 --- /dev/null +++ b/packaging/test/alpine/entrypoint.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh +set -x + +## Install apk package and configure the agent accordingly +apk add --allow-untrusted --verbose --no-cache build/packages/*.apk + +## Verify if the elastic php agent is enabled +if ! php -m | grep -q 'elastic' ; then + echo 'Extension has not been installed.' + exit 1 +fi + +## Validate the installation works as expected with composer +composer install +composer run-script run_component_tests_standalone_envs diff --git a/src/ext/platform.c b/src/ext/platform.c index bd1035b79..cf7b6b1e2 100644 --- a/src/ext/platform.c +++ b/src/ext/platform.c @@ -23,7 +23,6 @@ #else # include # include -# include #endif #define ELASTIC_APM_CURRENT_LOG_CATEGORY ELASTIC_APM_LOG_CATEGORY_PLATFORM @@ -159,6 +158,8 @@ String streamStackTraceLinux( if ( ! textOutputStreamStartEntry( txtOutStream, &txtOutStreamStateOnEntryStart ) ) return ELASTIC_APM_TEXT_OUTPUT_STREAM_NOT_ENOUGH_SPACE_MARKER; +#ifdef ELASTIC_APM_PLATFORM_HAS_BACKTRACE + char** addressesAsSymbols = backtrace_symbols( addresses, addressesCount ); if ( addressesAsSymbols == NULL ) { @@ -174,6 +175,12 @@ String streamStackTraceLinux( free( addressesAsSymbols ); } +#else + + streamPrintf( txtOutStream, "Could not obtain stack trace because execinfo/backtrace is not supported on this platform" ); + +#endif + return textOutputStreamEndEntry( &txtOutStreamStateOnEntryStart, txtOutStream ); } diff --git a/src/ext/platform.h b/src/ext/platform.h index 8ff5f5230..dec3e9080 100644 --- a/src/ext/platform.h +++ b/src/ext/platform.h @@ -11,11 +11,16 @@ #pragma once +#ifdef __GLIBC__ +# define ELASTIC_APM_PLATFORM_HAS_BACKTRACE +#endif + #include -#ifndef PHP_WIN32 +#ifdef ELASTIC_APM_PLATFORM_HAS_BACKTRACE # include // backtrace #endif #include "basic_types.h" +#include "basic_macros.h" #include "TextOutputStream.h" #include "ResultCode.h" @@ -47,8 +52,13 @@ size_t captureStackTraceWindows( void** addressesBuffer, size_t addressesBufferS #define ELASTIC_APM_CAPTURE_STACK_TRACE( addressesBuffer, addressesBufferSize ) \ captureStackTraceWindows( (addressesBuffer), (addressesBufferSize) ) #else -#define ELASTIC_APM_CAPTURE_STACK_TRACE( addressesBuffer, addressesBufferSize ) \ - backtrace( (addressesBuffer), (addressesBufferSize) ) +# ifdef ELASTIC_APM_PLATFORM_HAS_BACKTRACE +# define ELASTIC_APM_CAPTURE_STACK_TRACE( addressesBuffer, addressesBufferSize ) \ + backtrace( (addressesBuffer), (addressesBufferSize) ) +# else +# define ELASTIC_APM_CAPTURE_STACK_TRACE( addressesBuffer, addressesBufferSize ) \ + 0 +# endif #endif String streamStackTrace( void* const* addresses, size_t addressesCount, String linePrefix, TextOutputStream* txtOutStream );