Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
feat(event): add build time for event: pull_request (#132)
Browse files Browse the repository at this point in the history
* feat(event): add build time for event: pull_request

* fix(event): add test for default commit time
  • Loading branch information
ybelMekk committed Nov 17, 2022
1 parent 951f155 commit c390bc0
Show file tree
Hide file tree
Showing 11 changed files with 624 additions and 122 deletions.
1 change: 0 additions & 1 deletion pkg/intoto/provenance_options_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,6 @@ func Environment() *vcs.GithubCIEnvironment {
Event: &vcs.Event{
EventMetadata: &vcs.EventMetadata{
HeadCommit: &vcs.HeadCommit{
Id: "yolo",
Timestamp: "2022-02-14T09:38:16+01:00",
},
},
Expand Down
1 change: 0 additions & 1 deletion pkg/intoto/provenance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ func TestGenerateSlsaPredicate(t *testing.T) {
// VCS GithubContext
assert.Equal(t, test.buildType, slsaPredicate.BuildType)
assert.NotEmpty(t, slsaPredicate.Invocation)
assert.Equal(t, "yolo", slsaPredicate.Invocation.Parameters.(*vcs.Event).GetHeadCommitId())
assert.Equal(t, "2022-02-14T09:38:16+01:00", slsaPredicate.Invocation.Parameters.(*vcs.Event).GetHeadCommitTimestamp())
e := slsaPredicate.Invocation.Environment.(*vcs.Metadata)
assert.NoError(t, err)
Expand Down
32 changes: 16 additions & 16 deletions pkg/vcs/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,23 @@ type Event struct {
}

type EventMetadata struct {
WorkFlowRun *WorkFlow `json:"workflow_run"`
HeadCommit *HeadCommit `json:"head_commit"`
}

type WorkFlow struct {
HeadCommit *HeadCommit `json:"head_commit"`
HeadCommit *HeadCommit `json:"head_commit"`
PullRequest *PullRequest `json:"pull_request"`
WorkFlowRun *WorkFlow `json:"workflow_run"`
}

type HeadCommit struct {
Id string `json:"id"`
Timestamp string `json:"timestamp"`
}

type PullRequest struct {
UpdatedAt string `json:"updated_at"`
}

type WorkFlow struct {
HeadCommit *HeadCommit `json:"head_commit"`
}

func ParseEvent(inputs []byte) (*Event, error) {
var event Event
err := json.Unmarshal(inputs, &event.EventMetadata)
Expand All @@ -32,21 +36,17 @@ func ParseEvent(inputs []byte) (*Event, error) {
return &event, nil
}

func (in *Event) GetHeadCommitId() string {
if in.EventMetadata.WorkFlowRun != nil {
return in.EventMetadata.WorkFlowRun.HeadCommit.Id
func (in *Event) GetHeadCommitTimestamp() string {
if in.EventMetadata.HeadCommit != nil {
return in.EventMetadata.HeadCommit.Timestamp
}

return in.EventMetadata.HeadCommit.Id
}

func (in *Event) GetHeadCommitTimestamp() string {
if in.EventMetadata.WorkFlowRun != nil {
return in.EventMetadata.WorkFlowRun.HeadCommit.Timestamp
}

if in.EventMetadata.HeadCommit != nil {
return in.EventMetadata.HeadCommit.Timestamp
if in.EventMetadata.PullRequest != nil {
return in.EventMetadata.PullRequest.UpdatedAt
}

return time.Now().UTC().Round(time.Second).Format(time.RFC3339)
Expand Down
55 changes: 42 additions & 13 deletions pkg/vcs/event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,50 @@ import (
"time"
)

func TestEvenHeadCommit(t *testing.T) {
metadata := commitMetadata(t)
context, err := ParseContext(metadata)
assert.NoError(t, err)
parsedEvent, err := ParseEvent(context.Event)
assert.NoError(t, err)
assert.NotNil(t, parsedEvent)
assert.Equal(t, "d4cd018b2fe54d8308b78f2bb88db94ac57173ea", parsedEvent.GetHeadCommitId())
_, err = time.Parse(time.RFC3339, parsedEvent.GetHeadCommitTimestamp())
assert.NoError(t, err)
assert.Equal(t, "2022-10-21T11:26:55+02:00", parsedEvent.GetHeadCommitTimestamp())
func TestEventHeadCommit(t *testing.T) {
for _, test := range []struct {
name string
workFlowMeatData []byte
WantTime string
}{
{
name: "GitHub Event workflow_run with head_commit",
workFlowMeatData: commitMetadata(t, "testdata/workflowrun-head-commit.json"),
WantTime: "2022-10-21T11:26:55+02:00",
},
{
name: "GitHub Event pull_request with updated_at",
workFlowMeatData: commitMetadata(t, "testdata/pull-request-event.json"),
WantTime: "2022-11-17T07:46:39Z",
},
{
name: "GitHub Event workflow_dispatch with head_commit",
workFlowMeatData: commitMetadata(t, "testdata/github-context.json"),
WantTime: "2022-02-14T09:38:16+01:00",
},
{
name: "No metadata found, should return default start time",
workFlowMeatData: commitMetadata(t, "testdata/unknown-event.json"),
},
} {
t.Run(test.name, func(t *testing.T) {
context, err := ParseContext(test.workFlowMeatData)
assert.NoError(t, err)
parsedEvent, err := ParseEvent(context.Event)
assert.NoError(t, err)
assert.NotNil(t, parsedEvent)
if test.WantTime != "" {
assert.Equal(t, test.WantTime, parsedEvent.GetHeadCommitTimestamp())
} else {
_, err := time.Parse(time.RFC3339, parsedEvent.GetHeadCommitTimestamp())
assert.NoError(t, err)
}
})
}
}

func commitMetadata(t *testing.T) []byte {
metadata, err := os.ReadFile("testdata/event-head-commit.json")
func commitMetadata(t *testing.T, eventFile string) []byte {
metadata, err := os.ReadFile(eventFile)
assert.NoError(t, err)
return metadata
}
8 changes: 4 additions & 4 deletions pkg/vcs/github_ci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ func TestCreateCIEnvironment(t *testing.T) {
env := envC()
ci, err := CreateGithubCIEnvironment(context, &runner, &env)
assert.NoError(t, err)
assert.Equal(t, "https://github.com/nais/salsa", ci.RepoUri())
assert.Equal(t, "https://github.com/bolo/tomato", ci.RepoUri())
assert.Equal(t, "90dc9f2bc4007d1099a941ba3d408d2c896fe8dd", ci.Sha())
assert.Equal(t, "https://github.com/nais/salsa/Attestations/GitHubHostedActions@v1", ci.BuilderId())
assert.Equal(t, "https://github.com/nais/salsa/actions/runs/1839977840", ci.BuildInvocationId())
assert.Equal(t, "https://github.com/bolo/tomato/Attestations/GitHubHostedActions@v1", ci.BuilderId())
assert.Equal(t, "https://github.com/bolo/tomato/actions/runs/1839977840", ci.BuildInvocationId())

metadata := Metadata{
Arch: "X64",
Expand Down Expand Up @@ -46,7 +46,7 @@ func TestCreateCIEnvironment(t *testing.T) {
result := ci.UserDefinedParameters()
assert.NotNil(t, result)
assert.NotEmpty(t, "%s", result)
assert.Equal(t, "Salsa CI", ci.Context())
assert.Equal(t, "tomato CI", ci.Context())

}

Expand Down
4 changes: 2 additions & 2 deletions pkg/vcs/github_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ func TestParseGithubContext(t *testing.T) {
assert.Equal(t, "90dc9f2bc4007d1099a941ba3d408d2c896fe8dd", context.SHA)
assert.Equal(t, "build", context.Job)
assert.Equal(t, "refs/heads/main", context.Ref)
assert.Equal(t, "nais/salsa", context.Repository)
assert.Equal(t, "nais", context.RepositoryOwner)
assert.Equal(t, "bolo/tomato", context.Repository)
assert.Equal(t, "bolo", context.RepositoryOwner)
assert.Equal(t, "1839977840", context.RunId)
assert.Equal(t, "57", context.RunNumber)
assert.Equal(t, "jdoe", context.Actor)
Expand Down
8 changes: 4 additions & 4 deletions pkg/vcs/resolve_context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@ func TestResolveBuildContext(t *testing.T) {
default:
assert.NoError(t, err)
assert.NotNil(t, resolved)
assert.Equal(t, "Salsa CI", resolved.Context())
assert.Equal(t, "tomato CI", resolved.Context())
assert.Equal(t, map[string]string{}, resolved.CurrentFilteredEnvironment())
assert.Equal(t, "https://github.com/nais/salsa/actions/runs/1839977840", resolved.BuildInvocationId())
assert.Equal(t, "https://github.com/bolo/tomato/actions/runs/1839977840", resolved.BuildInvocationId())
assert.Equal(t, "https://github.com/Attestations/GitHubActionsWorkflow@v1", resolved.BuildType())
assert.Equal(t, "https://github.com/nais/salsa", resolved.RepoUri())
assert.Equal(t, "https://github.com/nais/salsa/Attestations/GitHubHostedActions@v1", resolved.BuilderId())
assert.Equal(t, "https://github.com/bolo/tomato", resolved.RepoUri())
assert.Equal(t, "https://github.com/bolo/tomato/Attestations/GitHubHostedActions@v1", resolved.BuilderId())
assert.Equal(t, "90dc9f2bc4007d1099a941ba3d408d2c896fe8dd", resolved.Sha())
assert.NotNil(t, resolved.UserDefinedParameters())
assert.NotEmpty(t, resolved.UserDefinedParameters())
Expand Down

0 comments on commit c390bc0

Please sign in to comment.