You've already forked sap-jenkins-library
							
							
				mirror of
				https://github.com/SAP/jenkins-library.git
				synced 2025-10-30 23:57:50 +02:00 
			
		
		
		
	Add step to set GitHub status (#2012)
* add step for GitHub branch protection check * add command to piper command * remove unnecessary parameter * Update resources/metadata/githubbranchprotection.yaml * Add step to set GitHub status * add groovy part * update generation & go mod tidy * update groovy tests * update github api to fix bug * add comment * go mod tidy * update naming * update docs * update docs * Update resources/metadata/githubstatus.yaml Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com> * Update resources/metadata/githubstatus.yaml Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com> * Update resources/metadata/githubstatus.yaml Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com> * update generated files * update GitHub step order * Update interface usage * do not export interfaces * go mod tidy Co-authored-by: Sven Merk <33895725+nevskrem@users.noreply.github.com> Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com>
This commit is contained in:
		| @@ -14,7 +14,7 @@ import ( | ||||
| 	piperGithub "github.com/SAP/jenkins-library/pkg/github" | ||||
| ) | ||||
|  | ||||
| type githubRepositoriesService interface { | ||||
| type gitHubBranchProtectionRepositoriesService interface { | ||||
| 	GetBranchProtection(ctx context.Context, owner, repo, branch string) (*github.Protection, *github.Response, error) | ||||
| } | ||||
|  | ||||
| @@ -30,7 +30,7 @@ func githubCheckBranchProtection(config githubCheckBranchProtectionOptions, tele | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func runGithubCheckBranchProtection(ctx context.Context, config *githubCheckBranchProtectionOptions, telemetryData *telemetry.CustomData, ghRepositoriesService githubRepositoriesService) error { | ||||
| func runGithubCheckBranchProtection(ctx context.Context, config *githubCheckBranchProtectionOptions, telemetryData *telemetry.CustomData, ghRepositoriesService gitHubBranchProtectionRepositoriesService) error { | ||||
| 	ghProtection, _, err := ghRepositoriesService.GetBranchProtection(ctx, config.Owner, config.Repository, config.Branch) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "failed to read branch protection information") | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import ( | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| type ghRepoService struct { | ||||
| type ghCheckBranchRepoService struct { | ||||
| 	protection   github.Protection | ||||
| 	serviceError error | ||||
| 	owner        string | ||||
| @@ -19,7 +19,7 @@ type ghRepoService struct { | ||||
| 	branch       string | ||||
| } | ||||
|  | ||||
| func (g *ghRepoService) GetBranchProtection(ctx context.Context, owner, repo, branch string) (*github.Protection, *github.Response, error) { | ||||
| func (g *ghCheckBranchRepoService) GetBranchProtection(ctx context.Context, owner, repo, branch string) (*github.Protection, *github.Response, error) { | ||||
| 	g.owner = owner | ||||
| 	g.repo = repo | ||||
| 	g.branch = branch | ||||
| @@ -33,7 +33,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
|  | ||||
| 	t.Run("no checks active", func(t *testing.T) { | ||||
| 		config := githubCheckBranchProtectionOptions{Branch: "testBranch", Owner: "testOrg", Repository: "testRepo"} | ||||
| 		ghRepo := ghRepoService{} | ||||
| 		ghRepo := ghCheckBranchRepoService{} | ||||
| 		err := runGithubCheckBranchProtection(ctx, &config, &telemetryData, &ghRepo) | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, config.Branch, ghRepo.branch) | ||||
| @@ -43,7 +43,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
|  | ||||
| 	t.Run("error calling GitHub", func(t *testing.T) { | ||||
| 		config := githubCheckBranchProtectionOptions{Branch: "testBranch", Owner: "testOrg", Repository: "testRepo"} | ||||
| 		ghRepo := ghRepoService{serviceError: fmt.Errorf("gh test error")} | ||||
| 		ghRepo := ghCheckBranchRepoService{serviceError: fmt.Errorf("gh test error")} | ||||
| 		err := runGithubCheckBranchProtection(ctx, &config, &telemetryData, &ghRepo) | ||||
| 		assert.EqualError(t, err, "failed to read branch protection information: gh test error") | ||||
| 	}) | ||||
| @@ -57,7 +57,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
| 			RequireEnforceAdmins:         true, | ||||
| 			RequiredApprovingReviewCount: 1, | ||||
| 		} | ||||
| 		ghRepo := ghRepoService{protection: github.Protection{ | ||||
| 		ghRepo := ghCheckBranchRepoService{protection: github.Protection{ | ||||
| 			RequiredStatusChecks:       &github.RequiredStatusChecks{Contexts: []string{"check0", "check1", "check2", "check3"}}, | ||||
| 			EnforceAdmins:              &github.AdminEnforcement{Enabled: true}, | ||||
| 			RequiredPullRequestReviews: &github.PullRequestReviewsEnforcement{RequiredApprovingReviewCount: 1}, | ||||
| @@ -73,7 +73,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
| 		config := githubCheckBranchProtectionOptions{ | ||||
| 			RequiredChecks: []string{"check1", "check2"}, | ||||
| 		} | ||||
| 		ghRepo := ghRepoService{protection: github.Protection{ | ||||
| 		ghRepo := ghCheckBranchRepoService{protection: github.Protection{ | ||||
| 			RequiredStatusChecks: &github.RequiredStatusChecks{Contexts: []string{"check0", "check1"}}, | ||||
| 		}} | ||||
| 		err := runGithubCheckBranchProtection(ctx, &config, &telemetryData, &ghRepo) | ||||
| @@ -84,7 +84,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
| 		config := githubCheckBranchProtectionOptions{ | ||||
| 			RequireEnforceAdmins: true, | ||||
| 		} | ||||
| 		ghRepo := ghRepoService{protection: github.Protection{ | ||||
| 		ghRepo := ghCheckBranchRepoService{protection: github.Protection{ | ||||
| 			EnforceAdmins: &github.AdminEnforcement{Enabled: false}, | ||||
| 		}} | ||||
| 		err := runGithubCheckBranchProtection(ctx, &config, &telemetryData, &ghRepo) | ||||
| @@ -95,7 +95,7 @@ func TestRunGithubCheckBranchProtection(t *testing.T) { | ||||
| 		config := githubCheckBranchProtectionOptions{ | ||||
| 			RequiredApprovingReviewCount: 2, | ||||
| 		} | ||||
| 		ghRepo := ghRepoService{protection: github.Protection{ | ||||
| 		ghRepo := ghCheckBranchRepoService{protection: github.Protection{ | ||||
| 			RequiredPullRequestReviews: &github.PullRequestReviewsEnforcement{RequiredApprovingReviewCount: 1}, | ||||
| 		}} | ||||
| 		err := runGithubCheckBranchProtection(ctx, &config, &telemetryData, &ghRepo) | ||||
|   | ||||
							
								
								
									
										38
									
								
								cmd/githubSetCommitStatus.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								cmd/githubSetCommitStatus.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/SAP/jenkins-library/pkg/telemetry" | ||||
| 	"github.com/google/go-github/v32/github" | ||||
|  | ||||
| 	"github.com/pkg/errors" | ||||
|  | ||||
| 	piperGithub "github.com/SAP/jenkins-library/pkg/github" | ||||
| ) | ||||
|  | ||||
| type gitHubCommitStatusRepositoriesService interface { | ||||
| 	CreateStatus(ctx context.Context, owner, repo, ref string, status *github.RepoStatus) (*github.RepoStatus, *github.Response, error) | ||||
| } | ||||
|  | ||||
| func githubSetCommitStatus(config githubSetCommitStatusOptions, telemetryData *telemetry.CustomData) { | ||||
| 	ctx, client, err := piperGithub.NewClient(config.Token, config.APIURL, "") | ||||
| 	if err != nil { | ||||
| 		log.Entry().WithError(err).Fatal("Failed to get GitHub client") | ||||
| 	} | ||||
|  | ||||
| 	err = runGithubSetCommitStatus(ctx, &config, telemetryData, client.Repositories) | ||||
| 	if err != nil { | ||||
| 		log.Entry().WithError(err).Fatal("GitHub status update failed") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func runGithubSetCommitStatus(ctx context.Context, config *githubSetCommitStatusOptions, telemetryData *telemetry.CustomData, ghRepositoriesService gitHubCommitStatusRepositoriesService) error { | ||||
| 	status := github.RepoStatus{State: &config.Status, TargetURL: &config.TargetURL} | ||||
| 	_, _, err := ghRepositoriesService.CreateStatus(ctx, config.Owner, config.Repository, config.CommitID, &status) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrapf(err, "failed to set status '%v' on commitId '%v'", config.Status, config.CommitID) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										199
									
								
								cmd/githubSetCommitStatus_generated.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								cmd/githubSetCommitStatus_generated.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | ||||
| // Code generated by piper's step-generator. DO NOT EDIT. | ||||
|  | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/config" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/SAP/jenkins-library/pkg/telemetry" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
|  | ||||
| type githubSetCommitStatusOptions struct { | ||||
| 	APIURL      string `json:"apiUrl,omitempty"` | ||||
| 	CommitID    string `json:"commitId,omitempty"` | ||||
| 	Context     string `json:"context,omitempty"` | ||||
| 	Description string `json:"description,omitempty"` | ||||
| 	Owner       string `json:"owner,omitempty"` | ||||
| 	Repository  string `json:"repository,omitempty"` | ||||
| 	Status      string `json:"status,omitempty"` | ||||
| 	TargetURL   string `json:"targetUrl,omitempty"` | ||||
| 	Token       string `json:"token,omitempty"` | ||||
| } | ||||
|  | ||||
| // GithubSetCommitStatusCommand Set a status of a certain commit. | ||||
| func GithubSetCommitStatusCommand() *cobra.Command { | ||||
| 	const STEP_NAME = "githubSetCommitStatus" | ||||
|  | ||||
| 	metadata := githubSetCommitStatusMetadata() | ||||
| 	var stepConfig githubSetCommitStatusOptions | ||||
| 	var startTime time.Time | ||||
|  | ||||
| 	var createGithubSetCommitStatusCmd = &cobra.Command{ | ||||
| 		Use:   STEP_NAME, | ||||
| 		Short: "Set a status of a certain commit.", | ||||
| 		Long: `This step allows you to set a status for a certain commit. | ||||
| Details can be found here: https://developer.github.com/v3/repos/statuses/. | ||||
|  | ||||
| Typically, following information is set: | ||||
|  | ||||
| * state (pending, failure, success) | ||||
| * context | ||||
| * target URL (link to details) | ||||
|  | ||||
| It can for example be used to create additional check indicators for a pull request which can be evaluated and also be enforced by GitHub configuration.`, | ||||
| 		PreRunE: func(cmd *cobra.Command, _ []string) error { | ||||
| 			startTime = time.Now() | ||||
| 			log.SetStepName(STEP_NAME) | ||||
| 			log.SetVerbose(GeneralConfig.Verbose) | ||||
|  | ||||
| 			path, _ := os.Getwd() | ||||
| 			fatalHook := &log.FatalHook{CorrelationID: GeneralConfig.CorrelationID, Path: path} | ||||
| 			log.RegisterHook(fatalHook) | ||||
|  | ||||
| 			err := PrepareConfig(cmd, &metadata, STEP_NAME, &stepConfig, config.OpenPiperFile) | ||||
| 			if err != nil { | ||||
| 				log.SetErrorCategory(log.ErrorConfiguration) | ||||
| 				return err | ||||
| 			} | ||||
| 			log.RegisterSecret(stepConfig.Token) | ||||
|  | ||||
| 			if len(GeneralConfig.HookConfig.SentryConfig.Dsn) > 0 { | ||||
| 				sentryHook := log.NewSentryHook(GeneralConfig.HookConfig.SentryConfig.Dsn, GeneralConfig.CorrelationID) | ||||
| 				log.RegisterHook(&sentryHook) | ||||
| 			} | ||||
|  | ||||
| 			return nil | ||||
| 		}, | ||||
| 		Run: func(_ *cobra.Command, _ []string) { | ||||
| 			telemetryData := telemetry.CustomData{} | ||||
| 			telemetryData.ErrorCode = "1" | ||||
| 			handler := func() { | ||||
| 				telemetryData.Duration = fmt.Sprintf("%v", time.Since(startTime).Milliseconds()) | ||||
| 				telemetry.Send(&telemetryData) | ||||
| 			} | ||||
| 			log.DeferExitHandler(handler) | ||||
| 			defer handler() | ||||
| 			telemetry.Initialize(GeneralConfig.NoTelemetry, STEP_NAME) | ||||
| 			githubSetCommitStatus(stepConfig, &telemetryData) | ||||
| 			telemetryData.ErrorCode = "0" | ||||
| 			log.Entry().Info("SUCCESS") | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	addGithubSetCommitStatusFlags(createGithubSetCommitStatusCmd, &stepConfig) | ||||
| 	return createGithubSetCommitStatusCmd | ||||
| } | ||||
|  | ||||
| func addGithubSetCommitStatusFlags(cmd *cobra.Command, stepConfig *githubSetCommitStatusOptions) { | ||||
| 	cmd.Flags().StringVar(&stepConfig.APIURL, "apiUrl", `https://api.github.com`, "Set the GitHub API URL.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.CommitID, "commitId", os.Getenv("PIPER_commitId"), "The commitId for which the status should be set.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Context, "context", os.Getenv("PIPER_context"), "Label for the status which will for example show up in a pull request.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Description, "description", os.Getenv("PIPER_description"), "Short description of the status.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Owner, "owner", os.Getenv("PIPER_owner"), "Name of the GitHub organization.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Repository, "repository", os.Getenv("PIPER_repository"), "Name of the GitHub repository.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Status, "status", os.Getenv("PIPER_status"), "Status which should be set on the commitId.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.TargetURL, "targetUrl", os.Getenv("PIPER_targetUrl"), "Target URL to associate the status with.") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Token, "token", os.Getenv("PIPER_token"), "GitHub personal access token as per https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line.") | ||||
|  | ||||
| 	cmd.MarkFlagRequired("apiUrl") | ||||
| 	cmd.MarkFlagRequired("commitId") | ||||
| 	cmd.MarkFlagRequired("context") | ||||
| 	cmd.MarkFlagRequired("owner") | ||||
| 	cmd.MarkFlagRequired("repository") | ||||
| 	cmd.MarkFlagRequired("status") | ||||
| 	cmd.MarkFlagRequired("token") | ||||
| } | ||||
|  | ||||
| // retrieve step metadata | ||||
| func githubSetCommitStatusMetadata() config.StepData { | ||||
| 	var theMetaData = config.StepData{ | ||||
| 		Metadata: config.StepMetadata{ | ||||
| 			Name:    "githubSetCommitStatus", | ||||
| 			Aliases: []config.Alias{}, | ||||
| 		}, | ||||
| 		Spec: config.StepSpec{ | ||||
| 			Inputs: config.StepInputs{ | ||||
| 				Parameters: []config.StepParameters{ | ||||
| 					{ | ||||
| 						Name:        "apiUrl", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"GENERAL", "PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{{Name: "githubApiUrl"}}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "commitId", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "context", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "description", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   false, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "owner", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{{Name: "githubOrg"}}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "repository", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{{Name: "githubRepo"}}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "status", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "targetUrl", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   false, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "token", | ||||
| 						ResourceRef: []config.ResourceReference{{Name: "githubTokenCredentialsId", Param: ""}}, | ||||
| 						Scope:       []string{"GENERAL", "PARAMETERS", "STAGES", "STEPS"}, | ||||
| 						Type:        "string", | ||||
| 						Mandatory:   true, | ||||
| 						Aliases:     []config.Alias{{Name: "githubToken"}}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	return theMetaData | ||||
| } | ||||
							
								
								
									
										16
									
								
								cmd/githubSetCommitStatus_generated_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cmd/githubSetCommitStatus_generated_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestGithubSetCommitStatusCommand(t *testing.T) { | ||||
|  | ||||
| 	testCmd := GithubSetCommitStatusCommand() | ||||
|  | ||||
| 	// only high level testing performed - details are tested in step generation procedure | ||||
| 	assert.Equal(t, "githubSetCommitStatus", testCmd.Use, "command name incorrect") | ||||
|  | ||||
| } | ||||
							
								
								
									
										53
									
								
								cmd/githubSetCommitStatus_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								cmd/githubSetCommitStatus_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/telemetry" | ||||
|  | ||||
| 	"github.com/google/go-github/v32/github" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| type ghSetCommitRepoService struct { | ||||
| 	serviceError error | ||||
| 	owner        string | ||||
| 	ref          string | ||||
| 	repo         string | ||||
| 	status       *github.RepoStatus | ||||
| } | ||||
|  | ||||
| func (g *ghSetCommitRepoService) CreateStatus(ctx context.Context, owner, repo, ref string, status *github.RepoStatus) (*github.RepoStatus, *github.Response, error) { | ||||
| 	g.owner = owner | ||||
| 	g.repo = repo | ||||
| 	g.ref = ref | ||||
| 	g.status = status | ||||
|  | ||||
| 	return nil, nil, g.serviceError | ||||
| } | ||||
|  | ||||
| func TestRunGithubSetCommitStatus(t *testing.T) { | ||||
| 	ctx := context.Background() | ||||
| 	telemetryData := telemetry.CustomData{} | ||||
|  | ||||
| 	t.Run("success case", func(t *testing.T) { | ||||
| 		config := githubSetCommitStatusOptions{CommitID: "testSha", Owner: "testOrg", Repository: "testRepo", Status: "success", TargetURL: "https://test.url"} | ||||
| 		ghRepo := ghSetCommitRepoService{} | ||||
| 		err := runGithubSetCommitStatus(ctx, &config, &telemetryData, &ghRepo) | ||||
| 		expectedStatus := github.RepoStatus{State: &config.Status, TargetURL: &config.TargetURL} | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, config.CommitID, ghRepo.ref) | ||||
| 		assert.Equal(t, config.Owner, ghRepo.owner) | ||||
| 		assert.Equal(t, config.Repository, ghRepo.repo) | ||||
| 		assert.Equal(t, &expectedStatus, ghRepo.status) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("error calling GitHub", func(t *testing.T) { | ||||
| 		config := githubSetCommitStatusOptions{CommitID: "testSha", Owner: "testOrg", Repository: "testRepo", Status: "pending"} | ||||
| 		ghRepo := ghSetCommitRepoService{serviceError: fmt.Errorf("gh test error")} | ||||
| 		err := runGithubSetCommitStatus(ctx, &config, &telemetryData, &ghRepo) | ||||
| 		assert.EqualError(t, err, "failed to set status 'pending' on commitId 'testSha': gh test error") | ||||
| 	}) | ||||
| } | ||||
| @@ -73,6 +73,7 @@ func Execute() { | ||||
| 	rootCmd.AddCommand(GithubCheckBranchProtectionCommand()) | ||||
| 	rootCmd.AddCommand(GithubCreatePullRequestCommand()) | ||||
| 	rootCmd.AddCommand(GithubPublishReleaseCommand()) | ||||
| 	rootCmd.AddCommand(GithubSetCommitStatusCommand()) | ||||
| 	rootCmd.AddCommand(CloudFoundryDeleteServiceCommand()) | ||||
| 	rootCmd.AddCommand(AbapEnvironmentPullGitRepoCommand()) | ||||
| 	rootCmd.AddCommand(AbapEnvironmentCloneGitRepoCommand()) | ||||
|   | ||||
							
								
								
									
										13
									
								
								documentation/docs/steps/githubCheckBranchProtection.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								documentation/docs/steps/githubCheckBranchProtection.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # ${docGenStepName} | ||||
|  | ||||
| ## Prerequisites | ||||
|  | ||||
| You need to create a personal access token within GitHub and add this to the Jenkins credentials store. | ||||
|  | ||||
| Please see [GitHub documentation for details about creating the personal access token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). | ||||
|  | ||||
| ## ${docGenParameters} | ||||
|  | ||||
| ## ${docGenConfiguration} | ||||
|  | ||||
| ## ${docGenDescription} | ||||
							
								
								
									
										13
									
								
								documentation/docs/steps/githubSetCommitStatus.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								documentation/docs/steps/githubSetCommitStatus.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # ${docGenStepName} | ||||
|  | ||||
| ## Prerequisites | ||||
|  | ||||
| You need to create a personal access token within GitHub and add this to the Jenkins credentials store. | ||||
|  | ||||
| Please see [GitHub documentation for details about creating the personal access token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). | ||||
|  | ||||
| ## ${docGenParameters} | ||||
|  | ||||
| ## ${docGenConfiguration} | ||||
|  | ||||
| ## ${docGenDescription} | ||||
| @@ -79,7 +79,9 @@ nav: | ||||
|         - gctsDeploy: steps/gctsDeploy.md | ||||
|         - gctsExecuteABAPUnitTests: steps/gctsExecuteABAPUnitTests.md | ||||
|         - gctsRollback: steps/gctsRollback.md | ||||
|         - githubCheckBranchProtection: steps/githubCheckBranchProtection.md | ||||
|         - githubPublishRelease: steps/githubPublishRelease.md | ||||
|         - githubSetCommitStatus: steps/githubSetCommitStatus.md | ||||
|         - hadolintExecute: steps/hadolintExecute.md | ||||
|         - handlePipelineStepErrors: steps/handlePipelineStepErrors.md | ||||
|         - healthExecuteCheck: steps/healthExecuteCheck.md | ||||
|   | ||||
							
								
								
									
										1
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.sum
									
									
									
									
									
								
							| @@ -523,7 +523,6 @@ github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= | ||||
| github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-containerregistry v0.1.2 h1:YjFNKqxzWUVZND8d4ItF9wuYlE75WQfECE7yKX/Nu3o= | ||||
| github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= | ||||
| github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo= | ||||
| github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= | ||||
| github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= | ||||
| github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= | ||||
|   | ||||
							
								
								
									
										110
									
								
								resources/metadata/githubstatus.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								resources/metadata/githubstatus.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| metadata: | ||||
|   name: githubSetCommitStatus | ||||
|   description: Set a status of a certain commit. | ||||
|   longDescription: | | ||||
|     This step allows you to set a status for a certain commit. | ||||
|     Details can be found here: https://developer.github.com/v3/repos/statuses/. | ||||
|  | ||||
|     Typically, following information is set: | ||||
|  | ||||
|     * state (pending, failure, success) | ||||
|     * context | ||||
|     * target URL (link to details) | ||||
|  | ||||
|     It can for example be used to create additional check indicators for a pull request which can be evaluated and also be enforced by GitHub configuration. | ||||
| spec: | ||||
|   inputs: | ||||
|     secrets: | ||||
|       - name: githubTokenCredentialsId | ||||
|         description: Jenkins 'Secret text' credentials ID containing token to authenticate to GitHub. | ||||
|         type: jenkins | ||||
|     params: | ||||
|       - name: apiUrl | ||||
|         aliases: | ||||
|           - name: githubApiUrl | ||||
|         description: Set the GitHub API URL. | ||||
|         scope: | ||||
|           - GENERAL | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         default: https://api.github.com | ||||
|         mandatory: true | ||||
|       - name: commitId | ||||
|         description: The commitId for which the status should be set. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         mandatory: true | ||||
|       - name: context | ||||
|         description: Label for the status which will for example show up in a pull request. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         mandatory: true | ||||
|       - name: description | ||||
|         description: Short description of the status. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|       - name: owner | ||||
|         aliases: | ||||
|           - name: githubOrg | ||||
|         description: Name of the GitHub organization. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         mandatory: true | ||||
|       - name: repository | ||||
|         aliases: | ||||
|           - name: githubRepo | ||||
|         description: Name of the GitHub repository. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         mandatory: true | ||||
|       - name: status | ||||
|         description: Status which should be set on the commitId. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         possibleValues: | ||||
|           - failure | ||||
|           - pending | ||||
|           - success | ||||
|         mandatory: true | ||||
|       - name: targetUrl | ||||
|         description: Target URL to associate the status with. | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|       - name: token | ||||
|         aliases: | ||||
|           - name: githubToken | ||||
|         description: GitHub personal access token as per https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line. | ||||
|         scope: | ||||
|           - GENERAL | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         type: string | ||||
|         mandatory: true | ||||
|         secret: true | ||||
|         resourceRef: | ||||
|           - name: githubTokenCredentialsId | ||||
|             type: secret | ||||
| @@ -131,6 +131,7 @@ public class CommonStepsTest extends BasePiperTest{ | ||||
|         'checkmarxExecuteScan', //implementing new golang pattern without fields | ||||
|         'githubPublishRelease', //implementing new golang pattern without fields | ||||
|         'githubCheckBranchProtection', //implementing new golang pattern without fields | ||||
|         'githubSetCommitStatus', //implementing new golang pattern without fields | ||||
|         'kubernetesDeploy', //implementing new golang pattern without fields | ||||
|         'piperExecuteBin', //implementing new golang pattern without fields | ||||
|         'protecodeExecuteScan', //implementing new golang pattern without fields | ||||
|   | ||||
							
								
								
									
										11
									
								
								vars/githubSetCommitStatus.groovy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vars/githubSetCommitStatus.groovy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| import groovy.transform.Field | ||||
|  | ||||
| @Field String STEP_NAME = getClass().getName() | ||||
| @Field String METADATA_FILE = 'metadata/githubstatus.yaml' | ||||
|  | ||||
| void call(Map parameters = [:]) { | ||||
|     List credentials = [ | ||||
|         [type: 'token', id: 'githubTokenCredentialsId', env: ['PIPER_token']] | ||||
|     ] | ||||
|     piperExecuteBin(parameters, STEP_NAME, METADATA_FILE, credentials) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user