diff --git a/.circleci/config.yml b/.circleci/config.yml index 3d0f5fb5..420d17af 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -88,7 +88,10 @@ jobs: - run: name: Run integration tests command: | - KUBECONFIG=/tmp/kubeconfig mvn clean package fabric8:build verify -Pfmp,it + /snap/bin/microk8s.kubectl config view --raw > /tmp/kubeconfig + export KUBECONFIG=/tmp/kubeconfig + cd spring-cloud-kubernetes-integration-tests + mvn -Ddocker.host='unix:///var/snap/microk8s/current/docker.sock' -Dimage.registry='localhost:32000' clean package fabric8:build verify -Pfmp,it - store_test_results: path: $HOME/artifacts/junit/ - store_artifacts: diff --git a/spring-cloud-kubernetes-integration-tests/README.md b/spring-cloud-kubernetes-integration-tests/README.md index aa1cf45e..df4984cc 100644 --- a/spring-cloud-kubernetes-integration-tests/README.md +++ b/spring-cloud-kubernetes-integration-tests/README.md @@ -1,11 +1,27 @@ # Purpose -Demonstrate how integration tests can be run against a local cluster setup with [microk8s](https://microk8s.io/) +Explain how integration tests can be run against any k8s cluster. +One way of running such a kubernetes cluster locally which is leveraged by our CI setup is [microk8s](https://microk8s.io/) The Kubernetes resources necessary to get the test application -onto the cluster are created using the [Fabric8 Maven Plugin](https://maven.fabric8.io/) +onto the cluster are created using the [Fabric8 Maven Plugin](https://maven.fabric8.io/) and the +lifecycle of the test applications is controlled by [Arquillian Cube](http://arquillian.org/arquillian-cube/) + +# Basics + +With FMP and Arquillian Cube setup for our project we need to configure the following things in order to properly get +our test applications onto our cluster of choice: + +* The `KUBECONFIG` environment variable needs to be set to the location of the Kubernetes configuration file +we will use to access our cluster (this can be skipped if this file is already present in the standard locations that kubectl assumes) +* The `docker.host` system property needs to be set to the URL where the docker daemon we will use to build images is listening +This can be skipped when we use the default unix socket on a Linux machine +* The Docker image registry were out built images will be stored needs to be set using the `image.registry` environment variable # Instructions +Here we will describe the steps that are needed to setup microk8s and the maven command we will use to run the integration +tests against that microk8s cluster + ## Install microk8s ```bash @@ -44,65 +60,43 @@ kube-system replicaset.apps/hostpath-provisioner-9979c7f64 1 kube-system replicaset.apps/kube-dns-864b8bdc77 1 1 0 41s ``` -## Setup environment for FMP to work - -One premise for the Fabric8 Maven Plugin to work is that is can read the proper Kubernetes Config file. -We export the corresponding config file for the cluster microk8s sets up to temp file which will -be used later +Export the kube config file that will be used to access this cluster ```bash microk8s.kubectl config view --raw > /tmp/kubeconfig ``` -## Deploy application -**The following commands assume that they are executed inside the maven module of each specific test** - -Since FMP is based on the Fabric8 Kubernetes Client, we can leverage the `KUBECONFIG` environment variable -to make FMP aware of the Kubernetes Config file we created above +## Launch tests ```bash -export KUBECONFIG=/tmp/kubeconfig -../../mvnw clean package fabric8:build fabric8:push fabric8:deploy -Pfmp +cd spring-cloud-kubernetes-integration-tests +KUBECONFIG=/tmp/kubeconfig mvn -Ddocker.host='unix:///var/snap/microk8s/current/docker.sock' -Dimage.registry='localhost:32000' clean package fabric8:build verify -Pfmp,it ``` -Make sure the application was deployed be executing: +The command above will for each test project: -```bash -microk8s.kubectl get pod -l app=sb-fmp-microk8s -``` - -It should look something like: - -``` -NAME READY STATUS RESTARTS AGE -simple-core-5fbb7646dc-66t7b 1/1 Running 0 57s -``` - -The integration tests can be run against the service which is deployed inside the cluster by executing: - -```bash -../../mvnw verify -Pfmp,it -Dfabric8.skip -``` - -This integration tests runs locally (making it easily debuggable), and interacts with the deployed service -using the exposed port. -By leveraging [Aquillian Cube Kubernetes](http://arquillian.org/arquillian-cube/#_kubernetes), it's able to setup and teardown resources needed for each test - -To undeploy the application from the cluster simply execute: - -```bash -../../mvnw fabric8:undeploy -Pfmp -``` - -## Run all tests - -By executing - -```bash -deploy_test_undeploy_all.sh -``` - -each one of the test applications will be deployed to the cluster and the integration tests will be executed +* Build the ubjerjar +* Build a docker image based on that uberjar +* Launch the Arquillian Cube tests which will + - Deploy the application to the cluster + - Launch the test code + - Undeploy the application + + +## Launching one of the applications manually +Each of the test modules can also be launched manually. This can be very useful for debugging purposes. +For example to launch the `simple-core` application + + ```bash + cd spring-cloud-kubernetes-integration-tests/simple-core + KUBECONFIG=/tmp/kubeconfig mvn -Ddocker.host='unix:///var/snap/microk8s/current/docker.sock' -Dimage.registry='localhost:32000' clean package fabric8:build fabric8:deploy -Pfmp + ``` + + When it's time to take down the application, simply execute: + + ```bash + KUBECONFIG=/tmp/kubeconfig mvn fabric8:undeploy -Pfmp + ``` diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml index f1600c9c..e688cfc2 100644 --- a/spring-cloud-kubernetes-integration-tests/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/pom.xml @@ -23,12 +23,6 @@ 1.4.0.Final 3.2.0 - - unix:///var/snap/microk8s/current/docker.sock - - - localhost:32000 - docker kubernetes - ${microk8s.registry} + ${image.registry}