Closed hillbun closed 2 years ago
this one depends on change in automatiko https://github.com/automatiko-io/automatiko-engine/issues/280
the work is pretty much done, if you want to give it a try before it gets officially released
(as it requires new release of automatiko - due by the end of next week) then try with this image mswiderski/automatiko-approval-task:0.4.0
Documentation how to make use of it is here: https://github.com/automatiko-io/automatiko-approval-task#customize-email-templates
where is the demo of approval-email.html?
Here is the default email template https://github.com/automatiko-io/automatiko-approval-task/blob/main/src/main/resources/templates/approval-email.html
I plan to release Automatiko tomorrow and then approval task 0.4.0. have you tried to use custom email template?
which tag of image should I use to try and test?
which tag of image should I use to try and test?
https://github.com/automatiko-io/automatiko-approval-task/issues/4#issuecomment-1221032269
I get env inside pod of automatiko-approval-task
QUARKUS_AUTOMATIKO_TEMPLATES_FOLDER=/templates
but approve email body contents do not match /templates/approval-email.html , it is still default templates.
also I need to customize email title.
and you paste the config map you use (the actual content of the values are not important) just the structure of the config map. Then how it is mapped to the deployment so paste the deployment manifest as well.
When it comes to customise the email subject, I will look into it how it can be done.
I mean cat /templates/approval-email.html
I customize:
But the email recieved, is Pipeline awaits approval
but how do you provide this template to the pod? It should be done via config map and then volume mapped to the deployment, have you done that?
spec:
containers:
- env:
- name: KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: QUARKUS_OPERATOR_SDK_NAMESPACES
value: default
- name: QUARKUS_AUTOMATIKO_SERVICE_URL
value: http://automatiko-approval-task.default/
- name: QUARKUS_MAILER_FROM
value: xxxx
- name: QUARKUS_MAILER_HOST
value: xx
- name: QUARKUS_MAILER_PORT
value: "25"
- name: QUARKUS_MAILER_USERNAME
value: xxx
- name: QUARKUS_MAILER_PASSWORD
value: xxxx
- name: QUARKUS_PROFILE
value: withemail
- name: QUARKUS_MAILER_START_TLS
value: DISABLED
- name: QUARKUS_AUTOMATIKO_TEMPLATES_FOLDER
value: /templates
image: automatiko/automatiko-approval-task
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /q/health/live
port: 8080
scheme: HTTP
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 10
name: automatiko-approval-task
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /q/health/ready
port: 8080
scheme: HTTP
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 10
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /templates
name: templates-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: automatiko-approval-task
serviceAccountName: automatiko-approval-task
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: approval-task-templates
name: templates-volume
you are using wrong image image: automatiko/automatiko-approval-task
it should be image: mswiderski/automatiko-approval-task:0.4.0
as only the one from my repo has the latest changes.
Plus, how does the config map looks like - named approval-task-templates
? What entires does it have?
it is ok now.
so now the email template is taken from config map, right?
and last remaining issue is the email subject? Is there anything else you need to customise there?
I need to pass task params to email subject
what parameters are required there?
- name: deploy-dev-approval-task
taskRef:
apiVersion: tekton.automatiko.io/v1alpha1
kind: ApprovalTask
name: approvaltask
params:
- name: pipeline
value: "$(context.pipelineRun.name)"
- name: description
value: "Approval from pipeline $(context.pipeline.name)"
- name: approvers
value:
- "xxx@xx.com"
- name: foo
value: "bar"
I set foo in task
you can use the 0.4.0 from mswiderski repo to try out to customise the email subject as well.
Fist and foremost is to apply the CRD from here https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/approvaltasks.tekton.automatiko.io-v1.yml as there are new spec item introduced.
Then you can use these instructions to override default email subject https://github.com/automatiko-io/automatiko-approval-task#customize-email-templates
I suggest customize email subject
- name: APPROVAL_TASK_EMAIL_SUBJECT
value: "Here is an approval for {pipeline} waiting to be deployed to {environment}"
move from automatiko-approval-task deployment environment to approval task params
kubectl apply -f https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/approvaltasks.tekton.automatiko.io-v1.yml
error: error parsing https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/approvaltasks.tekton.automatiko.io-v1.yml: error converting YAML to JSON: yaml: line 28: mapping values are not allowed in this context
I suggest customize email subject
- name: APPROVAL_TASK_EMAIL_SUBJECT value: "Here is an approval for {pipeline} waiting to be deployed to {environment}"
move from automatiko-approval-task deployment environment to approval task params
and how about already using the description
param instead? Then there won't be any need to include new params. Though it will only allow you to reference context data from Tekton like "Approval from pipeline $(context.pipeline.name)"
all the variables will be directly expended to values by Tekton. Would this work for you?
kubectl apply -f https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/approvaltasks.tekton.automatiko.io-v1.yml error: error parsing https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/approvaltasks.tekton.automatiko.io-v1.yml: error converting YAML to JSON: yaml: line 28: mapping values are not allowed in this context
very weird as this line has not changed at all. Could you first remove the previous version and start from scratch?
description param is ok to email sunject.
and approvaltasks.tekton.automatiko.io-v1.yml: upate ok now.
excellent, so I will never the need for the extended CRD and extra environment variable and rely on description.
Very good feedback @hillbun !!!
alright, new version of 0.4.0 is now pushed to mswiderski repo. Please take it for a test drive. Once you verify it does what is needed I will work on preparing releases so it will be ready in the official repo in a day or two.
Yes, all tests pass
in approval-email.html
<p style="-ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;"><a href="{link}" class="btn btn-primary" style="-ms-text-size-a
djust: 100%; -webkit-text-size-adjust: 100%; text-decoration: none; padding: 10px 15px; display: inline-block; border-radius: 5px; background: #007bff; color: #ffffff;">Go to
approval task</a></p>
I need to customize {link} , how to?
what do you mean by customise the link? Link is generated be the backend to ensure it can point to a valid task with proper credentials
current link is
http://localhost:8080/management/tasks/link/c2luZ2xlfGQ1ZTVlY2VmLTY0MWQtMzk1MC05MTYyLTYzY2NkMWQzYjE2MjphODFkMjhlOS0zOWU5LTQxMTgtYjkxNS1iNjFmNTRmMzQ2Y2N8ODQ2NTM0MWYtNDJlYi00M2EyLTk0ZmYtOWQxZTk4NDYyOGUwfDQ5NTQyODg3NkBxcS5jb20=
I need to replace http://localhost:8080/ with env below, so I can click and visit what UI
- name: QUARKUS_AUTOMATIKO_APPROVAL_URL
value: http://automatiko-approval.xxxxx.com/
that is already there, you need to set it via env variable of the deployment:
- name: QUARKUS_AUTOMATIKO_SERVICE_URL
value: http://automatiko-approval.xxxxx.com
My setting is
- name: QUARKUS_AUTOMATIKO_SERVICE_URL
value: http://automatiko-approval-task.default/
This is just for k8s internal service only, and email link is http://localhost:8080/ but not http://automatiko-approval-task.default/
I think we should add another env
- name: QUARKUS_AUTOMATIKO_SERVICE_URL
value: http://automatiko-approval.xxxxx.com
for email link point to ingress domain name.
write mistake
- name: QUARKUS_AUTOMATIKO_APPROVAL_URL
value: http://automatiko-approval.xxxxx.com/
QUARKUS_AUTOMATIKO_SERVICE_URL
is to point to the ingress domain name as it is then allowing to access service from outside y users.
I just double checked and it is properly set, I use this setup https://github.com/automatiko-io/automatiko-approval-task/blob/main/k8s/kubernetes-basic.yml#L183 as I am running through port forward and I see in the mail link like this:
<a href="http://localhost:9000/management/tasks/link/c2luZ2xlfGQ
so there must be some kind of type or so that does not get properly resolved.
do u mean QUARKUS_AUTOMATIKO_SERVICE_URL is just used for outside visit only?
and not for any inside calls?
If I set QUARKUS_AUTOMATIKO_SERVICE_URL to http://automatiko-approval.xxxxx.com/ , the link in email will be http://automatiko-approval.xxxxx.com/ and not http://localhost:8080/ ?
I will trt it now
exactly that
I set QUARKUS_AUTOMATIKO_SERVICE_URL: http://automatiko-approval.xxxx.com/
but link in email is still http://localhost:8080/
please advise
where do you set it? In the pipeline or in the deployment? Can you paste the deployment yaml here?
spec:
containers:
- env:
- name: KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: QUARKUS_OPERATOR_SDK_NAMESPACES
value: default
- name: QUARKUS_AUTOMATIKO_SERVICE_URL
value: http://automatiko-approval.xxxx.com/
...
image: mswiderski/automatiko-approval-task:0.4.0
this looks valid, could you try to underplay and deploy it again? so it goes from a clean state... wild guess but it should work.
BTW: you can now move to the official automatiko/automatiko-approval-task:0.4.0
image as it was already released.
I move to automatiko/automatiko-approval-task:0.4.0 but link in email is still still http://localhost:8080/
this is really weird... can you log into container and see if that environment variable is set?
last resort option will be to do the replacement in the template, so you could add to your custom template following
{link.replace("http://localhost:8080", "http://automatiko-approval.xxxx.com")}
and that should generate valid link for your use case.
in POD of approval
env is :
QUARKUS_AUTOMATIKO_SERVICE_URL=http://automatiko-approval.xxxx.com/
is it a bug or feature not finished?
do you plan to fix it in next release?
the thing is that I cannot reproduce it. it works as expected on few environments I tried it. Without reproducing it's difficult to fix it.
make a debug image for logs let me trace it please.
give it a try with this one mswiderski/automatiko-approval-task:0.4.1
I update image to mswiderski/automatiko-approval-task:0.4.1
when pod of approval start, I get errors:
2022-08-26 07:18:04,157 ERROR [io.aut.eng.wor.pro.ins.imp.WorkflowProcessInstanceImpl] (EventHandler-approvals) Unexpected error (id 12737309-0819-4d05-ba18-cbdb1d8c92ea) while executing node initialize task information in process instance c87bdb36-1d2b-319d-8966-5e05f8891270: io.automatiko.engine.workflow.base.instance.impl.workitem.WorkItemHandlerNotFoundException: Could not find work item handler for io.automatiko.tekton.task.approval.internal.ApprovalTaskResourceOperations_initializeApprovalTask_approvals_13_Handler
at io.automatiko.engine.workflow.base.instance.LightWorkItemManager.internalAbortWorkItem(LightWorkItemManager.java:99)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.cancel(WorkItemNodeInstance.java:480)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:420)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:455)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:188)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:291)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:514)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:495)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.continueToNextNode(NodeInstanceImpl.java:459)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:363)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:186)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.signalEvent(StartNodeInstance.java:172)
at io.automatiko.engine.workflow.process.executable.instance.ExecutableProcessInstance.internalStart(ExecutableProcessInstance.java:24)
at io.automatiko.engine.workflow.base.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:215)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:523)
at io.automatiko.engine.workflow.base.instance.LightProcessRuntime.startProcessInstance(LightProcessRuntime.java:133)
at io.automatiko.engine.workflow.AbstractProcessInstance.start(AbstractProcessInstance.java:324)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.lambda$reconcile$2(ApprovalsMessageConsumer1.java:113)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:91)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:28)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,166 ERROR [io.aut.eng.wor.pro.ins.imp.WorkflowProcessInstanceImpl] (EventHandler-runs) Unexpected error (id 78ad6637-7888-46f2-be09-ec06d6bda532) while executing node Create Approval Task CR in process instance c87bdb36-1d2b-319d-8966-5e05f8891270: io.automatiko.engine.workflow.base.instance.impl.workitem.WorkItemHandlerNotFoundException: Could not find work item handler for io.automatiko.tekton.task.approval.internal.ApprovalTaskResourceOperations_createApprovalTask_runs_3_Handler
at io.automatiko.engine.workflow.base.instance.LightWorkItemManager.internalAbortWorkItem(LightWorkItemManager.java:99)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.cancel(WorkItemNodeInstance.java:480)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:420)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:455)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:188)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:291)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:514)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:495)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.continueToNextNode(NodeInstanceImpl.java:459)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:363)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:186)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.signalEvent(StartNodeInstance.java:172)
at io.automatiko.engine.workflow.process.executable.instance.ExecutableProcessInstance.internalStart(ExecutableProcessInstance.java:24)
at io.automatiko.engine.workflow.base.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:215)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:523)
at io.automatiko.engine.workflow.base.instance.LightProcessRuntime.startProcessInstance(LightProcessRuntime.java:133)
at io.automatiko.engine.workflow.AbstractProcessInstance.start(AbstractProcessInstance.java:324)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.lambda$reconcile$2(RunsMessageConsumer1.java:113)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:91)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:28)
at io.automatiko.tekton.task.run.RunsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,169 INFO [io.qua.ope.run.AppEventListener] (main) Quarkus Java Operator SDK extension 3.0.8 (commit: ef221b3 on branch: ef221b39cd8eb90fdc88fe85d742d669195727c0) built on Wed Jun 08 13:55:41 GMT 2022
2022-08-26 07:18:04,192 ERROR [MessageConsumer] (EventHandler-approvals) Encountered problems while creating/updating instance: io.automatiko.engine.api.workflow.ProcessInstanceDuplicatedException: Process instance with id 'gitlab-pipelinerun-4kmbr-deploy-dev-approval-task' already exists, usually this means business key has been already used
at io.automatiko.engine.workflow.AbstractProcessInstance.<init>(AbstractProcessInstance.java:137)
at io.automatiko.tekton.tasks.approval.ApprovalsProcessInstance.<init>(ApprovalsProcessInstance.java:10)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess.createInstance(ApprovalsProcess.java:77)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess.createInstance(ApprovalsProcess.java:16)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess_ClientProxy.createInstance(Unknown Source)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.lambda$reconcile$2(ApprovalsMessageConsumer1.java:112)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:91)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:28)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,226 ERROR [MessageConsumer] (EventHandler-runs) Encountered problems while creating/updating instance: io.automatiko.engine.api.workflow.ProcessInstanceDuplicatedException: Process instance with id 'gitlab-pipelinerun-4kmbr-deploy-dev-approval-task' already exists, usually this means business key has been already used
at io.automatiko.engine.workflow.AbstractProcessInstance.<init>(AbstractProcessInstance.java:137)
at io.automatiko.tekton.task.run.RunsProcessInstance.<init>(RunsProcessInstance.java:10)
at io.automatiko.tekton.task.run.RunsProcess.createInstance(RunsProcess.java:41)
at io.automatiko.tekton.task.run.RunsProcess.createInstance(RunsProcess.java:12)
at io.automatiko.tekton.task.run.RunsProcess_ClientProxy.createInstance(Unknown Source)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.lambda$reconcile$2(RunsMessageConsumer1.java:112)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:91)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:28)
at io.automatiko.tekton.task.run.RunsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
aren't there any other errors/logs at the very beginning of the pod logs?
this is full logs from pod start to email sent
kubectl logs automatiko-approval-task-5c4fc9d5f-2vc84
______ __ __ ______ ______ __ __ ______ ______ __ __ __ ______
/\ __ \ /\ \/\ \ /\__ _\ /\ __ \ /\ "-./ \ /\ __ \ /\__ _\ /\ \ /\ \/ / /\ __ \
\ \ __ \ \ \ \_\ \ \/_/\ \/ \ \ \/\ \ \ \ \-./\ \ \ \ __ \ \/_/\ \/ \ \ \ \ \ _"-. \ \ \/\ \
\ \_\ \_\ \ \_____\ \ \_\ \ \_____\ \ \_\ \ \_\ \ \_\ \_\ \ \_\ \ \_\ \ \_\ \_\ \ \_____\
\/_/\/_/ \/_____/ \/_/ \/_____/ \/_/ \/_/ \/_/\/_/ \/_/ \/_/ \/_/\/_/ \/_____/
Powered by Quarkus 2.11.1.Final
2022-08-26 07:18:04,066 INFO [io.qua.sma.ope.run.OpenApiRecorder] (main) Default CORS properties will be used, please use 'quarkus.http.cors' properties instead
2022-08-26 07:18:04,081 INFO [io.aut.eng.add.use.man.tem.FileSystemTemplateLoader] (main) Added template 'approval-email' from external path /templates/approval-email.html
2022-08-26 07:18:04,105 WARN [io.fab.kub.cli.int.VersionUsageUtils] (ForkJoinPool.commonPool-worker-1) The client is using resource type 'runs' with unstable version 'v1alpha1'
2022-08-26 07:18:04,106 WARN [io.fab.kub.cli.int.VersionUsageUtils] (main) The client is using resource type 'approvaltasks' with unstable version 'v1alpha1'
2022-08-26 07:18:04,157 ERROR [io.aut.eng.wor.pro.ins.imp.WorkflowProcessInstanceImpl] (EventHandler-approvals) Unexpected error (id 12737309-0819-4d05-ba18-cbdb1d8c92ea) while executing node initialize task information in process instance c87bdb36-1d2b-319d-8966-5e05f8891270: io.automatiko.engine.workflow.base.instance.impl.workitem.WorkItemHandlerNotFoundException: Could not find work item handler for io.automatiko.tekton.task.approval.internal.ApprovalTaskResourceOperations_initializeApprovalTask_approvals_13_Handler
at io.automatiko.engine.workflow.base.instance.LightWorkItemManager.internalAbortWorkItem(LightWorkItemManager.java:99)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.cancel(WorkItemNodeInstance.java:480)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:420)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:455)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:188)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:291)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:514)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:495)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.continueToNextNode(NodeInstanceImpl.java:459)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:363)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:186)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.signalEvent(StartNodeInstance.java:172)
at io.automatiko.engine.workflow.process.executable.instance.ExecutableProcessInstance.internalStart(ExecutableProcessInstance.java:24)
at io.automatiko.engine.workflow.base.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:215)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:523)
at io.automatiko.engine.workflow.base.instance.LightProcessRuntime.startProcessInstance(LightProcessRuntime.java:133)
at io.automatiko.engine.workflow.AbstractProcessInstance.start(AbstractProcessInstance.java:324)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.lambda$reconcile$2(ApprovalsMessageConsumer1.java:113)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:91)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:28)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,166 ERROR [io.aut.eng.wor.pro.ins.imp.WorkflowProcessInstanceImpl] (EventHandler-runs) Unexpected error (id 78ad6637-7888-46f2-be09-ec06d6bda532) while executing node Create Approval Task CR in process instance c87bdb36-1d2b-319d-8966-5e05f8891270: io.automatiko.engine.workflow.base.instance.impl.workitem.WorkItemHandlerNotFoundException: Could not find work item handler for io.automatiko.tekton.task.approval.internal.ApprovalTaskResourceOperations_createApprovalTask_runs_3_Handler
at io.automatiko.engine.workflow.base.instance.LightWorkItemManager.internalAbortWorkItem(LightWorkItemManager.java:99)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.cancel(WorkItemNodeInstance.java:480)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:420)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.setState(WorkflowProcessInstanceImpl.java:455)
at io.automatiko.engine.workflow.process.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:188)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:291)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:514)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:495)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.continueToNextNode(NodeInstanceImpl.java:459)
at io.automatiko.engine.workflow.process.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:363)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:186)
at io.automatiko.engine.workflow.process.instance.node.StartNodeInstance.signalEvent(StartNodeInstance.java:172)
at io.automatiko.engine.workflow.process.executable.instance.ExecutableProcessInstance.internalStart(ExecutableProcessInstance.java:24)
at io.automatiko.engine.workflow.base.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:215)
at io.automatiko.engine.workflow.process.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:523)
at io.automatiko.engine.workflow.base.instance.LightProcessRuntime.startProcessInstance(LightProcessRuntime.java:133)
at io.automatiko.engine.workflow.AbstractProcessInstance.start(AbstractProcessInstance.java:324)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.lambda$reconcile$2(RunsMessageConsumer1.java:113)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:91)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:28)
at io.automatiko.tekton.task.run.RunsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,169 INFO [io.qua.ope.run.AppEventListener] (main) Quarkus Java Operator SDK extension 3.0.8 (commit: ef221b3 on branch: ef221b39cd8eb90fdc88fe85d742d669195727c0) built on Wed Jun 08 13:55:41 GMT 2022
2022-08-26 07:18:04,192 ERROR [MessageConsumer] (EventHandler-approvals) Encountered problems while creating/updating instance: io.automatiko.engine.api.workflow.ProcessInstanceDuplicatedException: Process instance with id 'gitlab-pipelinerun-4kmbr-deploy-dev-approval-task' already exists, usually this means business key has been already used
at io.automatiko.engine.workflow.AbstractProcessInstance.<init>(AbstractProcessInstance.java:137)
at io.automatiko.tekton.tasks.approval.ApprovalsProcessInstance.<init>(ApprovalsProcessInstance.java:10)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess.createInstance(ApprovalsProcess.java:77)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess.createInstance(ApprovalsProcess.java:16)
at io.automatiko.tekton.tasks.approval.ApprovalsProcess_ClientProxy.createInstance(Unknown Source)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.lambda$reconcile$2(ApprovalsMessageConsumer1.java:112)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:91)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1.reconcile(ApprovalsMessageConsumer1.java:28)
at io.automatiko.tekton.tasks.approval.ApprovalsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,226 ERROR [MessageConsumer] (EventHandler-runs) Encountered problems while creating/updating instance: io.automatiko.engine.api.workflow.ProcessInstanceDuplicatedException: Process instance with id 'gitlab-pipelinerun-4kmbr-deploy-dev-approval-task' already exists, usually this means business key has been already used
at io.automatiko.engine.workflow.AbstractProcessInstance.<init>(AbstractProcessInstance.java:137)
at io.automatiko.tekton.task.run.RunsProcessInstance.<init>(RunsProcessInstance.java:10)
at io.automatiko.tekton.task.run.RunsProcess.createInstance(RunsProcess.java:41)
at io.automatiko.tekton.task.run.RunsProcess.createInstance(RunsProcess.java:12)
at io.automatiko.tekton.task.run.RunsProcess_ClientProxy.createInstance(Unknown Source)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.lambda$reconcile$2(RunsMessageConsumer1.java:112)
at io.automatiko.engine.services.uow.UnitOfWorkExecutor.executeInUnitOfWork(UnitOfWorkExecutor.java:27)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:91)
at io.automatiko.tekton.task.run.RunsMessageConsumer1.reconcile(RunsMessageConsumer1.java:28)
at io.automatiko.tekton.task.run.RunsMessageConsumer1_ClientProxy.reconcile(Unknown Source)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:101)
at io.javaoperatorsdk.operator.processing.Controller$2.execute(Controller.java:76)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetrics.timeControllerExecution(MicrometerMetrics.java:36)
at io.javaoperatorsdk.operator.processing.Controller.reconcile(Controller.java:75)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.reconcileExecution(ReconciliationDispatcher.java:143)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleReconcile(ReconciliationDispatcher.java:109)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleDispatch(ReconciliationDispatcher.java:74)
at io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.handleExecution(ReconciliationDispatcher.java:50)
at io.javaoperatorsdk.operator.processing.event.EventProcessor$ControllerExecution.run(EventProcessor.java:349)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
2022-08-26 07:18:04,229 INFO [io.quarkus] (main) automatiko-approval-task 0.4.1 native (powered by Quarkus 2.11.1.Final) started in 0.213s. Listening on: http://0.0.0.0:8080
2022-08-26 07:18:04,230 INFO [io.quarkus] (main) Profile withemail activated.
2022-08-26 07:18:04,230 INFO [io.quarkus] (main) Installed features: [automatiko, automatiko-operator, cdi, kubernetes, kubernetes-client, mailer, micrometer, openshift-client, operator-sdk, qute, resteasy-reactive, resteasy-reactive-jackson, resteasy-reactive-qute, security, smallrye-context-propagation, smallrye-health, smallrye-openapi, swagger-ui, vertx, websockets, websockets-client]
2022-08-26 07:26:11,045 INFO [io.aut.tek.tas.app.int.ApprovalTaskResourceOperations] (EventHandler-runs) Service Url given via configuration is http://automatiko-approval.xxxxx.com/
2022-08-26 07:26:11,046 INFO [io.aut.tek.tas.app.int.ApprovalTaskResourceOperations] (EventHandler-runs) Service Url taken directly from environment http://automatiko-approval.xxxxx.com/
2022-08-26 07:26:11,059 INFO [io.aut.tek.tas.app.int.ApprovalTaskResourceOperations] (EventHandler-runs) New approval task has been created RunStatus [startTime=2022-08-26T07:26:11Z, results=null, conditions=[{reason=Succeeded, message=Approval Task has been created, status=Unknown}]]
2022-08-26 07:26:11,060 INFO [io.aut.eng.add.per.fil.job.FileSystemBasedJobService] (EventHandler-runs) Timer scheduled for date 2022-08-26T12:26:11.060254Z[GMT] will expire in 17999999
I need to customize email notification templates, such as title, body