name: CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test-compose: name: 'Test suite: Compose' # List of supported runners: # https://docs.github.com/en/free-pro-team@latest/actions/reference/specifications-for-github-hosted-runners#supported-runners-and-hardware-resources runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 ##################################################### # # # Install all dependencies required by test suites. # # # ##################################################### - name: Prepare environment run: | # Install Linux packages # # List of packages pre-installed in the runner: # https://docs.github.com/en/free-pro-team@latest/actions/reference/specifications-for-github-hosted-runners#supported-software sudo apt install -y expect # Enable support for Compose V2 # # Instructions: # https://docs.docker.com/compose/cli-command/#install-on-linux mkdir -p ~/.docker/cli-plugins curl -sL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64" -o ~/.docker/cli-plugins/docker-compose chmod +x ~/.docker/cli-plugins/docker-compose docker compose version # Pre-build container images docker compose \ -f docker-compose.yml \ -f extensions/logspout/logspout-compose.yml \ -f extensions/enterprise-search/enterprise-search-compose.yml \ -f extensions/apm-server/apm-server-compose.yml \ -f extensions/metricbeat/metricbeat-compose.yml \ -f extensions/filebeat/filebeat-compose.yml \ build ######################################################## # # # Ensure §"Initial setup" of the README remains valid. # # # ######################################################## - name: Set password of every built-in user to 'testpasswd' run: | # Change password of 'elastic' user from 'changeme' to 'testpasswd' in config files sed -i 's/\(password =>\) "changeme"/\1 "testpasswd"/g' logstash/pipeline/logstash.conf sed -i 's/\(elasticsearch.password:\) '\''changeme'\''/\1 testpasswd/g' kibana/config/kibana.yml sed -i -e 's/\(elasticsearch.password:\) '\''changeme'\''/\1 testpasswd/g' -e 's/\(secret_management.encryption_keys:\)/\1 [test-encrypt]/g' extensions/enterprise-search/config/enterprise-search.yml sed -i 's/\(password:\) '\''changeme'\''/\1 testpasswd/g' extensions/apm-server/config/apm-server.yml sed -i 's/\(password:\) '\''changeme'\''/\1 testpasswd/g' extensions/metricbeat/config/metricbeat.yml sed -i 's/\(password:\) '\''changeme'\''/\1 testpasswd/g' extensions/filebeat/config/filebeat.yml # Run Elasticsearch and wait for its availability docker compose up -d elasticsearch source .github/workflows/scripts/lib/testing.sh poll_ready "$(container_id elasticsearch)" "http://$(service_ip elasticsearch):9200/" -u 'elastic:changeme' # Set passwords .github/workflows/scripts/elasticsearch-setup-passwords.exp ########################################################## # # # Test core components: Elasticsearch, Logstash, Kibana. # # # ########################################################## - name: Run the stack run: docker compose up -d - name: Execute core test suite run: .github/workflows/scripts/run-tests-core.sh - name: 'debug: Display state and logs (core)' # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif # https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#job-status-check-functions if: always() run: | docker compose ps docker compose logs elasticsearch docker compose logs logstash docker compose logs kibana ############################## # # # Test supported extensions. # # # ############################## # # Logspout # - name: Execute Logspout test suite run: | # Set mandatory Logstash settings sed -i '$ a input { udp { port => 5000 codec => json } }' logstash/pipeline/logstash.conf # Restart Logstash for changes to take effect docker compose restart logstash # Run Logspout and execute tests. docker compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml up -d logspout .github/workflows/scripts/run-tests-logspout.sh # Revert changes to Logstash configuration sed -i '/input { udp { port => 5000 codec => json } }/d' logstash/pipeline/logstash.conf docker compose restart logstash - name: 'debug: Display state and logs (Logspout)' if: always() run: | docker compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml ps docker compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml logs logspout # next steps don't need Logspout docker compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml stop logspout # next steps don't need Logstash docker compose stop logstash # # Enterprise Search # - name: Execute Enterprise Search test suite run: | # Set mandatory Elasticsearch settings sed -i '$ a xpack.security.authc.api_key.enabled: true' elasticsearch/config/elasticsearch.yml # Restart Elasticsearch for changes to take effect docker compose restart elasticsearch # Run Enterprise Search and execute tests docker compose -f docker-compose.yml -f extensions/enterprise-search/enterprise-search-compose.yml up -d enterprise-search .github/workflows/scripts/run-tests-enterprise-search.sh # Revert changes to Elasticsearch configuration sed -i '/xpack.security.authc.api_key.enabled: true/d' elasticsearch/config/elasticsearch.yml docker compose restart elasticsearch - name: 'debug: Display state and logs (Enterprise Search)' if: always() run: | docker compose -f docker-compose.yml -f extensions/enterprise-search/enterprise-search-compose.yml ps docker compose -f docker-compose.yml -f extensions/enterprise-search/enterprise-search-compose.yml logs enterprise-search # next steps don't need Enterprise Search docker compose -f docker-compose.yml -f extensions/enterprise-search/enterprise-search-compose.yml stop enterprise-search # # APM Server # - name: Execute APM Server test suite run: | docker compose -f docker-compose.yml -f extensions/apm-server/apm-server-compose.yml up -d apm-server .github/workflows/scripts/run-tests-apm-server.sh - name: 'debug: Display state and logs (APM Server)' if: always() run: | docker compose -f docker-compose.yml -f extensions/apm-server/apm-server-compose.yml ps docker compose -f docker-compose.yml -f extensions/apm-server/apm-server-compose.yml logs apm-server # next steps don't need APM Server docker compose -f docker-compose.yml -f extensions/apm-server/apm-server-compose.yml stop apm-server # # Metricbeat # - name: Execute Metricbeat test suite run: | docker compose -f docker-compose.yml -f extensions/metricbeat/metricbeat-compose.yml up -d metricbeat .github/workflows/scripts/run-tests-metricbeat.sh - name: 'debug: Display state and logs (Metricbeat)' if: always() run: | docker compose -f docker-compose.yml -f extensions/metricbeat/metricbeat-compose.yml ps docker compose -f docker-compose.yml -f extensions/metricbeat/metricbeat-compose.yml logs metricbeat # next steps don't need Metricbeat docker compose -f docker-compose.yml -f extensions/metricbeat/metricbeat-compose.yml stop metricbeat # # Filebeat # - name: Execute Filebeat test suite run: | docker compose -f docker-compose.yml -f extensions/filebeat/filebeat-compose.yml up -d filebeat .github/workflows/scripts/run-tests-filebeat.sh - name: 'debug: Display state and logs (Filebeat)' if: always() run: | docker compose -f docker-compose.yml -f extensions/filebeat/filebeat-compose.yml ps docker compose -f docker-compose.yml -f extensions/filebeat/filebeat-compose.yml logs filebeat # next steps don't need Filebeat docker compose -f docker-compose.yml -f extensions/filebeat/filebeat-compose.yml stop filebeat ############## # # # Tear down. # # # ############## - name: Terminate all components if: always() run: >- docker compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml -f extensions/enterprise-search/enterprise-search-compose.yml -f extensions/apm-server/apm-server-compose.yml -f extensions/metricbeat/metricbeat-compose.yml -f extensions/filebeat/filebeat-compose.yml down -v test-swarm: name: 'Test suite: Swarm' runs-on: ubuntu-latest env: MODE: swarm steps: - uses: actions/checkout@v2 ##################################################### # # # Install all dependencies required by test suites. # # # ##################################################### - name: Prepare environment run: | # Install Linux packages sudo apt install -y expect # Enable Swarm mode docker swarm init ######################################################## # # # Ensure §"Initial setup" of the README remains valid. # # # ######################################################## - name: Set password of every built-in user to 'testpasswd' run: | # Change password of 'elastic' user from 'changeme' to 'testpasswd' in config files sed -i 's/\(password =>\) "changeme"/\1 "testpasswd"/g' logstash/pipeline/logstash.conf sed -i 's/\(elasticsearch.password:\) '\''changeme'\''/\1 testpasswd/g' kibana/config/kibana.yml # Run Elasticsearch and wait for its availability docker stack deploy -c ./docker-stack.yml elk docker service scale elk_logstash=0 elk_kibana=0 source .github/workflows/scripts/lib/testing.sh poll_ready "$(container_id elasticsearch)" "http://$(service_ip elasticsearch):9200/" -u 'elastic:changeme' # Set passwords .github/workflows/scripts/elasticsearch-setup-passwords.exp swarm ########################################################## # # # Test core components: Elasticsearch, Logstash, Kibana. # # # ########################################################## - name: Run the stack run: docker service scale elk_logstash=1 elk_kibana=1 - name: Execute core test suite run: .github/workflows/scripts/run-tests-core.sh swarm - name: 'debug: Display state and logs (core)' if: always() run: | docker stack services elk docker service logs elk_elasticsearch docker service logs elk_kibana docker service logs elk_logstash ############## # # # Tear down. # # # ############## - name: Terminate all components if: always() run: docker stack rm elk