1818 noTrivyFlag bool
1919 noGitleaksFlag bool
2020 wizardFlag bool
21+ ciFlag string
2122)
2223
2324var initCmd = & cobra.Command {
@@ -63,35 +64,40 @@ or run interactively with --wizard.
6364 severity = "high"
6465 }
6566
67+ // Normalize CI provider
68+ ci := strings .ToLower (ciFlag )
69+ switch ci {
70+ case "github" , "gitlab" , "bitbucket" :
71+ // ok
72+ default :
73+ if ci != "" {
74+ fmt .Printf ("⚠️ Unknown CI provider '%s', defaulting to 'github'\n " , ciFlag )
75+ }
76+ ci = "github"
77+ }
78+
6679 cfg := & generators.InitConfig {
6780 Project : project ,
6881 SeverityThreshold : severity ,
82+ CIProvider : ci ,
6983 Tools : generators.ToolsConfig {
7084 Semgrep : ! noSemgrepFlag ,
7185 Trivy : ! noTrivyFlag ,
7286 Gitleaks : ! noGitleaksFlag ,
7387 },
7488 }
7589
76- // Ensure .github/workflows exists
77- wfDir := filepath .Join (dir , ".github" , "workflows" )
78- if err := os .MkdirAll (wfDir , 0o755 ); err != nil {
79- return fmt .Errorf ("failed to create workflows directory: %w" , err )
80- }
81-
8290 fmt .Println ("⚙️ Generating workflow + config files..." )
8391
84- if err := generators . GenerateGithubActions (cfg ); err != nil {
92+ if err := generateCIWorkflow (cfg , dir ); err != nil {
8593 return err
8694 }
8795 if err := generators .GenerateSecurityConfig (cfg ); err != nil {
8896 return err
8997 }
9098
9199 fmt .Println ("\n 🎉 Done! DevSecOps Kit initialized." )
92- fmt .Println ("Files created:" )
93- fmt .Println (" - .github/workflows/security.yml" )
94- fmt .Println (" - security-config.yml" )
100+ printGeneratedFiles (ci )
95101 return nil
96102 },
97103}
@@ -104,6 +110,7 @@ func init() {
104110 initCmd .Flags ().BoolVar (& noTrivyFlag , "no-trivy" , false , "Disable Trivy in generated workflow" )
105111 initCmd .Flags ().BoolVar (& noGitleaksFlag , "no-gitleaks" , false , "Disable Gitleaks in generated workflow" )
106112 initCmd .Flags ().BoolVar (& wizardFlag , "wizard" , false , "Run interactive guided setup" )
113+ initCmd .Flags ().StringVar (& ciFlag , "ci" , "github" , "CI provider: github, gitlab, bitbucket" )
107114}
108115
109116//
@@ -161,25 +168,28 @@ func runInitWizard() error {
161168 return nil
162169 }
163170
171+ // Select CI provider
172+ fmt .Println ("\n 🔧 Select CI provider:" )
173+ ciProvider := askChoice (reader , "github | gitlab | bitbucket [default: github]: " ,
174+ []string {"github" , "gitlab" , "bitbucket" },
175+ "github" ,
176+ )
177+
164178 // Generate config
165179 cfg := & generators.InitConfig {
166180 Project : project ,
167181 SeverityThreshold : severity ,
182+ CIProvider : ciProvider ,
168183 Tools : generators.ToolsConfig {
169184 Semgrep : enableSemgrep ,
170185 Gitleaks : enableGitleaks ,
171186 Trivy : enableTrivy ,
172187 },
173188 }
174189
175- wfDir := filepath .Join (dir , ".github" , "workflows" )
176- if err := os .MkdirAll (wfDir , 0o755 ); err != nil {
177- return fmt .Errorf ("failed to create workflows directory: %w" , err )
178- }
179-
180190 fmt .Println ("\n ⚙️ Generating workflow + config files..." )
181191
182- if err := generators . GenerateGithubActions (cfg ); err != nil {
192+ if err := generateCIWorkflow (cfg , dir ); err != nil {
183193 return err
184194 }
185195 if err := generators .GenerateSecurityConfig (cfg ); err != nil {
@@ -188,12 +198,38 @@ func runInitWizard() error {
188198
189199 fmt .Println ("\n 🎉 Setup complete!" )
190200 fmt .Println ("Generated:" )
191- fmt .Println (" - .github/workflows/security.yml" )
192- fmt .Println (" - security-config.yml" )
201+ printGeneratedFiles (ciProvider )
193202
194203 return nil
195204}
196205
206+ func generateCIWorkflow (cfg * generators.InitConfig , dir string ) error {
207+ switch cfg .CIProvider {
208+ case "gitlab" :
209+ return generators .GenerateGitLabCI (cfg )
210+ case "bitbucket" :
211+ return generators .GenerateBitbucketPipelines (cfg )
212+ default :
213+ wfDir := filepath .Join (dir , ".github" , "workflows" )
214+ if err := os .MkdirAll (wfDir , 0o755 ); err != nil {
215+ return fmt .Errorf ("failed to create workflows directory: %w" , err )
216+ }
217+ return generators .GenerateGithubActions (cfg )
218+ }
219+ }
220+
221+ func printGeneratedFiles (ci string ) {
222+ switch ci {
223+ case "gitlab" :
224+ fmt .Println (" - .gitlab-ci.yml" )
225+ case "bitbucket" :
226+ fmt .Println (" - bitbucket-pipelines.yml" )
227+ default :
228+ fmt .Println (" - .github/workflows/security.yml" )
229+ }
230+ fmt .Println (" - security-config.yml" )
231+ }
232+
197233//
198234// -----------------------------
199235// HELPER FUNCTIONS
0 commit comments