testkube icon indicating copy to clipboard operation
testkube copied to clipboard

Container based executors

Open exu opened this issue 2 years ago • 15 comments

linked: https://github.com/kubeshop/testkube/issues/2061

  • Allow users to define an executor by specifying - docker image name - credentials (in case of private registries) - name of the executor (and other misc data t.b.d)

  • Test can be defined to use this executor. The same behaviour is expected from a users's standpoint

  • There should be a clear folder structure documented that specifies - Which folder should the artifacts be saved too ? - Q: should the logs be saved in artifacts ?

  • Pass & fail is solely determined by the exit status of the pods execution. but allow a Junit.xml report to be retrieved for extra info.

  • Variables of type basic and secret should be mounted as environment variables on the container.

  • Arguments defined by the user should be sent in a similar faction as this example:

    • if the user were to run a nginx image in k8s and send the command ls –la / in k8s, he would do it like this -> kubectl exec nginx -- ls –la /. A similar behaviour is expected for the this container based executor and its arguments.
  • Are resource limit important to set ? resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"

exu avatar Aug 23 '22 13:08 exu

@ili-shmidt-wib here's the description of the feature we were discussing last week. Feel free to add your input 👌

TheBrunoLopes avatar Sep 05 '22 23:09 TheBrunoLopes

Hey @TheBrunoLopes ,

hate to ask, but: Is there a rough(!) ETA on this feature?

(I seriously don't want anyone to rush, but I will have to make a decision: Should I wait for this feature ...OR... seek out and try to find an alternative for running my tests.)

TheLeanMachine avatar Sep 06 '22 11:09 TheLeanMachine

btw: @exu , @povilasv

...as soon as this is released - or some kind of beta-version is publicly available -, I would try out this "generic container executor".

TheLeanMachine avatar Sep 06 '22 15:09 TheLeanMachine

one question @exu: Does the image used in this executor have to be a public one (e.g. available in Docker hub)?

...because oftentimes, corporations prepare their own, private images (specific JDKs, certificates, etc) that reside in a private Docker Registry.

TheLeanMachine avatar Sep 06 '22 15:09 TheLeanMachine

Hi @TheLeanMachine it's awesome that you are also wanting to test this feature out!

  • The images don't need to be public, you will be able to define the pull secret of this image in case it's not already configured in your k8s cluster.

  • We started implementing it yesterday, I can't promise you an exact date yet, but I would venture saying that it will probably take ~2 weeks to make a release out of it.

  • Is there a specific type of test that you want to run ? maybe we can help you with that.

TheBrunoLopes avatar Sep 06 '22 22:09 TheBrunoLopes

Hey @TheBrunoLopes ,

(first of all: Thanks 4 the quick and comprehensive reply)

  • Cool, will learn about "pull secrets & friends", then
  • Awesome! - It's really only about knowing that it shouldn't be 2 months or 2 years ;-)
  • Yes, indeed. I still have the problem with running Cypress tests that are aggregated using NX and "good old" Java-API-tests implemented with Maven (that fails using testkube's Maven runner - due to some Java version problems)...BUT:
    • I thought, I would wait and try out both using the "Generic Image Runner" (or how do you wanna call it)
    • From my "naive end-user viewpoint", I imagine the existing custom-runners (Maven, Cypress, ...) to delegate to the "Generic Image Runner", at some point, anyway. But - of course - I lack implementation details, so maybe that's not feasible...

TheLeanMachine avatar Sep 07 '22 08:09 TheLeanMachine

@TheLeanMachine please pass those Java problems in separate issue we can try to help with that.

exu avatar Sep 16 '22 10:09 exu

Thanks @exu for reaching out,

in fact, when I was adding the JDK-18-executor following the corresponding documentation (section "Using different JDKs"), it worked just fine.

TheLeanMachine avatar Sep 19 '22 13:09 TheLeanMachine

Hey @TheLeanMachine we merged initial support for Container executors, there are docs available in documentation page

The latest release already has this functionality, so if you update TestKube you can try it out :)

Would be awesome if you can try it / give us feedback :balloon:

One thing - we currently don't have a way to support artifacts yet, but we are figuring it out :package:

povilasv avatar Sep 28 '22 07:09 povilasv

Hey @povilasv ,

awesome! Will definitely have a look at the docs and checkout ASAP, but...

...ATM, I am sadly blocked by this bug: https://github.com/kubeshop/testkube/issues/2361 ;-)

After this is resolved - and the latest testkube release is deployed by our OPS-guys - , I will jump on this and will feed back the results.

TheLeanMachine avatar Sep 28 '22 08:09 TheLeanMachine

Hey @povilasv ,

I know that it's not the right thread here, but: Please don't make the mistake of CI/CD-providers - like bitbucket - to only obtain the artefacts in case of build success... ;-)

TheLeanMachine avatar Sep 28 '22 08:09 TheLeanMachine

Thanks for the feedback @TheLeanMachine. We will be aware of that. @povilasv noticed that #2361 is closed. Is it fixed ?

TheBrunoLopes avatar Sep 28 '22 14:09 TheBrunoLopes

to @TheBrunoLopes and @povilasv

I am not 100% sure, if this is still a problem. Maybe, I simply have to install a more recent testkube client. Will do that tomorrow and update you, here.

(my colleague that reported that bug did not have any problems any more, but i did ... again, the testkube client version is probably the problem)

TheLeanMachine avatar Sep 28 '22 16:09 TheLeanMachine

Hi @povilasv , @TheBrunoLopes ,

I dunno, if https://github.com/kubeshop/testkube/issues/2361 is still a problem...

At least I, personally, was able to open the testkube dashboard, again, on my MacBook again after using testkube client from kubeshop's tap...

(brew uninstall testkube) // removing old client
brew tap kubeshop/homebrew-testkube
brew install kubeshop/testkube/testkube

TheLeanMachine avatar Sep 29 '22 08:09 TheLeanMachine

Thanks for trying again :heart: I think the issue with tk dashboard command is that once we updated the API container port from 80 to 8080 (in order to run as rootless) we broke old clients :cry:

povilasv avatar Sep 29 '22 17:09 povilasv

Hey @povilasv,

(using these versions, now)

Client Version 1.5.41
Server Version v1.5.41

here some initial feedback: I created my own custom test - still want to run NX-agregated tests - using an official NX-image, now. This is the executor CRD:

apiVersion: executor.testkube.io/v1
kind: Executor
metadata:
  name: nx-container-executor
  namespace: testkube
spec:
  image: soleware/nx-cli:8.5.2
  command: ["nx"]
  executor_type: container
  types:
  - nx-container/test

...with which I continue to create this test...

kubectl testkube create test --name nx-containerexecutor-test-v1 --type nx-container/test --executor-args '--version' --git-branch master --git-uri https://bitbucket.org/<MY_ORG>/<NX_REPO>.git --git-username kai_hoelscher --git-token <SECRET_TOKEN>

Running the test yields this output (I expected it to print the NX-version)... Screenshot 2022-09-30 at 16 49 40

...which made me realise two things:

  1. Apparently no git-checkout is performed
  2. I forgot to ask for sth like a pre-command-build-hook (a command used to build/bundle the tests, before execution: here: npm install)

TheLeanMachine avatar Sep 30 '22 14:09 TheLeanMachine

Apparently no git-checkout is performed

@TheLeanMachine I've tested both git and git-dir options and they seem to work:

  content:
    repository:
      branch: main
      type: git-dir
      uri: https://github.com/kubeshop/testkube-executor-init
    type: git-dir

Downloads into /data/repo directory

ls /data/repo
CODE_OF_CONDUCT.md  CONTRIBUTING.md  LICENSE  Makefile  README.md  build  cmd  go.mod  go.sum  pkg

and:

  content:
    repository:
      branch: main
      type: git-file
      uri: https://github.com/kubeshop/testkube-executor-init
    type: git-file
ls /data/repo
CODE_OF_CONDUCT.md  CONTRIBUTING.md  LICENSE  Makefile  README.md  build  cmd  go.mod  go.sum  pkg

povilasv avatar Oct 05 '22 18:10 povilasv

I forgot to ask for sth like a pre-command-build-hook (a command used to build/bundle the tests, before execution: here: npm install)

Regarding this, we will discuss this internally, at the moment you can make a custom image based on that one and do some bash scripting to do what you need , no?

povilasv avatar Oct 05 '22 18:10 povilasv

Hey @povilasv,

sounds reasonable. I will check that out, soon...

TheLeanMachine avatar Oct 07 '22 08:10 TheLeanMachine

Hey @povilasv,

it seems, that - in fact - I will be able to "hack multiple commands together'. One way to implement this, is using a startup-command in the executor-definition (see command below) like this...

apiVersion: executor.testkube.io/v1
kind: Executor
metadata:
  name: nx-custom-executor
  namespace: testkube
spec:
  image: soleware/nx-cli:8.5.2
  command: ["/bin/bash", "-c", "pwd;echo 'Navigate to checked-out repository located in /data/repo';cd /data/repo; npm install"]
  executor_type: container
  types:
  - nx-custom/test

...but sadly that leads me to the next problem: Non writable file-system!

...so, when I create a testkube test using the above executor, I get this output (as a result of the npm install, I guess):

Screenshot 2022-10-07 at 15 48 45

Any idea, how I could address this? (spoiler: chmod -R 777 ... did not help...)

TheLeanMachine avatar Oct 07 '22 13:10 TheLeanMachine

...but sadly that leads me to the next problem: Non writable file-system!

Any idea, how I could address this? (spoiler: chmod -R 777 ... did not help...)

@TheLeanMachine I think it's best that you make your custom docker image:

FROM: soleware/nx-cli:8.5.2
RUN: npm install ...

Because, do you really want to install the dependencies every time you run a test?

IMO this is what containerization solves, the /data directory is really more for testdata data not for programs.

@vsukhin wdyt?

povilasv avatar Oct 11 '22 07:10 povilasv

Hey @povilasv ,

thanks for your feedback, so far. Sounds reasonable. Will think about this again...

(but basically, you're right)

TheLeanMachine avatar Oct 11 '22 09:10 TheLeanMachine

So,remained part for this ticket is a storing artifact to external folder

vsukhin avatar Oct 12 '22 17:10 vsukhin

AC:

  • There should be an environment variable that is possible to change/configure that specifies the dir path to where to retrieve the artifacts.
  • User should not need to do any DevOps work to use this feature.

TheBrunoLopes avatar Nov 15 '22 14:11 TheBrunoLopes