This is an automated email from the ASF dual-hosted git repository.

abeizn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new f71f9e969 fix: github run api page<35 limit (#6876)
f71f9e969 is described below

commit f71f9e969079d8bab3ec712cbcc5854b7e1881e7
Author: abeizn <[email protected]>
AuthorDate: Fri Jan 26 10:52:13 2024 +0800

    fix: github run api page<35 limit (#6876)
    
    * fix: github run api page<35 limit
    
    * fix: some tips
    
    * fix: update note
---
 backend/plugins/github/tasks/cicd_run_collector.go | 270 ++++++++++++++++++++-
 1 file changed, 262 insertions(+), 8 deletions(-)

diff --git a/backend/plugins/github/tasks/cicd_run_collector.go 
b/backend/plugins/github/tasks/cicd_run_collector.go
index c94f194ca..3cd1bd5d5 100644
--- a/backend/plugins/github/tasks/cicd_run_collector.go
+++ b/backend/plugins/github/tasks/cicd_run_collector.go
@@ -41,11 +41,6 @@ const RAW_RUN_TABLE = "github_api_runs"
 // https://github.com/apache/incubator-devlake/issues/3199
 const PAGE_SIZE = 30
 
-type GithubRawRunsResult struct {
-       TotalCount         int64             `json:"total_count"`
-       GithubWorkflowRuns []json.RawMessage `json:"workflow_runs"`
-}
-
 type SimpleGithubApiJob struct {
        ID        int64
        CreatedAt common.Iso8601Time `json:"created_at"`
@@ -80,7 +75,9 @@ func CollectRuns(taskCtx plugin.SubTaskContext) errors.Error {
                                UrlTemplate: "repos/{{ .Params.Name 
}}/actions/runs",
                                Query: func(reqData *helper.RequestData, 
createdAfter *time.Time) (url.Values, errors.Error) {
                                        query := url.Values{}
-                                       query.Set("status", "completed")
+                                       // GitHub API returns only the first 34 
pages (with a size of 30) when specifying status=compleleted, try the following 
API request to verify the problem.
+                                       // 
https://api.github.com/repos/apache/incubator-devlake/actions/runs?per_page=30&page=35&status=completed
+                                       // query.Set("status", "completed")
                                        query.Set("page", fmt.Sprintf("%v", 
reqData.Pager.Page))
                                        query.Set("per_page", fmt.Sprintf("%v", 
reqData.Pager.Size))
                                        return query, nil
@@ -91,10 +88,21 @@ func CollectRuns(taskCtx plugin.SubTaskContext) 
errors.Error {
                                        if err != nil {
                                                return nil, err
                                        }
-                                       if len(body.GithubWorkflowRuns) == 0 {
+                                       if len(body.WorkflowRuns) == 0 {
                                                return nil, nil
                                        }
-                                       return body.GithubWorkflowRuns, nil
+                                       // filter out the runs that are not 
completed
+                                       filteredRuns := make([]json.RawMessage, 
0)
+                                       for _, run := range body.WorkflowRuns {
+                                               if run.Status == "completed" {
+                                                       runJSON, err := 
json.Marshal(run)
+                                                       if err != nil {
+                                                               return nil, 
errors.Convert(err)
+                                                       }
+                                                       filteredRuns = 
append(filteredRuns, json.RawMessage(runJSON))
+                                               }
+                                       }
+                                       return filteredRuns, nil
                                },
                        },
                        GetCreated: func(item json.RawMessage) (time.Time, 
errors.Error) {
@@ -115,3 +123,249 @@ func CollectRuns(taskCtx plugin.SubTaskContext) 
errors.Error {
        return collector.Execute()
 
 }
+
+type GithubRawRunsResult struct {
+       TotalCount   int `json:"total_count"`
+       WorkflowRuns []struct {
+               ID               int64  `json:"id"`
+               Name             string `json:"name"`
+               NodeID           string `json:"node_id"`
+               HeadBranch       string `json:"head_branch"`
+               HeadSha          string `json:"head_sha"`
+               Path             string `json:"path"`
+               DisplayTitle     string `json:"display_title"`
+               RunNumber        int    `json:"run_number"`
+               Event            string `json:"event"`
+               Status           string `json:"status"`
+               Conclusion       string `json:"conclusion"`
+               WorkflowID       int    `json:"workflow_id"`
+               CheckSuiteID     int64  `json:"check_suite_id"`
+               CheckSuiteNodeID string `json:"check_suite_node_id"`
+               URL              string `json:"url"`
+               HTMLURL          string `json:"html_url"`
+               PullRequests     []struct {
+                       URL    string `json:"url"`
+                       ID     int    `json:"id"`
+                       Number int    `json:"number"`
+                       Head   struct {
+                               Ref  string `json:"ref"`
+                               Sha  string `json:"sha"`
+                               Repo struct {
+                                       ID   int    `json:"id"`
+                                       URL  string `json:"url"`
+                                       Name string `json:"name"`
+                               } `json:"repo"`
+                       } `json:"head"`
+                       Base struct {
+                               Ref  string `json:"ref"`
+                               Sha  string `json:"sha"`
+                               Repo struct {
+                                       ID   int    `json:"id"`
+                                       URL  string `json:"url"`
+                                       Name string `json:"name"`
+                               } `json:"repo"`
+                       } `json:"base"`
+               } `json:"pull_requests"`
+               CreatedAt time.Time `json:"created_at"`
+               UpdatedAt time.Time `json:"updated_at"`
+               Actor     struct {
+                       Login             string `json:"login"`
+                       ID                int    `json:"id"`
+                       NodeID            string `json:"node_id"`
+                       AvatarURL         string `json:"avatar_url"`
+                       GravatarID        string `json:"gravatar_id"`
+                       URL               string `json:"url"`
+                       HTMLURL           string `json:"html_url"`
+                       FollowersURL      string `json:"followers_url"`
+                       FollowingURL      string `json:"following_url"`
+                       GistsURL          string `json:"gists_url"`
+                       StarredURL        string `json:"starred_url"`
+                       SubscriptionsURL  string `json:"subscriptions_url"`
+                       OrganizationsURL  string `json:"organizations_url"`
+                       ReposURL          string `json:"repos_url"`
+                       EventsURL         string `json:"events_url"`
+                       ReceivedEventsURL string `json:"received_events_url"`
+                       Type              string `json:"type"`
+                       SiteAdmin         bool   `json:"site_admin"`
+               } `json:"actor"`
+               RunAttempt          int       `json:"run_attempt"`
+               ReferencedWorkflows []any     `json:"referenced_workflows"`
+               RunStartedAt        time.Time `json:"run_started_at"`
+               TriggeringActor     struct {
+                       Login             string `json:"login"`
+                       ID                int    `json:"id"`
+                       NodeID            string `json:"node_id"`
+                       AvatarURL         string `json:"avatar_url"`
+                       GravatarID        string `json:"gravatar_id"`
+                       URL               string `json:"url"`
+                       HTMLURL           string `json:"html_url"`
+                       FollowersURL      string `json:"followers_url"`
+                       FollowingURL      string `json:"following_url"`
+                       GistsURL          string `json:"gists_url"`
+                       StarredURL        string `json:"starred_url"`
+                       SubscriptionsURL  string `json:"subscriptions_url"`
+                       OrganizationsURL  string `json:"organizations_url"`
+                       ReposURL          string `json:"repos_url"`
+                       EventsURL         string `json:"events_url"`
+                       ReceivedEventsURL string `json:"received_events_url"`
+                       Type              string `json:"type"`
+                       SiteAdmin         bool   `json:"site_admin"`
+               } `json:"triggering_actor"`
+               JobsURL            string `json:"jobs_url"`
+               LogsURL            string `json:"logs_url"`
+               CheckSuiteURL      string `json:"check_suite_url"`
+               ArtifactsURL       string `json:"artifacts_url"`
+               CancelURL          string `json:"cancel_url"`
+               RerunURL           string `json:"rerun_url"`
+               PreviousAttemptURL any    `json:"previous_attempt_url"`
+               WorkflowURL        string `json:"workflow_url"`
+               HeadCommit         struct {
+                       ID        string    `json:"id"`
+                       TreeID    string    `json:"tree_id"`
+                       Message   string    `json:"message"`
+                       Timestamp time.Time `json:"timestamp"`
+                       Author    struct {
+                               Name  string `json:"name"`
+                               Email string `json:"email"`
+                       } `json:"author"`
+                       Committer struct {
+                               Name  string `json:"name"`
+                               Email string `json:"email"`
+                       } `json:"committer"`
+               } `json:"head_commit"`
+               Repository struct {
+                       ID       int    `json:"id"`
+                       NodeID   string `json:"node_id"`
+                       Name     string `json:"name"`
+                       FullName string `json:"full_name"`
+                       Private  bool   `json:"private"`
+                       Owner    struct {
+                               Login             string `json:"login"`
+                               ID                int    `json:"id"`
+                               NodeID            string `json:"node_id"`
+                               AvatarURL         string `json:"avatar_url"`
+                               GravatarID        string `json:"gravatar_id"`
+                               URL               string `json:"url"`
+                               HTMLURL           string `json:"html_url"`
+                               FollowersURL      string `json:"followers_url"`
+                               FollowingURL      string `json:"following_url"`
+                               GistsURL          string `json:"gists_url"`
+                               StarredURL        string `json:"starred_url"`
+                               SubscriptionsURL  string 
`json:"subscriptions_url"`
+                               OrganizationsURL  string 
`json:"organizations_url"`
+                               ReposURL          string `json:"repos_url"`
+                               EventsURL         string `json:"events_url"`
+                               ReceivedEventsURL string 
`json:"received_events_url"`
+                               Type              string `json:"type"`
+                               SiteAdmin         bool   `json:"site_admin"`
+                       } `json:"owner"`
+                       HTMLURL          string `json:"html_url"`
+                       Description      string `json:"description"`
+                       Fork             bool   `json:"fork"`
+                       URL              string `json:"url"`
+                       ForksURL         string `json:"forks_url"`
+                       KeysURL          string `json:"keys_url"`
+                       CollaboratorsURL string `json:"collaborators_url"`
+                       TeamsURL         string `json:"teams_url"`
+                       HooksURL         string `json:"hooks_url"`
+                       IssueEventsURL   string `json:"issue_events_url"`
+                       EventsURL        string `json:"events_url"`
+                       AssigneesURL     string `json:"assignees_url"`
+                       BranchesURL      string `json:"branches_url"`
+                       TagsURL          string `json:"tags_url"`
+                       BlobsURL         string `json:"blobs_url"`
+                       GitTagsURL       string `json:"git_tags_url"`
+                       GitRefsURL       string `json:"git_refs_url"`
+                       TreesURL         string `json:"trees_url"`
+                       StatusesURL      string `json:"statuses_url"`
+                       LanguagesURL     string `json:"languages_url"`
+                       StargazersURL    string `json:"stargazers_url"`
+                       ContributorsURL  string `json:"contributors_url"`
+                       SubscribersURL   string `json:"subscribers_url"`
+                       SubscriptionURL  string `json:"subscription_url"`
+                       CommitsURL       string `json:"commits_url"`
+                       GitCommitsURL    string `json:"git_commits_url"`
+                       CommentsURL      string `json:"comments_url"`
+                       IssueCommentURL  string `json:"issue_comment_url"`
+                       ContentsURL      string `json:"contents_url"`
+                       CompareURL       string `json:"compare_url"`
+                       MergesURL        string `json:"merges_url"`
+                       ArchiveURL       string `json:"archive_url"`
+                       DownloadsURL     string `json:"downloads_url"`
+                       IssuesURL        string `json:"issues_url"`
+                       PullsURL         string `json:"pulls_url"`
+                       MilestonesURL    string `json:"milestones_url"`
+                       NotificationsURL string `json:"notifications_url"`
+                       LabelsURL        string `json:"labels_url"`
+                       ReleasesURL      string `json:"releases_url"`
+                       DeploymentsURL   string `json:"deployments_url"`
+               } `json:"repository"`
+               HeadRepository struct {
+                       ID       int    `json:"id"`
+                       NodeID   string `json:"node_id"`
+                       Name     string `json:"name"`
+                       FullName string `json:"full_name"`
+                       Private  bool   `json:"private"`
+                       Owner    struct {
+                               Login             string `json:"login"`
+                               ID                int    `json:"id"`
+                               NodeID            string `json:"node_id"`
+                               AvatarURL         string `json:"avatar_url"`
+                               GravatarID        string `json:"gravatar_id"`
+                               URL               string `json:"url"`
+                               HTMLURL           string `json:"html_url"`
+                               FollowersURL      string `json:"followers_url"`
+                               FollowingURL      string `json:"following_url"`
+                               GistsURL          string `json:"gists_url"`
+                               StarredURL        string `json:"starred_url"`
+                               SubscriptionsURL  string 
`json:"subscriptions_url"`
+                               OrganizationsURL  string 
`json:"organizations_url"`
+                               ReposURL          string `json:"repos_url"`
+                               EventsURL         string `json:"events_url"`
+                               ReceivedEventsURL string 
`json:"received_events_url"`
+                               Type              string `json:"type"`
+                               SiteAdmin         bool   `json:"site_admin"`
+                       } `json:"owner"`
+                       HTMLURL          string `json:"html_url"`
+                       Description      string `json:"description"`
+                       Fork             bool   `json:"fork"`
+                       URL              string `json:"url"`
+                       ForksURL         string `json:"forks_url"`
+                       KeysURL          string `json:"keys_url"`
+                       CollaboratorsURL string `json:"collaborators_url"`
+                       TeamsURL         string `json:"teams_url"`
+                       HooksURL         string `json:"hooks_url"`
+                       IssueEventsURL   string `json:"issue_events_url"`
+                       EventsURL        string `json:"events_url"`
+                       AssigneesURL     string `json:"assignees_url"`
+                       BranchesURL      string `json:"branches_url"`
+                       TagsURL          string `json:"tags_url"`
+                       BlobsURL         string `json:"blobs_url"`
+                       GitTagsURL       string `json:"git_tags_url"`
+                       GitRefsURL       string `json:"git_refs_url"`
+                       TreesURL         string `json:"trees_url"`
+                       StatusesURL      string `json:"statuses_url"`
+                       LanguagesURL     string `json:"languages_url"`
+                       StargazersURL    string `json:"stargazers_url"`
+                       ContributorsURL  string `json:"contributors_url"`
+                       SubscribersURL   string `json:"subscribers_url"`
+                       SubscriptionURL  string `json:"subscription_url"`
+                       CommitsURL       string `json:"commits_url"`
+                       GitCommitsURL    string `json:"git_commits_url"`
+                       CommentsURL      string `json:"comments_url"`
+                       IssueCommentURL  string `json:"issue_comment_url"`
+                       ContentsURL      string `json:"contents_url"`
+                       CompareURL       string `json:"compare_url"`
+                       MergesURL        string `json:"merges_url"`
+                       ArchiveURL       string `json:"archive_url"`
+                       DownloadsURL     string `json:"downloads_url"`
+                       IssuesURL        string `json:"issues_url"`
+                       PullsURL         string `json:"pulls_url"`
+                       MilestonesURL    string `json:"milestones_url"`
+                       NotificationsURL string `json:"notifications_url"`
+                       LabelsURL        string `json:"labels_url"`
+                       ReleasesURL      string `json:"releases_url"`
+                       DeploymentsURL   string `json:"deployments_url"`
+               } `json:"head_repository"`
+       } `json:"workflow_runs"`
+}

Reply via email to