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  }