diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml index 03862343e4..d166a42529 100644 --- a/.github/workflows/build-images.yml +++ b/.github/workflows/build-images.yml @@ -58,9 +58,6 @@ jobs: - file: ./src/loadgenerator/Dockerfile tag_suffix: loadgenerator context: ./ - - file: ./src/otelcollector/Dockerfile - tag_suffix: otelcollector - context: ./ - file: ./src/paymentservice/Dockerfile tag_suffix: paymentservice context: ./ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e2260c69b..c8eebd4df2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ release. ([#935](https://github.com/open-telemetry/opentelemetry-demo/pull/935)) * [cartservice] update service to .NET 7 ([#942](https://github.com/open-telemetry/opentelemetry-demo/pull/942)) +* [tests] Add trace-based testing examples + ([#877](https://github.com/open-telemetry/opentelemetry-demo/pull/877)) * Introduce minimal mode to run demo ([#872](https://github.com/open-telemetry/opentelemetry-demo/pull/872)) * [frontendproxy]Envoy expose a route for the collector to route frontend spans @@ -63,10 +65,10 @@ release. ([#988](https://github.com/open-telemetry/opentelemetry-demo/pull/988)) * [FraudDetectionService] Updated Kotlin version and OTel dependencies ([#987](https://github.com/open-telemetry/opentelemetry-demo/pull/987)) -* [otelcol] Use the collector builder to produce otelcol docker image - ([#944](https://github.com/open-telemetry/opentelemetry-demo/pull/944)) * [quoteservice] update php dependencies ([#994](https://github.com/open-telemetry/opentelemetry-demo/issues/994)) +* [tests] Update trace-based tests run script + ([#1018](https://github.com/open-telemetry/opentelemetry-demo/pull/1018)) * [PaymentService] Update node to LTS version and bump deps ([#1029](https://github.com/open-telemetry/opentelemetry-demo/issues/1029)) diff --git a/Makefile b/Makefile index ff657bffb0..099992dcd3 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ run-tests: docker compose run traceBasedTests run-tracetesting: - docker compose run traceBasedTests + docker compose run traceBasedTests ${SERVICES_TO_TEST} .PHONY: generate-protobuf generate-protobuf: diff --git a/README.md b/README.md index b4bfab5fb3..75a665c2c3 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,8 @@ keeping it up to date for you. ## Contributing To get involved with the project see our [CONTRIBUTING](CONTRIBUTING.md) -documentation. Our [SIG Calls](CONTRIBUTING.md#join-a-sig-call) are Mondays at -8:15 AM PST and anyone is welcome. +documentation. Our [SIG Calls](CONTRIBUTING.md#join-a-sig-call) are every other +Monday at 8:30 AM PST and anyone is welcome. ## Project leadership diff --git a/docker-compose.minimal.yml b/docker-compose.minimal.yml index 0dd2099d2e..662bfb1a09 100644 --- a/docker-compose.minimal.yml +++ b/docker-compose.minimal.yml @@ -501,13 +501,8 @@ services: # OpenTelemetry Collector otelcol: - image: ${IMAGE_NAME}:${IMAGE_VERSION}-otelcol + image: otel/opentelemetry-collector-contrib:0.82.0 container_name: otel-col - build: - context: ./ - dockerfile: ./src/otelcollector/Dockerfile - cache_from: - - ${IMAGE_NAME}:${IMAGE_VERSION}-otelcol deploy: resources: limits: diff --git a/docker-compose.yml b/docker-compose.yml index 1d76400ec3..512ef41c9e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -645,13 +645,8 @@ services: # OpenTelemetry Collector otelcol: - image: ${IMAGE_NAME}:${IMAGE_VERSION}-otelcol + image: otel/opentelemetry-collector-contrib:0.82.0 container_name: otel-col - build: - context: ./ - dockerfile: ./src/otelcollector/Dockerfile - cache_from: - - ${IMAGE_NAME}:${IMAGE_VERSION}-otelcol deploy: resources: limits: diff --git a/renovate.json b/renovate.json5 similarity index 92% rename from renovate.json rename to renovate.json5 index 5d78e56c20..f6c59f6b05 100644 --- a/renovate.json +++ b/renovate.json5 @@ -109,6 +109,12 @@ "matchPaths": ["src/shippingservice"], "groupName": "shippingservice", "assigneesFromCodeOwners": true + }, + { + // intentionally using Java 11 in some examples + // not using matchUpdateTypes "major", because renovate wants to bump "11-jre" to "11.0.19_7-jre" + "matchPackageNames": ["eclipse-temurin"], + "enabled": false } ] } \ No newline at end of file diff --git a/src/cartservice/cartservice.sln b/src/cartservice/cartservice.sln index 9929dc483c..8d32082529 100644 --- a/src/cartservice/cartservice.sln +++ b/src/cartservice/cartservice.sln @@ -1,48 +1,48 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cartservice", "src\cartservice.csproj", "{2348C29F-E8D3-4955-916D-D609CBC97FCB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cartservice.tests", "tests\cartservice.tests.csproj", "{59825342-CE64-4AFA-8744-781692C0811B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x64.ActiveCfg = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x64.Build.0 = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x86.ActiveCfg = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x86.Build.0 = Debug|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|Any CPU.Build.0 = Release|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x64.ActiveCfg = Release|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x64.Build.0 = Release|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x86.ActiveCfg = Release|Any CPU - {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x86.Build.0 = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x64.ActiveCfg = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x64.Build.0 = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x86.ActiveCfg = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x86.Build.0 = Debug|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|Any CPU.Build.0 = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|x64.ActiveCfg = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|x64.Build.0 = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|x86.ActiveCfg = Release|Any CPU - {59825342-CE64-4AFA-8744-781692C0811B}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cartservice", "src\cartservice.csproj", "{2348C29F-E8D3-4955-916D-D609CBC97FCB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cartservice.tests", "tests\cartservice.tests.csproj", "{59825342-CE64-4AFA-8744-781692C0811B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x64.ActiveCfg = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x64.Build.0 = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x86.ActiveCfg = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Debug|x86.Build.0 = Debug|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|Any CPU.Build.0 = Release|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x64.ActiveCfg = Release|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x64.Build.0 = Release|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x86.ActiveCfg = Release|Any CPU + {2348C29F-E8D3-4955-916D-D609CBC97FCB}.Release|x86.Build.0 = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x64.ActiveCfg = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x64.Build.0 = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x86.ActiveCfg = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Debug|x86.Build.0 = Debug|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|Any CPU.Build.0 = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|x64.ActiveCfg = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|x64.Build.0 = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|x86.ActiveCfg = Release|Any CPU + {59825342-CE64-4AFA-8744-781692C0811B}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 4a0bc1c318..7d9fa20fb4 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -37,7 +37,7 @@ "react-dom": "18.2.0", "react-query": "3.39.3", "sharp": "0.30.7", - "styled-components": "5.3.5", + "styled-components": "5.3.11", "ts-proto": "1.118.0", "uuid": "8.3.2" }, @@ -7000,9 +7000,9 @@ } }, "node_modules/styled-components": { - "version": "5.3.5", - "hasInstallScript": true, - "license": "MIT", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -7030,14 +7030,16 @@ }, "node_modules/styled-components/node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/styled-components/node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, @@ -12121,7 +12123,9 @@ "dev": true }, "styled-components": { - "version": "5.3.5", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -12136,10 +12140,14 @@ }, "dependencies": { "has-flag": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } diff --git a/src/frontend/package.json b/src/frontend/package.json index 4e53cc39ce..676f62c9ca 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -40,7 +40,7 @@ "react-dom": "18.2.0", "react-query": "3.39.3", "sharp": "0.30.7", - "styled-components": "5.3.5", + "styled-components": "5.3.11", "ts-proto": "1.118.0", "uuid": "8.3.2" }, diff --git a/src/otelcollector/Dockerfile b/src/otelcollector/Dockerfile deleted file mode 100644 index 13df9c53e6..0000000000 --- a/src/otelcollector/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -FROM golang:latest as build - -ARG TARGETARCH -ARG BUILDER_VERSION=0.81.0 - -RUN curl -L -o /builder https://github.com/open-telemetry/opentelemetry-collector/releases/download/cmd%2Fbuilder%2Fv${BUILDER_VERSION}/ocb_${BUILDER_VERSION}_linux_${TARGETARCH} -RUN chmod +x /builder -WORKDIR /build -COPY ./src/otelcollector/manifest.yml ./ -ENV GOARCH=$TARGETARCH -ENV CGO_ENABLED=0 -RUN /builder --config ./manifest.yml --output-path /build/_build -RUN ls /build/_build - -FROM alpine:3.16 as certs -RUN apk --update add ca-certificates - -FROM alpine - -ARG USER_UID=10001 -USER ${USER_UID} - -COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt -COPY --from=build --chmod=755 /build/_build/otelcol-demo /otelcol-demo -COPY ./src/otelcollector/otelcol-*.yml /etc/otelcol/ -ENTRYPOINT ["/otelcol-demo"] -CMD ["--config", "/etc/otelcol/otelcol-config.yml"] -EXPOSE 4317 4318 diff --git a/src/otelcollector/manifest.yml b/src/otelcollector/manifest.yml deleted file mode 100644 index 985623e8b4..0000000000 --- a/src/otelcollector/manifest.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -dist: - module: github.com/open-telemetry/opentelemetry-demo/src/otelcollector - name: otelcol-demo - description: OpenTelemetry Collector for OpenTelemetry Demo - version: 0.81.0 - output_path: ./_build - otelcol_version: 0.81.0 - -receivers: - - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.81.0 - -exporters: - - gomod: go.opentelemetry.io/collector/exporter/loggingexporter v0.81.0 - - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.81.0 - - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.81.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.81.0 -processors: - - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.81.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.81.0 -connectors: - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.81.0 diff --git a/src/quoteservice/Dockerfile b/src/quoteservice/Dockerfile index 2b56d59089..60a4993b26 100644 --- a/src/quoteservice/Dockerfile +++ b/src/quoteservice/Dockerfile @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 -FROM composer:2.4 AS build +FROM composer:2.5 AS build WORKDIR /tmp/ COPY ./src/quoteservice/composer.json . diff --git a/test/README.md b/test/README.md index 3dc7d25658..6278a379f5 100644 --- a/test/README.md +++ b/test/README.md @@ -1,7 +1,49 @@ # Service Testing -Testing gRPC services as black boxes. +There are two ways to test the service APIs in the OpenTelemetry Demo: + +1. Using black box-testing, calling gRPC services +and validating their direct response +2. Using Trace-based tests, calling both HTTP and +gRPC services and validating their direct response as well as +the distributed traces they generate + +## Testing gRPC services as black boxes + +To run the entire test suite as a black box, run the command: + +```sh +docker compose run integrationTests +``` + +If you want to run tests for a specific service, run: 1. Start the services you want to test with `docker compose up --build ` -1. Run `npm install` -1. Run `npm test` or `npx ava --match=''` to match test names +2. Run `npm install` +3. Run `npm test` or `npx ava --match=''` to match test names + +## Testing services with Trace-based tests + +To run the entire test suite of trace-based tests, run the command: + +```sh +make run-tracetesting +#or +docker compose run traceBasedTests +``` + +To run tests for specific services, pass the name of the service as a +parameter (using the folder names located [here](./tracetesting/)): + +```sh +make run-tracetesting SERVICES_TO_TEST="service-1 service-2 ..." +#or +docker compose run traceBasedTests "service-1 service-2 ..." +``` + +For instance, if you need to run the tests for `ad-service` and +`payment-service`, you can run them with: + +```sh +make run-tracetesting SERVICES_TO_TEST="ad-service payment-service" +``` diff --git a/test/tracetesting/Dockerfile b/test/tracetesting/Dockerfile index 0cec0abd95..2d5471742a 100644 --- a/test/tracetesting/Dockerfile +++ b/test/tracetesting/Dockerfile @@ -14,4 +14,4 @@ COPY ./pb ./pb WORKDIR /app/test/tracetesting -CMD ["/bin/sh", "/app/test/tracetesting/run.bash"] +ENTRYPOINT ["/bin/bash", "/app/test/tracetesting/run.bash"] diff --git a/test/tracetesting/run.bash b/test/tracetesting/run.bash index 75ee37083a..02c0100223 100755 --- a/test/tracetesting/run.bash +++ b/test/tracetesting/run.bash @@ -47,12 +47,26 @@ EOF run_tracetest() { service_name=$1 - test_file=./$service_name/all.yaml + transaction_file=./$service_name/all.yaml - tracetest --config ./cli-config.yml test run --definition $test_file --environment ./tracetesting-env.yaml --wait-for-result + tracetest --config ./cli-config.yml run transaction --file $transaction_file --environment ./tracetesting-env.yaml return $? } +ALL_SERVICES=("ad-service" "cart-service" "currency-service" "checkout-service" "frontend-service" "email-service" "payment-service" "product-catalog-service" "recommendation-service" "shipping-service") +CHOSEN_SERVICES=() + +while [[ $# -gt 0 ]]; do + CHOSEN_SERVICES+=("$1") + shift +done + +if [ ${#CHOSEN_SERVICES[@]} -eq 0 ]; then + for service in "${ALL_SERVICES[@]}"; do + CHOSEN_SERVICES+=("$service") + done +fi + check_if_tracetest_is_installed create_env_file @@ -62,17 +76,11 @@ EXIT_STATUS=0 echo "" echo "Running trace-based tests..." +echo "" -run_tracetest ad-service || EXIT_STATUS=$? -run_tracetest cart-service || EXIT_STATUS=$? -run_tracetest currency-service || EXIT_STATUS=$? -run_tracetest checkout-service || EXIT_STATUS=$? -run_tracetest frontend-service || EXIT_STATUS=$? -run_tracetest email-service || EXIT_STATUS=$? -run_tracetest payment-service || EXIT_STATUS=$? -run_tracetest product-catalog-service || EXIT_STATUS=$? -run_tracetest recommendation-service || EXIT_STATUS=$? -run_tracetest shipping-service || EXIT_STATUS=$? +for service in "${CHOSEN_SERVICES[@]}"; do + run_tracetest $service || EXIT_STATUS=$? +done echo "" echo "Tests done! Exit code: $EXIT_STATUS"