diff --git a/models/actions/run.go b/models/actions/run.go
index d5ab45a519..a711cfee2e 100644
--- a/models/actions/run.go
+++ b/models/actions/run.go
@@ -128,6 +128,17 @@ func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) {
 	return nil, fmt.Errorf("event %s is not a push event", run.Event)
 }
 
+func (run *ActionRun) GetPullRequestEventPayload() (*api.PullRequestPayload, error) {
+	if run.Event == webhook_module.HookEventPullRequest {
+		var payload api.PullRequestPayload
+		if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil {
+			return nil, err
+		}
+		return &payload, nil
+	}
+	return nil, fmt.Errorf("event %s is not a pull request event", run.Event)
+}
+
 func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) error {
 	_, err := db.GetEngine(ctx).ID(repo.ID).
 		SetExpr("num_action_runs",
diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go
index 4f31349352..84de106eec 100644
--- a/services/actions/commit_status.go
+++ b/services/actions/commit_status.go
@@ -21,35 +21,60 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
 	}
 
 	run := job.Run
-	if run.Event != webhook_module.HookEventPush {
+	var (
+		sha       string
+		creatorID int64
+	)
+
+	switch run.Event {
+	case webhook_module.HookEventPush:
+		payload, err := run.GetPushEventPayload()
+		if err != nil {
+			return fmt.Errorf("GetPushEventPayload: %w", err)
+		}
+
+		// Since the payload comes from json data, we should check if it's broken, or it will cause panic
+		switch {
+		case payload.Repo == nil:
+			return fmt.Errorf("repo is missing in event payload")
+		case payload.Pusher == nil:
+			return fmt.Errorf("pusher is missing in event payload")
+		case payload.HeadCommit == nil:
+			return fmt.Errorf("head commit is missing in event payload")
+		}
+
+		sha = payload.HeadCommit.ID
+		creatorID = payload.Pusher.ID
+	case webhook_module.HookEventPullRequest:
+		payload, err := run.GetPullRequestEventPayload()
+		if err != nil {
+			return fmt.Errorf("GetPullRequestEventPayload: %w", err)
+		}
+
+		switch {
+		case payload.PullRequest == nil:
+			return fmt.Errorf("pull request is missing in event payload")
+		case payload.PullRequest.Head == nil:
+			return fmt.Errorf("head of pull request is missing in event payload")
+		case payload.PullRequest.Head.Repository == nil:
+			return fmt.Errorf("head repository of pull request is missing in event payload")
+		case payload.PullRequest.Head.Repository.Owner == nil:
+			return fmt.Errorf("owner of head repository of pull request is missing in evnt payload")
+		}
+
+		sha = payload.PullRequest.Head.Sha
+		creatorID = payload.PullRequest.Head.Repository.Owner.ID
+	default:
 		return nil
 	}
 
-	payload, err := run.GetPushEventPayload()
-	if err != nil {
-		return fmt.Errorf("GetPushEventPayload: %w", err)
-	}
-
-	// Since the payload comes from json data, we should check if it's broken, or it will cause panic
-	switch {
-	case payload.Repo == nil:
-		return fmt.Errorf("repo is missing in event payload")
-	case payload.Pusher == nil:
-		return fmt.Errorf("pusher is missing in event payload")
-	case payload.HeadCommit == nil:
-		return fmt.Errorf("head commit is missing in event payload")
-	}
-
-	creator, err := user_model.GetUserByID(ctx, payload.Pusher.ID)
+	repo := run.Repo
+	ctxname := job.Name
+	state := toCommitStatus(job.Status)
+	creator, err := user_model.GetUserByID(ctx, creatorID)
 	if err != nil {
 		return fmt.Errorf("GetUserByID: %w", err)
 	}
-
-	repo := run.Repo
-	sha := payload.HeadCommit.ID
-	ctxname := job.Name
-	state := toCommitStatus(job.Status)
-
 	if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}); err == nil {
 		for _, v := range statuses {
 			if v.Context == ctxname {
@@ -65,14 +90,14 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
 
 	if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{
 		Repo:    repo,
-		SHA:     payload.HeadCommit.ID,
+		SHA:     sha,
 		Creator: creator,
 		CommitStatus: &git_model.CommitStatus{
 			SHA:         sha,
 			TargetURL:   run.Link(),
 			Description: "",
 			Context:     ctxname,
-			CreatorID:   payload.Pusher.ID,
+			CreatorID:   creatorID,
 			State:       state,
 		},
 	}); err != nil {
diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl
index fbf064527d..470869b381 100644
--- a/templates/repo/commit_status.tmpl
+++ b/templates/repo/commit_status.tmpl
@@ -1,6 +1,9 @@
 {{if eq .State "pending"}}
 	{{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}}
 {{end}}
+{{if eq .State "running"}}
+	{{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}}
+{{end}}
 {{if eq .State "success"}}
 	{{svg "octicon-check" 18 "commit-status icon text green"}}
 {{end}}