DevOps Detector Skill
Purpose
Detect DevOps tools, CI/CD platforms, containerization, and orchestration from repository signals, job postings, and infrastructure indicators.
Input
Raw signals from Phase 2:
repository_signals - CI/CD configs, Dockerfiles, IaC
job_signals - DevOps job requirements
dns_signals - Service-specific subdomains
http_signals - Deployment patterns
Technology Categories
CI/CD Platforms
| Platform |
Detection Signals |
Weight |
| GitHub Actions |
.github/workflows/*.yml |
40 |
| GitLab CI |
.gitlab-ci.yml |
40 |
| Jenkins |
Jenkinsfile, jenkins.* subdomain |
35 |
| CircleCI |
.circleci/config.yml |
40 |
| Travis CI |
.travis.yml |
35 |
| Azure Pipelines |
azure-pipelines.yml |
40 |
| Bitbucket Pipelines |
bitbucket-pipelines.yml |
35 |
| Drone CI |
.drone.yml |
35 |
| TeamCity |
.teamcity/ directory |
35 |
| Buildkite |
.buildkite/ directory |
35 |
Build Tools
| Tool |
Detection Signals |
Weight |
| Webpack |
webpack.config.js, webpack patterns |
30 |
| Vite |
vite.config.js |
30 |
| Rollup |
rollup.config.js |
30 |
| esbuild |
esbuild patterns |
25 |
| Turbo |
turbo.json |
30 |
| Nx |
nx.json |
30 |
| Lerna |
lerna.json |
25 |
| pnpm |
pnpm-workspace.yaml |
25 |
Containerization
| Technology |
Detection Signals |
Weight |
| Docker |
Dockerfile, docker-compose.yml |
40 |
| Podman |
Containerfile, podman-compose.yml |
35 |
| containerd |
containerd config |
30 |
Container Orchestration
| Platform |
Detection Signals |
Weight |
| Kubernetes |
k8s/, kubernetes/, kustomization.yaml |
40 |
| Docker Swarm |
docker-stack.yml |
30 |
| Amazon ECS |
ecs-*.json, task definitions |
35 |
| Nomad |
*.nomad files |
30 |
Infrastructure as Code
| Tool |
Detection Signals |
Weight |
| Terraform |
*.tf files, .terraform/ |
40 |
| Pulumi |
Pulumi.yaml |
35 |
| AWS CloudFormation |
*.cfn.yml, template.yaml |
35 |
| AWS CDK |
cdk.json |
35 |
| Ansible |
ansible.cfg, playbook.yml |
35 |
| Chef |
cookbooks/, recipes/ |
30 |
| Puppet |
manifests/, modules/ |
30 |
| Helm |
Chart.yaml, charts/ |
35 |
Monitoring & Observability
| Tool |
Detection Signals |
Weight |
| Prometheus |
prometheus.yml |
35 |
| Grafana |
grafana.* subdomain |
30 |
| Datadog |
datadog-agent configs |
35 |
| New Relic |
newrelic.yml |
35 |
| Sentry |
sentry.properties, dsn in config |
35 |
| PagerDuty |
pagerduty integration |
30 |
| OpsGenie |
opsgenie integration |
30 |
Secret Management
| Tool |
Detection Signals |
Weight |
| HashiCorp Vault |
vault references |
30 |
| AWS Secrets Manager |
secretsmanager patterns |
30 |
| Doppler |
doppler.yaml |
30 |
| 1Password |
op:// references |
25 |
Detection Logic
def detect_devops_technologies(signals):
results = []
# CI/CD Detection from Repository
if signals.repository_signals:
for file in signals.repository_signals.files:
# GitHub Actions
if '.github/workflows/' in file and file.endswith('.yml'):
results.append({
"name": "GitHub Actions",
"category": "CI/CD",
"signals": [{"type": "config_file", "value": file}],
"total_weight": 40
})
# GitLab CI
if file == '.gitlab-ci.yml':
results.append({
"name": "GitLab CI",
"category": "CI/CD",
"signals": [{"type": "config_file", "value": file}],
"total_weight": 40
})
# Docker
if file.lower() in ['dockerfile', 'docker-compose.yml', 'docker-compose.yaml']:
results.append({
"name": "Docker",
"category": "Containerization",
"signals": [{"type": "config_file", "value": file}],
"total_weight": 40
})
# Kubernetes
if any(k8s_indicator in file.lower() for k8s_indicator in ['kubernetes', 'k8s', 'kustomization', 'helm']):
results.append({
"name": "Kubernetes",
"category": "Container Orchestration",
"signals": [{"type": "config_file", "value": file}],
"total_weight": 40
})
# Terraform
if file.endswith('.tf'):
results.append({
"name": "Terraform",
"category": "Infrastructure as Code",
"signals": [{"type": "config_file", "value": file}],
"total_weight": 40
})
# Job Posting Analysis
if signals.job_signals:
devops_keywords = {
"kubernetes": ("Kubernetes", "Container Orchestration"),
"docker": ("Docker", "Containerization"),
"terraform": ("Terraform", "Infrastructure as Code"),
"ansible": ("Ansible", "Configuration Management"),
"jenkins": ("Jenkins", "CI/CD"),
"github actions": ("GitHub Actions", "CI/CD"),
"gitlab ci": ("GitLab CI", "CI/CD"),
"prometheus": ("Prometheus", "Monitoring"),
"grafana": ("Grafana", "Monitoring"),
"datadog": ("Datadog", "Monitoring"),
"aws": ("AWS", "Cloud Platform"),
"gcp": ("Google Cloud", "Cloud Platform"),
"azure": ("Azure", "Cloud Platform")
}
for keyword, (tech_name, category) in devops_keywords.items():
if keyword in signals.job_signals.tech_mentions:
add_if_not_exists(results, tech_name, category, {
"type": "job_posting",
"value": f"'{keyword}' mentioned in job postings",
"frequency": signals.job_signals.tech_mentions[keyword].frequency
}, 25)
# DNS-based Detection
devops_subdomains = {
"jenkins": ("Jenkins", "CI/CD"),
"ci": ("CI/CD System", "CI/CD"),
"build": ("Build System", "CI/CD"),
"deploy": ("Deployment System", "CI/CD"),
"grafana": ("Grafana", "Monitoring"),
"prometheus": ("Prometheus", "Monitoring"),
"kibana": ("Elastic Stack", "Logging"),
"argocd": ("Argo CD", "GitOps"),
"vault": ("HashiCorp Vault", "Secret Management")
}
for subdomain in signals.discovered_subdomains:
for pattern, (tech_name, category) in devops_subdomains.items():
if pattern in subdomain.lower():
results.append({
"name": tech_name,
"category": category,
"signals": [{"type": "subdomain", "value": subdomain}],
"total_weight": 30
})
return results
Output
{
"skill": "devops_detector",
"results": {
"technologies": [
{
"name": "GitHub Actions",
"category": "CI/CD",
"signals": [
{
"type": "config_file",
"value": ".github/workflows/ci.yml",
"weight": 40
},
{
"type": "config_file",
"value": ".github/workflows/deploy.yml",
"weight": 40
}
],
"total_weight": 80,
"workflows_detected": ["ci.yml", "deploy.yml"]
},
{
"name": "Docker",
"category": "Containerization",
"signals": [
{
"type": "config_file",
"value": "Dockerfile",
"weight": 40
},
{
"type": "config_file",
"value": "docker-compose.yml",
"weight": 35
}
],
"total_weight": 75,
"base_images": ["node:18-alpine", "nginx:alpine"]
},
{
"name": "Kubernetes",
"category": "Container Orchestration",
"signals": [
{
"type": "config_file",
"value": "kubernetes/deployment.yaml",
"weight": 40
},
{
"type": "job_posting",
"value": "Kubernetes mentioned in 5 job postings",
"weight": 25
}
],
"total_weight": 65
},
{
"name": "Terraform",
"category": "Infrastructure as Code",
"signals": [
{
"type": "config_file",
"value": "terraform/main.tf",
"weight": 40
}
],
"total_weight": 40,
"providers_detected": ["aws", "cloudflare"]
},
{
"name": "Datadog",
"category": "Monitoring",
"signals": [
{
"type": "job_posting",
"value": "Datadog mentioned in DevOps job postings",
"weight": 25
}
],
"total_weight": 25
}
],
"devops_summary": {
"ci_cd": ["GitHub Actions"],
"containerization": ["Docker"],
"orchestration": ["Kubernetes"],
"iac": ["Terraform"],
"monitoring": ["Datadog"],
"maturity_assessment": "Advanced - Full CI/CD pipeline with IaC and container orchestration"
}
}
}
Maturity Assessment
DevOps Maturity Levels:
Basic:
- Manual deployments
- No CI/CD detected
- Minimal automation
Intermediate:
- CI/CD pipeline detected
- Containerization (Docker)
- Basic monitoring
Advanced:
- Full CI/CD with multiple stages
- Container orchestration (K8s)
- Infrastructure as Code
- Comprehensive monitoring
Cloud-Native:
- GitOps practices (ArgoCD)
- Service mesh
- Observability stack
- Multi-cloud or hybrid
Error Handling
- Private repositories: Note as limitation
- Incomplete config analysis: Provide partial results
- Job posting only signals: Lower confidence
1---2name: devops-detector3description: Detects CI/CD tools, containerization, and orchestration from public signals4---5
6# DevOps Detector Skill
7
8## Purpose
9
10Detect DevOps tools, CI/CD platforms, containerization, and orchestration from repository signals, job postings, and infrastructure indicators.
11
12## Input
13
14Raw signals from Phase 2:
15- `repository_signals` - CI/CD configs, Dockerfiles, IaC
16- `job_signals` - DevOps job requirements
17- `dns_signals` - Service-specific subdomains
18- `http_signals` - Deployment patterns
19
20## Technology Categories
21
22### CI/CD Platforms
23
24| Platform | Detection Signals | Weight |
25|----------|-------------------|--------|
26| GitHub Actions | .github/workflows/*.yml | 40 |
27| GitLab CI | .gitlab-ci.yml | 40 |
28| Jenkins | Jenkinsfile, jenkins.* subdomain | 35 |
29| CircleCI | .circleci/config.yml | 40 |
30| Travis CI | .travis.yml | 35 |
31| Azure Pipelines | azure-pipelines.yml | 40 |
32| Bitbucket Pipelines | bitbucket-pipelines.yml | 35 |
33| Drone CI | .drone.yml | 35 |
34| TeamCity | .teamcity/ directory | 35 |
35| Buildkite | .buildkite/ directory | 35 |
36
37### Build Tools
38
39| Tool | Detection Signals | Weight |
40|------|-------------------|--------|
41| Webpack | webpack.config.js, webpack patterns | 30 |
42| Vite | vite.config.js | 30 |
43| Rollup | rollup.config.js | 30 |
44| esbuild | esbuild patterns | 25 |
45| Turbo | turbo.json | 30 |
46| Nx | nx.json | 30 |
47| Lerna | lerna.json | 25 |
48| pnpm | pnpm-workspace.yaml | 25 |
49
50### Containerization
51
52| Technology | Detection Signals | Weight |
53|------------|-------------------|--------|
54| Docker | Dockerfile, docker-compose.yml | 40 |
55| Podman | Containerfile, podman-compose.yml | 35 |
56| containerd | containerd config | 30 |
57
58### Container Orchestration
59
60| Platform | Detection Signals | Weight |
61|----------|-------------------|--------|
62| Kubernetes | k8s/, kubernetes/, kustomization.yaml | 40 |
63| Docker Swarm | docker-stack.yml | 30 |
64| Amazon ECS | ecs-*.json, task definitions | 35 |
65| Nomad | *.nomad files | 30 |
66
67### Infrastructure as Code
68
69| Tool | Detection Signals | Weight |
70|------|-------------------|--------|
71| Terraform | *.tf files, .terraform/ | 40 |
72| Pulumi | Pulumi.yaml | 35 |
73| AWS CloudFormation | *.cfn.yml, template.yaml | 35 |
74| AWS CDK | cdk.json | 35 |
75| Ansible | ansible.cfg, playbook.yml | 35 |
76| Chef | cookbooks/, recipes/ | 30 |
77| Puppet | manifests/, modules/ | 30 |
78| Helm | Chart.yaml, charts/ | 35 |
79
80### Monitoring & Observability
81
82| Tool | Detection Signals | Weight |
83|------|-------------------|--------|
84| Prometheus | prometheus.yml | 35 |
85| Grafana | grafana.* subdomain | 30 |
86| Datadog | datadog-agent configs | 35 |
87| New Relic | newrelic.yml | 35 |
88| Sentry | sentry.properties, dsn in config | 35 |
89| PagerDuty | pagerduty integration | 30 |
90| OpsGenie | opsgenie integration | 30 |
91
92### Secret Management
93
94| Tool | Detection Signals | Weight |
95|------|-------------------|--------|
96| HashiCorp Vault | vault references | 30 |
97| AWS Secrets Manager | secretsmanager patterns | 30 |
98| Doppler | doppler.yaml | 30 |
99| 1Password | op:// references | 25 |
100
101## Detection Logic
102
103```python
104def detect_devops_technologies(signals):
105 results = []
106
107 # CI/CD Detection from Repository
108 if signals.repository_signals:
109 for file in signals.repository_signals.files:
110 # GitHub Actions
111 if '.github/workflows/' in file and file.endswith('.yml'):
112 results.append({
113 "name": "GitHub Actions",
114 "category": "CI/CD",
115 "signals": [{"type": "config_file", "value": file}],
116 "total_weight": 40
117 })
118
119 # GitLab CI
120 if file == '.gitlab-ci.yml':
121 results.append({
122 "name": "GitLab CI",
123 "category": "CI/CD",
124 "signals": [{"type": "config_file", "value": file}],
125 "total_weight": 40
126 })
127
128 # Docker
129 if file.lower() in ['dockerfile', 'docker-compose.yml', 'docker-compose.yaml']:
130 results.append({
131 "name": "Docker",
132 "category": "Containerization",
133 "signals": [{"type": "config_file", "value": file}],
134 "total_weight": 40
135 })
136
137 # Kubernetes
138 if any(k8s_indicator in file.lower() for k8s_indicator in ['kubernetes', 'k8s', 'kustomization', 'helm']):
139 results.append({
140 "name": "Kubernetes",
141 "category": "Container Orchestration",
142 "signals": [{"type": "config_file", "value": file}],
143 "total_weight": 40
144 })
145
146 # Terraform
147 if file.endswith('.tf'):
148 results.append({
149 "name": "Terraform",
150 "category": "Infrastructure as Code",
151 "signals": [{"type": "config_file", "value": file}],
152 "total_weight": 40
153 })
154
155 # Job Posting Analysis
156 if signals.job_signals:
157 devops_keywords = {
158 "kubernetes": ("Kubernetes", "Container Orchestration"),
159 "docker": ("Docker", "Containerization"),
160 "terraform": ("Terraform", "Infrastructure as Code"),
161 "ansible": ("Ansible", "Configuration Management"),
162 "jenkins": ("Jenkins", "CI/CD"),
163 "github actions": ("GitHub Actions", "CI/CD"),
164 "gitlab ci": ("GitLab CI", "CI/CD"),
165 "prometheus": ("Prometheus", "Monitoring"),
166 "grafana": ("Grafana", "Monitoring"),
167 "datadog": ("Datadog", "Monitoring"),
168 "aws": ("AWS", "Cloud Platform"),
169 "gcp": ("Google Cloud", "Cloud Platform"),
170 "azure": ("Azure", "Cloud Platform")
171 }
172
173 for keyword, (tech_name, category) in devops_keywords.items():
174 if keyword in signals.job_signals.tech_mentions:
175 add_if_not_exists(results, tech_name, category, {
176 "type": "job_posting",
177 "value": f"'{keyword}' mentioned in job postings",
178 "frequency": signals.job_signals.tech_mentions[keyword].frequency
179 }, 25)
180
181 # DNS-based Detection
182 devops_subdomains = {
183 "jenkins": ("Jenkins", "CI/CD"),
184 "ci": ("CI/CD System", "CI/CD"),
185 "build": ("Build System", "CI/CD"),
186 "deploy": ("Deployment System", "CI/CD"),
187 "grafana": ("Grafana", "Monitoring"),
188 "prometheus": ("Prometheus", "Monitoring"),
189 "kibana": ("Elastic Stack", "Logging"),
190 "argocd": ("Argo CD", "GitOps"),
191 "vault": ("HashiCorp Vault", "Secret Management")
192 }
193
194 for subdomain in signals.discovered_subdomains:
195 for pattern, (tech_name, category) in devops_subdomains.items():
196 if pattern in subdomain.lower():
197 results.append({
198 "name": tech_name,
199 "category": category,
200 "signals": [{"type": "subdomain", "value": subdomain}],
201 "total_weight": 30
202 })
203
204 return results
205```
206
207## Output
208
209```json
210{
211 "skill": "devops_detector",
212 "results": {
213 "technologies": [
214 {
215 "name": "GitHub Actions",
216 "category": "CI/CD",
217 "signals": [
218 {
219 "type": "config_file",
220 "value": ".github/workflows/ci.yml",
221 "weight": 40
222 },
223 {
224 "type": "config_file",
225 "value": ".github/workflows/deploy.yml",
226 "weight": 40
227 }
228 ],
229 "total_weight": 80,
230 "workflows_detected": ["ci.yml", "deploy.yml"]
231 },
232 {
233 "name": "Docker",
234 "category": "Containerization",
235 "signals": [
236 {
237 "type": "config_file",
238 "value": "Dockerfile",
239 "weight": 40
240 },
241 {
242 "type": "config_file",
243 "value": "docker-compose.yml",
244 "weight": 35
245 }
246 ],
247 "total_weight": 75,
248 "base_images": ["node:18-alpine", "nginx:alpine"]
249 },
250 {
251 "name": "Kubernetes",
252 "category": "Container Orchestration",
253 "signals": [
254 {
255 "type": "config_file",
256 "value": "kubernetes/deployment.yaml",
257 "weight": 40
258 },
259 {
260 "type": "job_posting",
261 "value": "Kubernetes mentioned in 5 job postings",
262 "weight": 25
263 }
264 ],
265 "total_weight": 65
266 },
267 {
268 "name": "Terraform",
269 "category": "Infrastructure as Code",
270 "signals": [
271 {
272 "type": "config_file",
273 "value": "terraform/main.tf",
274 "weight": 40
275 }
276 ],
277 "total_weight": 40,
278 "providers_detected": ["aws", "cloudflare"]
279 },
280 {
281 "name": "Datadog",
282 "category": "Monitoring",
283 "signals": [
284 {
285 "type": "job_posting",
286 "value": "Datadog mentioned in DevOps job postings",
287 "weight": 25
288 }
289 ],
290 "total_weight": 25
291 }
292 ],
293 "devops_summary": {
294 "ci_cd": ["GitHub Actions"],
295 "containerization": ["Docker"],
296 "orchestration": ["Kubernetes"],
297 "iac": ["Terraform"],
298 "monitoring": ["Datadog"],
299 "maturity_assessment": "Advanced - Full CI/CD pipeline with IaC and container orchestration"
300 }
301 }
302}
303```
304
305## Maturity Assessment
306
307```
308DevOps Maturity Levels:
309
310Basic:
311- Manual deployments
312- No CI/CD detected
313- Minimal automation
314
315Intermediate:
316- CI/CD pipeline detected
317- Containerization (Docker)
318- Basic monitoring
319
320Advanced:
321- Full CI/CD with multiple stages
322- Container orchestration (K8s)
323- Infrastructure as Code
324- Comprehensive monitoring
325
326Cloud-Native:
327- GitOps practices (ArgoCD)
328- Service mesh
329- Observability stack
330- Multi-cloud or hybrid
331```
332
333## Error Handling
334
335- Private repositories: Note as limitation
336- Incomplete config analysis: Provide partial results
337- Job posting only signals: Lower confidence