Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(events): add step to emit events to GCP #4901

Merged
merged 35 commits into from
May 6, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
0fe4b32
feat(gcp): add step to send events to GCP (#4896)
CCFenner Apr 18, 2024
2d74210
feat(gcp): Generate and validate the GCP OIDC token (#4899)
jliempt Apr 18, 2024
0846f1d
feat(events): add pipeline start and end event (#4900)
CCFenner Apr 18, 2024
ea8b70f
log successful event publish
Apr 18, 2024
942ff37
remove dummy step
CCFenner Apr 18, 2024
0b6b5f6
prevent step from failing
CCFenner Apr 19, 2024
0f043a0
improve event creation
CCFenner Apr 19, 2024
df44295
improve event creation
CCFenner Apr 19, 2024
9ddfef8
simplify eventing
CCFenner Apr 24, 2024
ad7e466
remove detailed events
CCFenner Apr 24, 2024
4a40d32
update parameter scope
CCFenner Apr 24, 2024
f395434
Merge branch 'master' into events
CCFenner Apr 24, 2024
b6b4132
update go.sum
CCFenner Apr 24, 2024
26d4f43
fix test case
CCFenner Apr 24, 2024
60edf31
add missing method
CCFenner Apr 24, 2024
43dd149
refactor OIDC part
Apr 24, 2024
6909edb
add oidc.go to vault pkg
Apr 24, 2024
65feabd
Merge branch 'master' into events
jliempt Apr 24, 2024
26e8ff6
mock OIDC token retrieval
Apr 25, 2024
65e1fcd
mock GCP functions
Apr 25, 2024
47d5813
update OIDC function name in Vault mocks
Apr 25, 2024
d009df4
get event data from CPE
Apr 25, 2024
f1d0084
don't encode data payload in b64
Apr 26, 2024
ac87b05
remove vault related changes
Apr 26, 2024
177b48e
remove vault changes from step code
Apr 26, 2024
c06ad8a
remove commented out code
Apr 26, 2024
8308849
documentation/steps/gcpPublishEvent.md
Apr 29, 2024
acf0bba
documentation/steps/gcpPublishEvent.md
Apr 29, 2024
8b68525
Merge branch 'events' of https://github.com/SAP/jenkins-library into …
Apr 29, 2024
f292d3c
remove hardcoded eventData
jliempt Apr 29, 2024
97f28db
update roleID
jliempt Apr 29, 2024
34ef952
go generate
Apr 29, 2024
6733c38
add ordering key for pubsub event
CCFenner May 3, 2024
60a39a5
Merge branch 'master' into events
CCFenner May 3, 2024
3299bc9
Merge branch 'master' into events
CCFenner May 6, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions cmd/gcpPublishEvent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package cmd

import (
"fmt"

piperConfig "github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/events"
"github.com/SAP/jenkins-library/pkg/gcp"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/orchestrator"
"github.com/SAP/jenkins-library/pkg/telemetry"
"github.com/cloudevents/sdk-go/v2/event"

"github.com/pkg/errors"
)

func gcpPublishEvent(config gcpPublishEventOptions, telemetryData *telemetry.CustomData) {
err := runGcpPublishEvent(&config, telemetryData)
if err != nil {
log.Entry().WithError(err).Fatal("step execution failed")
}
}

func runGcpPublishEvent(config *gcpPublishEventOptions, _ *telemetry.CustomData) error {
provider, _ := orchestrator.GetOrchestratorConfigProvider(nil)

var data []byte
var err error

switch config.Type {
case string(events.PipelineRunStartedEventType):
data, err = events.ToByteArray(event.EventContextV1{}, events.PipelineRunStartedEventData{
URL: provider.BuildURL(),
CommitId: provider.CommitSHA(),
RepositoryURL: provider.RepoURL(),
})
case string(events.PipelineRunFinishedEventType):
data, err = events.ToByteArray(event.EventContextV1{}, events.PipelineRunFinishedEventData{
URL: provider.BuildURL(),
CommitId: provider.CommitSHA(),
RepositoryURL: provider.RepoURL(),
Outcome: provider.BuildStatus(),
})
default:
return fmt.Errorf("event type %s not supported", config.Type)
}
if err != nil {
return errors.Wrap(err, "failed to create event data")
}

oidcToken, err := getOidcToken(config)
if err != nil {
return errors.Wrap(err, "failed to get OIDC token")
}

// get federated token
token, err := gcp.GetFederatedToken(config.GcpProjectNumber, config.GcpWorkloadIDentityPool, config.GcpWorkloadIDentityPoolProvider, oidcToken)
if err != nil {
return errors.Wrap(err, "failed to get federated token")
}

// publish event
err = gcp.Publish(config.GcpProjectNumber, config.Topic, token, data)
if err != nil {
return errors.Wrap(err, "failed to publish event")
}

log.Entry().Info("event published successfully!")

return nil
}

func getOidcToken(config *gcpPublishEventOptions) (string, error) {
vaultCreds := piperConfig.VaultCredentials{
AppRoleID: GeneralConfig.VaultRoleID,
AppRoleSecretID: GeneralConfig.VaultRoleSecretID,
VaultToken: GeneralConfig.VaultToken,
}
// GeneralConfig VaultServerURL and VaultNamespace are empty swicthing to stepConfig
var vaultConfig = map[string]interface{}{
"vaultServerUrl": config.VaultServerURL,
"vaultNamespace": config.VaultNamespace,
}

stepConfig := piperConfig.StepConfig{
Config: vaultConfig,
}
// Generating vault client
vaultClient, err := piperConfig.GetVaultClientFromConfig(stepConfig, vaultCreds)
if err != nil {
return "", errors.Wrap(err, "getting vault client failed")
}
// Getting oidc token and setting it in environment variable
token, err := vaultClient.GetOidcTokenByValidation(GeneralConfig.HookConfig.OidcConfig.RoleID)
if err != nil {
return "", errors.Wrap(err, "getting oidc token failed")
}

return token, nil
}
227 changes: 227 additions & 0 deletions cmd/gcpPublishEvent_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions cmd/gcpPublishEvent_generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build unit
// +build unit

package cmd

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestGcpPublishEventCommand(t *testing.T) {
t.Parallel()

testCmd := GcpPublishEventCommand()

// only high level testing performed - details are tested in step generation procedure
assert.Equal(t, "gcpPublishEvent", testCmd.Use, "command name incorrect")

}
1 change: 1 addition & 0 deletions cmd/metadata_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions cmd/piper.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ type HookConfiguration struct {
SentryConfig SentryConfiguration `json:"sentry,omitempty"`
SplunkConfig SplunkConfiguration `json:"splunk,omitempty"`
PendoConfig PendoConfiguration `json:"pendo,omitempty"`
OidcConfig OidcConfiguration `json:"oidc,omitempty"`
}

// SentryConfiguration defines the configuration options for the Sentry logging system
Expand All @@ -76,6 +77,11 @@ type PendoConfiguration struct {
Token string `json:"token,omitempty"`
}

// OidcConfiguration defines the configuration options for the OpenID Connect authentication system
type OidcConfiguration struct {
RoleID string `json:",roleID,omitempty"`
}

var rootCmd = &cobra.Command{
Use: "piper",
Short: "Executes CI/CD steps from project 'Piper' ",
Expand All @@ -92,6 +98,7 @@ var GeneralConfig GeneralConfigOptions
func Execute() {
log.Entry().Infof("Version %s", GitCommit)

rootCmd.AddCommand(GcpPublishEventCommand())
rootCmd.AddCommand(ArtifactPrepareVersionCommand())
rootCmd.AddCommand(ConfigCommand())
rootCmd.AddCommand(DefaultsCommand())
Expand Down
Loading
Loading