You've already forked sap-jenkins-library
mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-09-16 09:26:22 +02:00
Step generation: allow usage of go generate (#1793)
* Step generation: allow usage of go generate * Update DEVELOPMENT.md * move generate command to main.go (#1809) * Update main.go * Update DEVELOPMENT.md * Update piper.go * align path usage Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
This commit is contained in:
@@ -96,8 +96,11 @@ docker rm piper
|
|||||||
|
|
||||||
## Generating step framework
|
## Generating step framework
|
||||||
|
|
||||||
The steps are generated based on the yaml files in `resources/metadata/` with the following command
|
The steps are generated based on the yaml files in `resources/metadata/` with the following command from the root of the project:
|
||||||
`go run pkg/generator/step-metadata.go`.
|
|
||||||
|
```bash
|
||||||
|
go generate
|
||||||
|
```
|
||||||
|
|
||||||
The yaml format is kept pretty close to Tekton's [task format](https://github.com/tektoncd/pipeline/blob/master/docs/tasks.md).
|
The yaml format is kept pretty close to Tekton's [task format](https://github.com/tektoncd/pipeline/blob/master/docs/tasks.md).
|
||||||
Where the Tekton format was not sufficient some extenstions have been made.
|
Where the Tekton format was not sufficient some extenstions have been made.
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/SAP/jenkins-library/pkg/generator/helper"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/SAP/jenkins-library/pkg/generator/helper"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCommandContract(t *testing.T) {
|
func TestCommandContract(t *testing.T) {
|
||||||
@@ -70,6 +71,6 @@ func TestGenerator(t *testing.T) {
|
|||||||
metadataFiles, err := helper.MetadataFiles(dir)
|
metadataFiles, err := helper.MetadataFiles(dir)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
err = helper.ProcessMetaFiles(metadataFiles, stepHelperData, docuHelperData)
|
err = helper.ProcessMetaFiles(metadataFiles, "./cmd", stepHelperData, docuHelperData)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
2
main.go
2
main.go
@@ -1,5 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
//go:generate go run pkg/generator/step-metadata.go --metadataDir=./resources/metadata/ --targetDir=./cmd/
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/SAP/jenkins-library/cmd"
|
"github.com/SAP/jenkins-library/cmd"
|
||||||
)
|
)
|
||||||
|
@@ -218,7 +218,8 @@ func run{{.StepName | title}}(config *{{ .StepName }}Options, telemetryData *tel
|
|||||||
`
|
`
|
||||||
|
|
||||||
// ProcessMetaFiles generates step coding based on step configuration provided in yaml files
|
// ProcessMetaFiles generates step coding based on step configuration provided in yaml files
|
||||||
func ProcessMetaFiles(metadataFiles []string, stepHelperData StepHelperData, docuHelperData DocuHelperData) error {
|
func ProcessMetaFiles(metadataFiles []string, targetDir string, stepHelperData StepHelperData, docuHelperData DocuHelperData) error {
|
||||||
|
|
||||||
for key := range metadataFiles {
|
for key := range metadataFiles {
|
||||||
|
|
||||||
var stepData config.StepData
|
var stepData config.StepData
|
||||||
@@ -246,17 +247,17 @@ func ProcessMetaFiles(metadataFiles []string, stepHelperData StepHelperData, doc
|
|||||||
checkError(err)
|
checkError(err)
|
||||||
|
|
||||||
step := stepTemplate(myStepInfo)
|
step := stepTemplate(myStepInfo)
|
||||||
err = stepHelperData.WriteFile(fmt.Sprintf("cmd/%v_generated.go", stepData.Metadata.Name), step, 0644)
|
err = stepHelperData.WriteFile(filepath.Join(targetDir, fmt.Sprintf("%v_generated.go", stepData.Metadata.Name)), step, 0644)
|
||||||
checkError(err)
|
checkError(err)
|
||||||
|
|
||||||
test := stepTestTemplate(myStepInfo)
|
test := stepTestTemplate(myStepInfo)
|
||||||
err = stepHelperData.WriteFile(fmt.Sprintf("cmd/%v_generated_test.go", stepData.Metadata.Name), test, 0644)
|
err = stepHelperData.WriteFile(filepath.Join(targetDir, fmt.Sprintf("%v_generated_test.go", stepData.Metadata.Name)), test, 0644)
|
||||||
checkError(err)
|
checkError(err)
|
||||||
|
|
||||||
exists, _ := piperutils.FileExists(fmt.Sprintf("cmd/%v.go", stepData.Metadata.Name))
|
exists, _ := piperutils.FileExists(filepath.Join(targetDir, fmt.Sprintf("%v.go", stepData.Metadata.Name)))
|
||||||
if !exists {
|
if !exists {
|
||||||
impl := stepImplementation(myStepInfo)
|
impl := stepImplementation(myStepInfo)
|
||||||
err = stepHelperData.WriteFile(fmt.Sprintf("cmd/%v.go", stepData.Metadata.Name), impl, 0644)
|
err = stepHelperData.WriteFile(filepath.Join(targetDir, fmt.Sprintf("%v.go", stepData.Metadata.Name)), impl, 0644)
|
||||||
checkError(err)
|
checkError(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@@ -85,7 +85,7 @@ func TestProcessMetaFiles(t *testing.T) {
|
|||||||
|
|
||||||
stepHelperData := StepHelperData{configOpenFileMock, writeFileMock, ""}
|
stepHelperData := StepHelperData{configOpenFileMock, writeFileMock, ""}
|
||||||
docuHelperData := DocuHelperData{IsGenerateDocu: false}
|
docuHelperData := DocuHelperData{IsGenerateDocu: false}
|
||||||
ProcessMetaFiles([]string{"test.yaml"}, stepHelperData, docuHelperData)
|
ProcessMetaFiles([]string{"test.yaml"}, "./cmd", stepHelperData, docuHelperData)
|
||||||
|
|
||||||
t.Run("step code", func(t *testing.T) {
|
t.Run("step code", func(t *testing.T) {
|
||||||
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
||||||
@@ -93,8 +93,9 @@ func TestProcessMetaFiles(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed reading %v", goldenFilePath)
|
t.Fatalf("failed reading %v", goldenFilePath)
|
||||||
}
|
}
|
||||||
assert.Equal(t, string(expected), string(files["cmd/testStep_generated.go"]))
|
resultFilePath := filepath.Join("cmd", "testStep_generated.go")
|
||||||
t.Log(string(files["cmd/testStep_generated.go"]))
|
assert.Equal(t, string(expected), string(files[resultFilePath]))
|
||||||
|
t.Log(string(files[resultFilePath]))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("test code", func(t *testing.T) {
|
t.Run("test code", func(t *testing.T) {
|
||||||
@@ -103,20 +104,22 @@ func TestProcessMetaFiles(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed reading %v", goldenFilePath)
|
t.Fatalf("failed reading %v", goldenFilePath)
|
||||||
}
|
}
|
||||||
assert.Equal(t, string(expected), string(files["cmd/testStep_generated_test.go"]))
|
resultFilePath := filepath.Join("cmd", "testStep_generated_test.go")
|
||||||
|
assert.Equal(t, string(expected), string(files[resultFilePath]))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("custom step code", func(t *testing.T) {
|
t.Run("custom step code", func(t *testing.T) {
|
||||||
stepHelperData = StepHelperData{configOpenFileMock, writeFileMock, "piperOsCmd"}
|
stepHelperData = StepHelperData{configOpenFileMock, writeFileMock, "piperOsCmd"}
|
||||||
ProcessMetaFiles([]string{"test.yaml"}, stepHelperData, docuHelperData)
|
ProcessMetaFiles([]string{"test.yaml"}, "./cmd", stepHelperData, docuHelperData)
|
||||||
|
|
||||||
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
||||||
expected, err := ioutil.ReadFile(goldenFilePath)
|
expected, err := ioutil.ReadFile(goldenFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed reading %v", goldenFilePath)
|
t.Fatalf("failed reading %v", goldenFilePath)
|
||||||
}
|
}
|
||||||
assert.Equal(t, string(expected), string(files["cmd/testStep_generated.go"]))
|
resultFilePath := filepath.Join("cmd", "testStep_generated.go")
|
||||||
t.Log(string(files["cmd/testStep_generated.go"]))
|
assert.Equal(t, string(expected), string(files[resultFilePath]))
|
||||||
|
t.Log(string(files[resultFilePath]))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,25 +12,28 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
var metadataPath string
|
||||||
|
var targetDir string
|
||||||
var docTemplatePath string
|
var docTemplatePath string
|
||||||
var isGenerateDocu bool
|
var isGenerateDocu bool
|
||||||
|
|
||||||
flag.StringVar(&docTemplatePath, "docuDir", "./documentation/docs/steps/", "The directory containing the docu stubs. Default points to \\'documentation/docs/steps.\\'")
|
flag.StringVar(&metadataPath, "metadataDir", "./resources/metadata", "The directory containing the step metadata. Default points to \\'resources/metadata\\'.")
|
||||||
flag.BoolVar(&isGenerateDocu, "docuGen", false, "Boolean to generate Documentation or Step-MetaData. Default is false")
|
flag.StringVar(&targetDir, "targetDir", "./cmd", "The target directory for the generated commands.")
|
||||||
|
flag.StringVar(&docTemplatePath, "docuDir", "./documentation/docs/steps/", "The directory containing the docu stubs. Default points to \\'documentation/docs/steps/\\'.")
|
||||||
|
flag.BoolVar(&isGenerateDocu, "docuGen", false, "Boolean to generate Documentation or Step-MetaData. Default is false.")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
fmt.Printf("docuDir: %v, genDocu: %v \n", docTemplatePath, isGenerateDocu)
|
fmt.Printf("metadataDir: %v\n, targetDir: %v\n, docuDir: %v\n, genDocu: %v\n", metadataPath, targetDir, docTemplatePath, isGenerateDocu)
|
||||||
|
|
||||||
metadataPath := "./resources/metadata"
|
|
||||||
|
|
||||||
metadataFiles, err := helper.MetadataFiles(metadataPath)
|
metadataFiles, err := helper.MetadataFiles(metadataPath)
|
||||||
checkError(err)
|
checkError(err)
|
||||||
docuHelperData := helper.DocuHelperData{isGenerateDocu, docTemplatePath, openDocTemplate, docFileWriter}
|
docuHelperData := helper.DocuHelperData{isGenerateDocu, docTemplatePath, openDocTemplate, docFileWriter}
|
||||||
stepHelperData := helper.StepHelperData{openMetaFile, fileWriter, ""}
|
stepHelperData := helper.StepHelperData{openMetaFile, fileWriter, ""}
|
||||||
err = helper.ProcessMetaFiles(metadataFiles, stepHelperData, docuHelperData)
|
err = helper.ProcessMetaFiles(metadataFiles, targetDir, stepHelperData, docuHelperData)
|
||||||
checkError(err)
|
checkError(err)
|
||||||
|
|
||||||
cmd := exec.Command("go", "fmt", "./cmd")
|
fmt.Printf("Running go fmt %v\n", targetDir)
|
||||||
|
cmd := exec.Command("go", "fmt", targetDir)
|
||||||
err = cmd.Run()
|
err = cmd.Run()
|
||||||
checkError(err)
|
checkError(err)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user