github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/documentation/generator.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "io" 7 "os" 8 "strings" 9 10 generator "github.com/SAP/jenkins-library/pkg/documentation/generator" 11 "github.com/SAP/jenkins-library/pkg/generator/helper" 12 "github.com/SAP/jenkins-library/pkg/piperutils" 13 "github.com/ghodss/yaml" 14 ) 15 16 type sliceFlags struct { 17 list []string 18 } 19 20 func (f *sliceFlags) String() string { 21 return "" 22 } 23 24 func (f *sliceFlags) Set(value string) error { 25 f.list = append(f.list, value) 26 return nil 27 } 28 29 func main() { 30 // flags for step documentation 31 var metadataPath string 32 var docTemplatePath string 33 var customLibraryStepFile string 34 var customDefaultFiles sliceFlags 35 var includeAzure bool 36 flag.StringVar(&metadataPath, "metadataDir", "./resources/metadata", "The directory containing the step metadata. Default points to \\'resources/metadata\\'.") 37 flag.StringVar(&docTemplatePath, "docuDir", "./documentation/docs/steps/", "The directory containing the docu stubs. Default points to \\'documentation/docs/steps/\\'.") 38 flag.StringVar(&customLibraryStepFile, "customLibraryStepFile", "", "") 39 flag.Var(&customDefaultFiles, "customDefaultFile", "Path to a custom default configuration file.") 40 flag.BoolVar(&includeAzure, "includeAzure", false, "Include Azure-specifics in step documentation.") 41 42 // flags for stage documentation 43 var generateStageConfig bool 44 var stageMetadataPath string 45 var stageTargetPath string 46 var relativeStepsPath string 47 flag.BoolVar(&generateStageConfig, "generateStageConfig", false, "Create stage documentation instead of step documentation.") 48 flag.StringVar(&stageMetadataPath, "stageMetadataPath", "./resources/com.sap.piper/pipeline/stageDefaults.yml", "The file containing the stage metadata. Default points to \\'./resources/com.sap.piper/pipeline/stageDefaults.yml\\'.") 49 flag.StringVar(&stageTargetPath, "stageTargetPath", "./documentation/docs/stages/", "The target path for the generated stage documentation. Default points to \\'./documentation/docs/stages/\\'.") 50 flag.StringVar(&relativeStepsPath, "relativeStepsPath", "../../steps", "The relative path from stages to steps") 51 52 flag.Parse() 53 54 if generateStageConfig { 55 // generating stage documentation 56 fmt.Println("Generating STAGE documentation") 57 fmt.Println("using Metadata:", stageMetadataPath) 58 fmt.Println("using stage target directory:", stageTargetPath) 59 fmt.Println("using relative steps path:", relativeStepsPath) 60 61 utils := &piperutils.Files{} 62 err := generator.GenerateStageDocumentation(stageMetadataPath, stageTargetPath, relativeStepsPath, utils) 63 checkError(err) 64 65 } else { 66 // generating step documentation 67 fmt.Println("Generating STEP documentation") 68 fmt.Println("using Metadata Directory:", metadataPath) 69 fmt.Println("using Documentation Directory:", docTemplatePath) 70 fmt.Println("using Custom Default Files:", strings.Join(customDefaultFiles.list, ", ")) 71 72 if len(customLibraryStepFile) > 0 { 73 fmt.Println("Reading custom library step mapping..") 74 content, err := os.ReadFile(customLibraryStepFile) 75 checkError(err) 76 err = yaml.Unmarshal(content, &generator.CustomLibrarySteps) 77 checkError(err) 78 fmt.Println(generator.CustomLibrarySteps) 79 } 80 81 metadataFiles, err := helper.MetadataFiles(metadataPath) 82 checkError(err) 83 err = generator.GenerateStepDocumentation(metadataFiles, customDefaultFiles.list, generator.DocuHelperData{ 84 DocTemplatePath: docTemplatePath, 85 OpenDocTemplateFile: openDocTemplateFile, 86 DocFileWriter: writeFile, 87 OpenFile: openFile, 88 }, includeAzure) 89 checkError(err) 90 } 91 } 92 93 func openDocTemplateFile(docTemplateFilePath string) (io.ReadCloser, error) { 94 //check if template exists otherwise print No Template found 95 if _, err := os.Stat(docTemplateFilePath); os.IsNotExist(err) { 96 err := fmt.Errorf("no template found: %v", docTemplateFilePath) 97 return nil, err 98 } 99 100 return os.Open(docTemplateFilePath) 101 } 102 103 func writeFile(filename string, data []byte, perm os.FileMode) error { 104 return os.WriteFile(filename, data, perm) 105 } 106 107 func openFile(name string) (io.ReadCloser, error) { 108 return os.Open(name) 109 } 110 111 func checkError(err error) { 112 if err != nil { 113 fmt.Printf("Error occurred: %v\n", err) 114 os.Exit(1) 115 } 116 }