diff --git a/apps/event-worker/src/workers/job-dispatch/github.ts b/apps/event-worker/src/workers/job-dispatch/github.ts index 67b80d5e5..ca8a967b5 100644 --- a/apps/event-worker/src/workers/job-dispatch/github.ts +++ b/apps/event-worker/src/workers/job-dispatch/github.ts @@ -206,14 +206,20 @@ export const dispatchGithubJob = async (je: Job) => { }); try { - await octokit.actions.createWorkflowDispatch({ - owner: mergedConfig.owner, - repo: mergedConfig.repo, - workflow_id: mergedConfig.workflowId, - ref, - inputs: { job_id: je.id }, - headers, - }); + await octokit.actions + .createWorkflowDispatch({ + owner: mergedConfig.owner, + repo: mergedConfig.repo, + workflow_id: mergedConfig.workflowId, + ref, + inputs: { job_id: je.id }, + headers, + }) + .then(() => + updateJob(db, je.id, { + status: JobStatus.InProgress, + }), + ); } catch (e) { const error = e instanceof Error ? e.message : String(e); log.error(`Failed to create workflow dispatch for job ${je.id}`, { diff --git a/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(raw)/systems/[systemSlug]/(raw)/deployments/[deploymentSlug]/(sidebar)/workflow/JobAgentSection.tsx b/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(raw)/systems/[systemSlug]/(raw)/deployments/[deploymentSlug]/(sidebar)/workflow/JobAgentSection.tsx index a6c0260c9..0f69bedee 100644 --- a/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(raw)/systems/[systemSlug]/(raw)/deployments/[deploymentSlug]/(sidebar)/workflow/JobAgentSection.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(raw)/systems/[systemSlug]/(raw)/deployments/[deploymentSlug]/(sidebar)/workflow/JobAgentSection.tsx @@ -10,6 +10,7 @@ import { Alert, AlertDescription, AlertTitle } from "@ctrlplane/ui/alert"; import { Form, FormField, useForm } from "@ctrlplane/ui/form"; import { JobAgentType } from "@ctrlplane/validators/jobs"; +import { JobAgentJenkinsPipelineConfig } from "~/components/form/job-agent/JobAgentJenkinsPipelineConfig"; import { JobAgentKubernetesConfig } from "~/components/form/job-agent/JobAgentKubernetesConfig"; import { JobAgentScriptConfig } from "~/components/form/job-agent/JobAgentScriptConfig"; import { JobAgentSelector } from "~/components/form/job-agent/JobAgentSelector"; @@ -83,7 +84,7 @@ const JobAgentForm: React.FC<{ disabled={update.isPending} /> )} - {selectedJobAgent?.type.startsWith("exec-") && ( + {selectedJobAgent?.type.startsWith("exec") && ( )} + {selectedJobAgent?.type === JobAgentType.Jenkins && ( + + )} )} /> diff --git a/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(sidebar)/job-agents/AgentCard.tsx b/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(sidebar)/job-agents/AgentCard.tsx index e6a9dc146..299f96838 100644 --- a/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(sidebar)/job-agents/AgentCard.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/(app)/(deploy)/(sidebar)/job-agents/AgentCard.tsx @@ -1,6 +1,7 @@ "use client"; import type * as SCHEMA from "@ctrlplane/db/schema"; +import type { JobAgentType } from "@ctrlplane/validators/jobs"; import React, { useState } from "react"; import { useRouter } from "next/navigation"; import { IconBolt, IconCheck, IconRocket } from "@tabler/icons-react"; @@ -19,6 +20,7 @@ import { TooltipProvider, TooltipTrigger, } from "@ctrlplane/ui/tooltip"; +import { JobAgentTypeDisplayNames } from "@ctrlplane/validators/jobs"; import { api } from "~/trpc/react"; import { useJobStats } from "./_hooks/useJobStats"; @@ -148,7 +150,7 @@ export const AgentCard: React.FC = ({ agent, className }) => {
- Github App + {JobAgentTypeDisplayNames[agent.type as JobAgentType]}
diff --git a/apps/webservice/src/app/[workspaceSlug]/(app)/policies/[policyId]/edit/configuration/EditConfiguration.tsx b/apps/webservice/src/app/[workspaceSlug]/(app)/policies/[policyId]/edit/configuration/EditConfiguration.tsx index f8a7341cf..f02719ddd 100644 --- a/apps/webservice/src/app/[workspaceSlug]/(app)/policies/[policyId]/edit/configuration/EditConfiguration.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/(app)/policies/[policyId]/edit/configuration/EditConfiguration.tsx @@ -3,6 +3,7 @@ import type * as SCHEMA from "@ctrlplane/db/schema"; import type { DeploymentCondition } from "@ctrlplane/validators/deployments"; import type { EnvironmentCondition } from "@ctrlplane/validators/environments"; +import type { ResourceCondition } from "@ctrlplane/validators/resources"; import { useRouter } from "next/navigation"; import { IconPlus, IconTrash } from "@tabler/icons-react"; import { z } from "zod"; @@ -31,11 +32,7 @@ import { Switch } from "@ctrlplane/ui/switch"; import { Textarea } from "@ctrlplane/ui/textarea"; import { deploymentCondition } from "@ctrlplane/validators/deployments"; import { environmentCondition } from "@ctrlplane/validators/environments"; -import type { - ResourceCondition} from "@ctrlplane/validators/resources"; -import { - resourceCondition, -} from "@ctrlplane/validators/resources"; +import { resourceCondition } from "@ctrlplane/validators/resources"; import { DeploymentConditionRender } from "~/app/[workspaceSlug]/(app)/_components/deployments/condition/DeploymentConditionRender"; import { EnvironmentConditionRender } from "~/app/[workspaceSlug]/(app)/_components/environment/condition/EnvironmentConditionRender"; diff --git a/apps/webservice/src/components/form/job-agent/JobAgentJenkinsPipelineConfig.tsx b/apps/webservice/src/components/form/job-agent/JobAgentJenkinsPipelineConfig.tsx new file mode 100644 index 000000000..d6665ee40 --- /dev/null +++ b/apps/webservice/src/components/form/job-agent/JobAgentJenkinsPipelineConfig.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { Button } from "@ctrlplane/ui/button"; +import { FormDescription, FormItem, FormLabel } from "@ctrlplane/ui/form"; +import { Input } from "@ctrlplane/ui/input"; + +interface JobAgentJenkinsPipelineConfigProps { + value: Record; + onChange: (value: Record) => void; + disabled?: boolean; + isPending?: boolean; +} + +export const JobAgentJenkinsPipelineConfig: React.FC< + JobAgentJenkinsPipelineConfigProps +> = ({ value, onChange, disabled, isPending }) => { + const handleJobUrlChange = (e: React.ChangeEvent) => { + onChange({ + ...value, + jobUrl: e.target.value, + }); + }; + + return ( +
+ + Jenkins Job URL + + + The URL path to the Jenkins job (format: {"{JENKINS_URL}"} + /job/org/job/repo/job/branch) + + + +
+ +
+
+ ); +}; diff --git a/packages/job-dispatch/src/job-dispatch.ts b/packages/job-dispatch/src/job-dispatch.ts index 0d49b48e7..514e87a2b 100644 --- a/packages/job-dispatch/src/job-dispatch.ts +++ b/packages/job-dispatch/src/job-dispatch.ts @@ -99,11 +99,6 @@ class DispatchBuilder { data: { jobId: wf.id }, })), ); - await Promise.all( - validJobsWithResolvedVariables.map((j) => - updateJob(this.db, j.id, { status: JobStatus.InProgress }), - ), - ); } await Promise.all( diff --git a/packages/validators/src/jobs/agents/index.ts b/packages/validators/src/jobs/agents/index.ts index d44da739c..4332fc746 100644 --- a/packages/validators/src/jobs/agents/index.ts +++ b/packages/validators/src/jobs/agents/index.ts @@ -2,4 +2,14 @@ export enum JobAgentType { KubernetesJob = "kubernetes-job", GithubApp = "github-app", ExecWindows = "exec-windows", + ExecLinux = "exec-linux", + Jenkins = "jenkins", } + +export const JobAgentTypeDisplayNames: Record = { + [JobAgentType.KubernetesJob]: "Kubernetes Job", + [JobAgentType.GithubApp]: "Github App", + [JobAgentType.ExecWindows]: "PowerShell", + [JobAgentType.ExecLinux]: "Shell", + [JobAgentType.Jenkins]: "Jenkins", +};