{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments/218985774","pull_request_review_id":157049132,"id":218985774,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxODk4NTc3NA==","diff_hunk":"@@ -0,0 +1,156 @@\n+# Overview\n+This code coverage tool calculates per file, per package and overall coverage on target directories. It generates the following artifacts\n+  - code coverage profile, which is produced by \"[go test -coverprofile](https://blog.golang.org/cover)\" and contains all block level code coverage data\n+  - xml file that stores file-level and package-level code coverage, formatted to be readable by TestGrid\n+\n+The tool has two major modes of operation, based on whether it is running in post-submit or pre-submit workflow. Post-submit workflow starts when a commit to the base branch happens, e.g. when a pull request is merged. \n+Pre-submit workflow starts when a pull requested is created or updated with new commit.\n+\n+The tool performs the following additional operations when running in pre-submit workflow \n+  - after running code coverage on target directories,  it compares the new result with the one stored by \n+  the post-submit workflow and generate coverage difference. It reports coverage changes to the \n+  pull request as a comment by a robot github account. \n+  - it uses go tools to generate line by line coverage and stores the result in html, \n+  with a link as part of the robot comment mentioned above.\n+  - it can be configured to return with a non-zero status if coverage falls below threshold.\n+\n+## Users\n+The pre-submit mode is intended for a developer to see the impact on code coverage of his/her commit. \n+\n+The post-submit mode, provides input for TestGrid - TestGrid is for repo managers and/or test infra team to monitor code coverage stats over time.\n+\n+## Programming Language Supported\n+The code coverage tool only collect code coverage for Go files\n+\n+\n+# Design of Test Coverage Tool\n+The tool takes input from three sources\n+1. Target directory\n+  - It runs [test coverage profiling](https://blog.golang.org/cover) on target repository. \n+    - target directory can be passed as flags when running the binary. E.g \"--cov-target=./pkg/\"\n+  - .gitattribute file\n+    - it uses git attribute to filter files (see latter section on workflows for details)\n+2. (In pre-submit workflow only) It reads previously stored post-submit code coverage profile from gcs bucket. The profile\n+serves as a base of comparison for presubmit delta coverage.\n+  - The value of following three flags will be used to locate the code coverage profile in GCS bucket,\n+  note that the values are examples and the first two values should be different for your own project\n+    - \"--postsubmit-gcs-bucket=knative-prow\"\n+    - \"--postsubmit-job-name=post-knative-serving-go-coverage\"\n+    - \"--profile-name=coverage_profile.txt\"\n+3. Variables passed through flags. Those variables include directory to run test coverage, file filters and threshold for desired coverage level. Here is a list of these variables. Again, the values to the right of the equality sign are just examples.\n+    - \"--artifacts=$(ARTIFACTS)\"\n+    - \"--cov-target=./pkg/\"\n+    - \"--cov-threshold-percentage=81\"\n+\n+\n+Here is the step-by-step description of the pre-submit and post-submit workflows\n+\n+## Post-submit workflow\n+Produces & stores coverage profile for later presubmit jobs to compare against; \n+Produces per-file and per-package coverage result as input for [TestGrid](https://github.com/kubernetes/test-infra/tree/master/testgrid). Testgrid can use the data produced here to display coverage trend in a tabular or graphical way. \n+\n+1. Generate coverage profile. Completion marker generated upon successful run. Both stored\n+ in artifacts directory.\n+    - Completion marker is used by later pre-submit job when searching for a healthy and complete \n+    code coverage profile in the post-submit jobs\n+    - Successfully generated coverage profile may be used as the basis of comparison for coverage change, \n+    as mentioned in pre-submit workflow\n+2. Read, filter, and summarizes data from coverage profile and store per-file coverage data\n+    - filter based on git attribute to ignore files with the following git attributes\n+      - linguist-generated\n+      - coverage-excluded\n+    - Stores in the XML format, that is used by TestGrid, and dump it in artifacts directory\n+    - The junit_bazel.xml should be a valid junit xml file. See \n+[JUnit XML format](https://www.ibm.com/support/knowledgecenter/en/SSQ2R2_14.1.0/com.ibm.rsar.analysis.codereview.cobol.doc/topics/cac_useresults_junit.html)\n+    - For each file that has a coverage level lower than the threshold, the corresponding entry in the xml should have a \\<failure\\> tag\n+\n+## Pre-submit workflow\n+Runs code coverage tool to report coverage change in a new PR or updated PR\n+\n+1. Generate coverage profile in artifacts directory\n+2. Read, filter, and summarizes data from coverage profile and store per-file coverage data (Same as the corresponding step in post-submit)\n+3. Calculate coverage changes. Compare the coverage file generated in this cycle against the most\n+ recent successful post-submit build. Coverage file for post-submit commits were generated in \n+ post-submit workflow and stored in gcs bucket\n+4. Use PR data from github, git-attributes, as well as coverage change data calculated above, to \n+produce a list of files that we care about in the line-by-line coverage report. produce line by \n+line coverage html and add link to covbot report. Note that covbot is the robot github account \n+used to report code coverage change results. See Covbot section for more details.\n+5. If any file in this commit has a coverage change, let covbot post presubmit coverage on github, under that conversation of the PR. \n+  - The covbot comment should have the following information on each file with a coverage change\n+    - file name\n+    - old coverage (coverage before any change in the PR)\n+    - new coverage (coverage after applied all changes in the PR)\n+    - change the coverage\n+  - After each new posting, any previous posting by covbot should be removed\n+\n+## Locally running presubmit and post-submit workflows\n+Both workflows may be triggered locally in command line, as long as all the required flags are \n+supplied correctly. In addition, the following env var needs to be set:\n+- JOB_TYPE (one of 'presubmit', 'postsubmit', 'local-presubmit')\n+\n+use 'local-presubmit' will run the presubmit workflow without posting result on github PR\n+  \n+## Covbot\n+As mentioned in the presubmit workflow section, covbot is the short name for the robot github \n+account used to report code coverage change results. It can be created as a regular github \n+account - it does not need to be named covbot as that name is already taken on Github. It only need a \n+comment access to the repo it need to be run on. If the repo is private, it also need read access. \n+  \n+After the robot account is created, download the github token and supply the path to the token \n+file to code coverage binary, as the value for parameter \"github-token\"\n+\n+\n+# Usage with prow\n+We pack the test coverage feature in a container, that is triggered to run by a CI/CD system such as prow, in response to Github events such as pulls and merges. The behavior varies in presubmit and postsubmit workflows, which is discussed in latter sections.\n+\n+Prow is a CI/CD system that is tested working well with this Code Coverage tool.   \n+- Prow can be used as the system to handle Github events mentioned in the two workflows. \n+- Prow, in both workflows, supplies the flags & secrets for the binary, clones the repository and uploads logs & artifacts to GCS bucket.\n+\n+  - The pre-submit prow job is triggered by any new commit to a PR. At the end of the binary run, it can return a pass or fail status context to Github. Tide can use that status to block PR with low coverage.\n+\n+  - The post-submit prow job is triggered by merge events to the base branch.\n+\n+## Prow Job Specification\n+Here is an example of a pre-submit prow job spec that runs the coverage tool in a container (the container build file can be found [here](https://github.com/kubernetes/test-infra/blob/a1e910ae6811a1821ad98fa28e6fad03972a8c20/coverage/Makefile)). The args section includes all the arguments for the binary of the tool. ","path":"coverage/docs/design.md","position":116,"original_position":116,"commit_id":"fe6cfd4cd7da344741fe568aad52df21b0e98402","original_commit_id":"fe6cfd4cd7da344741fe568aad52df21b0e98402","user":{"login":"steuhs","id":36011612,"node_id":"MDQ6VXNlcjM2MDExNjEy","avatar_url":"https://avatars1.githubusercontent.com/u/36011612?v=4","gravatar_id":"","url":"https://api.github.com/users/steuhs","html_url":"https://github.com/steuhs","followers_url":"https://api.github.com/users/steuhs/followers","following_url":"https://api.github.com/users/steuhs/following{/other_user}","gists_url":"https://api.github.com/users/steuhs/gists{/gist_id}","starred_url":"https://api.github.com/users/steuhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steuhs/subscriptions","organizations_url":"https://api.github.com/users/steuhs/orgs","repos_url":"https://api.github.com/users/steuhs/repos","events_url":"https://api.github.com/users/steuhs/events{/privacy}","received_events_url":"https://api.github.com/users/steuhs/received_events","type":"User","site_admin":false},"body":"The container image & Makefile are not really part of the code coverage feature either. They are there because prow needs to use them. Does other CI/CD systems also demand the use of container instead of the compiled binary?","created_at":"2018-09-19T22:35:01Z","updated_at":"2018-09-19T22:35:01Z","html_url":"https://github.com/kubernetes/test-infra/pull/9302#discussion_r218985774","pull_request_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments/218985774"},"html":{"href":"https://github.com/kubernetes/test-infra/pull/9302#discussion_r218985774"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302"}},"in_reply_to_id":218947839},"pull_request":{"url":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302","id":214032762,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE0MDMyNzYy","html_url":"https://github.com/kubernetes/test-infra/pull/9302","diff_url":"https://github.com/kubernetes/test-infra/pull/9302.diff","patch_url":"https://github.com/kubernetes/test-infra/pull/9302.patch","issue_url":"https://api.github.com/repos/kubernetes/test-infra/issues/9302","number":9302,"state":"open","locked":false,"title":"design doc for Code Coverage Feature","user":{"login":"steuhs","id":36011612,"node_id":"MDQ6VXNlcjM2MDExNjEy","avatar_url":"https://avatars1.githubusercontent.com/u/36011612?v=4","gravatar_id":"","url":"https://api.github.com/users/steuhs","html_url":"https://github.com/steuhs","followers_url":"https://api.github.com/users/steuhs/followers","following_url":"https://api.github.com/users/steuhs/following{/other_user}","gists_url":"https://api.github.com/users/steuhs/gists{/gist_id}","starred_url":"https://api.github.com/users/steuhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steuhs/subscriptions","organizations_url":"https://api.github.com/users/steuhs/orgs","repos_url":"https://api.github.com/users/steuhs/repos","events_url":"https://api.github.com/users/steuhs/events{/privacy}","received_events_url":"https://api.github.com/users/steuhs/received_events","type":"User","site_admin":false},"body":"Separated the design doc in a standalone PR so that it can be reviewed and merged faster\r\n\r\nhttps://github.com/steuhs/test-infra/blob/design-doc/coverage/docs/design.md\r\nhttps://github.com/steuhs/test-infra/blob/design-doc/coverage/docs/adoption.md","created_at":"2018-09-07T20:33:52Z","updated_at":"2018-09-19T22:35:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c8c0df3baaebfcbe7ea66aa30f67ceb35c6e3dc1","assignee":{"login":"cjwagner","id":5334145,"node_id":"MDQ6VXNlcjUzMzQxNDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5334145?v=4","gravatar_id":"","url":"https://api.github.com/users/cjwagner","html_url":"https://github.com/cjwagner","followers_url":"https://api.github.com/users/cjwagner/followers","following_url":"https://api.github.com/users/cjwagner/following{/other_user}","gists_url":"https://api.github.com/users/cjwagner/gists{/gist_id}","starred_url":"https://api.github.com/users/cjwagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjwagner/subscriptions","organizations_url":"https://api.github.com/users/cjwagner/orgs","repos_url":"https://api.github.com/users/cjwagner/repos","events_url":"https://api.github.com/users/cjwagner/events{/privacy}","received_events_url":"https://api.github.com/users/cjwagner/received_events","type":"User","site_admin":false},"assignees":[{"login":"Katharine","id":110792,"node_id":"MDQ6VXNlcjExMDc5Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/110792?v=4","gravatar_id":"","url":"https://api.github.com/users/Katharine","html_url":"https://github.com/Katharine","followers_url":"https://api.github.com/users/Katharine/followers","following_url":"https://api.github.com/users/Katharine/following{/other_user}","gists_url":"https://api.github.com/users/Katharine/gists{/gist_id}","starred_url":"https://api.github.com/users/Katharine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Katharine/subscriptions","organizations_url":"https://api.github.com/users/Katharine/orgs","repos_url":"https://api.github.com/users/Katharine/repos","events_url":"https://api.github.com/users/Katharine/events{/privacy}","received_events_url":"https://api.github.com/users/Katharine/received_events","type":"User","site_admin":false},{"login":"cjwagner","id":5334145,"node_id":"MDQ6VXNlcjUzMzQxNDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5334145?v=4","gravatar_id":"","url":"https://api.github.com/users/cjwagner","html_url":"https://github.com/cjwagner","followers_url":"https://api.github.com/users/cjwagner/followers","following_url":"https://api.github.com/users/cjwagner/following{/other_user}","gists_url":"https://api.github.com/users/cjwagner/gists{/gist_id}","starred_url":"https://api.github.com/users/cjwagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjwagner/subscriptions","organizations_url":"https://api.github.com/users/cjwagner/orgs","repos_url":"https://api.github.com/users/cjwagner/repos","events_url":"https://api.github.com/users/cjwagner/events{/privacy}","received_events_url":"https://api.github.com/users/cjwagner/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"michelle192837","id":652853,"node_id":"MDQ6VXNlcjY1Mjg1Mw==","avatar_url":"https://avatars2.githubusercontent.com/u/652853?v=4","gravatar_id":"","url":"https://api.github.com/users/michelle192837","html_url":"https://github.com/michelle192837","followers_url":"https://api.github.com/users/michelle192837/followers","following_url":"https://api.github.com/users/michelle192837/following{/other_user}","gists_url":"https://api.github.com/users/michelle192837/gists{/gist_id}","starred_url":"https://api.github.com/users/michelle192837/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michelle192837/subscriptions","organizations_url":"https://api.github.com/users/michelle192837/orgs","repos_url":"https://api.github.com/users/michelle192837/repos","events_url":"https://api.github.com/users/michelle192837/events{/privacy}","received_events_url":"https://api.github.com/users/michelle192837/received_events","type":"User","site_admin":false},{"login":"krzyzacy","id":1108148,"node_id":"MDQ6VXNlcjExMDgxNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1108148?v=4","gravatar_id":"","url":"https://api.github.com/users/krzyzacy","html_url":"https://github.com/krzyzacy","followers_url":"https://api.github.com/users/krzyzacy/followers","following_url":"https://api.github.com/users/krzyzacy/following{/other_user}","gists_url":"https://api.github.com/users/krzyzacy/gists{/gist_id}","starred_url":"https://api.github.com/users/krzyzacy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krzyzacy/subscriptions","organizations_url":"https://api.github.com/users/krzyzacy/orgs","repos_url":"https://api.github.com/users/krzyzacy/repos","events_url":"https://api.github.com/users/krzyzacy/events{/privacy}","received_events_url":"https://api.github.com/users/krzyzacy/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":484580953,"node_id":"MDU6TGFiZWw0ODQ1ODA5NTM=","url":"https://api.github.com/repos/kubernetes/test-infra/labels/cncf-cla:%20yes","name":"cncf-cla: yes","color":"bfe5bf","default":false},{"id":671133125,"node_id":"MDU6TGFiZWw2NzExMzMxMjU=","url":"https://api.github.com/repos/kubernetes/test-infra/labels/size/L","name":"size/L","color":"ee9900","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302/commits","review_comments_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302/comments","review_comment_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/test-infra/issues/9302/comments","statuses_url":"https://api.github.com/repos/kubernetes/test-infra/statuses/fe6cfd4cd7da344741fe568aad52df21b0e98402","head":{"label":"steuhs:design-doc","ref":"design-doc","sha":"fe6cfd4cd7da344741fe568aad52df21b0e98402","user":{"login":"steuhs","id":36011612,"node_id":"MDQ6VXNlcjM2MDExNjEy","avatar_url":"https://avatars1.githubusercontent.com/u/36011612?v=4","gravatar_id":"","url":"https://api.github.com/users/steuhs","html_url":"https://github.com/steuhs","followers_url":"https://api.github.com/users/steuhs/followers","following_url":"https://api.github.com/users/steuhs/following{/other_user}","gists_url":"https://api.github.com/users/steuhs/gists{/gist_id}","starred_url":"https://api.github.com/users/steuhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steuhs/subscriptions","organizations_url":"https://api.github.com/users/steuhs/orgs","repos_url":"https://api.github.com/users/steuhs/repos","events_url":"https://api.github.com/users/steuhs/events{/privacy}","received_events_url":"https://api.github.com/users/steuhs/received_events","type":"User","site_admin":false},"repo":{"id":121583722,"node_id":"MDEwOlJlcG9zaXRvcnkxMjE1ODM3MjI=","name":"test-infra","full_name":"steuhs/test-infra","private":false,"owner":{"login":"steuhs","id":36011612,"node_id":"MDQ6VXNlcjM2MDExNjEy","avatar_url":"https://avatars1.githubusercontent.com/u/36011612?v=4","gravatar_id":"","url":"https://api.github.com/users/steuhs","html_url":"https://github.com/steuhs","followers_url":"https://api.github.com/users/steuhs/followers","following_url":"https://api.github.com/users/steuhs/following{/other_user}","gists_url":"https://api.github.com/users/steuhs/gists{/gist_id}","starred_url":"https://api.github.com/users/steuhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steuhs/subscriptions","organizations_url":"https://api.github.com/users/steuhs/orgs","repos_url":"https://api.github.com/users/steuhs/repos","events_url":"https://api.github.com/users/steuhs/events{/privacy}","received_events_url":"https://api.github.com/users/steuhs/received_events","type":"User","site_admin":false},"html_url":"https://github.com/steuhs/test-infra","description":"Test infrastructure for the Kubernetes project.","fork":true,"url":"https://api.github.com/repos/steuhs/test-infra","forks_url":"https://api.github.com/repos/steuhs/test-infra/forks","keys_url":"https://api.github.com/repos/steuhs/test-infra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/steuhs/test-infra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/steuhs/test-infra/teams","hooks_url":"https://api.github.com/repos/steuhs/test-infra/hooks","issue_events_url":"https://api.github.com/repos/steuhs/test-infra/issues/events{/number}","events_url":"https://api.github.com/repos/steuhs/test-infra/events","assignees_url":"https://api.github.com/repos/steuhs/test-infra/assignees{/user}","branches_url":"https://api.github.com/repos/steuhs/test-infra/branches{/branch}","tags_url":"https://api.github.com/repos/steuhs/test-infra/tags","blobs_url":"https://api.github.com/repos/steuhs/test-infra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/steuhs/test-infra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/steuhs/test-infra/git/refs{/sha}","trees_url":"https://api.github.com/repos/steuhs/test-infra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/steuhs/test-infra/statuses/{sha}","languages_url":"https://api.github.com/repos/steuhs/test-infra/languages","stargazers_url":"https://api.github.com/repos/steuhs/test-infra/stargazers","contributors_url":"https://api.github.com/repos/steuhs/test-infra/contributors","subscribers_url":"https://api.github.com/repos/steuhs/test-infra/subscribers","subscription_url":"https://api.github.com/repos/steuhs/test-infra/subscription","commits_url":"https://api.github.com/repos/steuhs/test-infra/commits{/sha}","git_commits_url":"https://api.github.com/repos/steuhs/test-infra/git/commits{/sha}","comments_url":"https://api.github.com/repos/steuhs/test-infra/comments{/number}","issue_comment_url":"https://api.github.com/repos/steuhs/test-infra/issues/comments{/number}","contents_url":"https://api.github.com/repos/steuhs/test-infra/contents/{+path}","compare_url":"https://api.github.com/repos/steuhs/test-infra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/steuhs/test-infra/merges","archive_url":"https://api.github.com/repos/steuhs/test-infra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/steuhs/test-infra/downloads","issues_url":"https://api.github.com/repos/steuhs/test-infra/issues{/number}","pulls_url":"https://api.github.com/repos/steuhs/test-infra/pulls{/number}","milestones_url":"https://api.github.com/repos/steuhs/test-infra/milestones{/number}","notifications_url":"https://api.github.com/repos/steuhs/test-infra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/steuhs/test-infra/labels{/name}","releases_url":"https://api.github.com/repos/steuhs/test-infra/releases{/id}","deployments_url":"https://api.github.com/repos/steuhs/test-infra/deployments","created_at":"2018-02-15T02:21:25Z","updated_at":"2018-08-21T00:33:12Z","pushed_at":"2018-09-19T18:25:34Z","git_url":"git://github.com/steuhs/test-infra.git","ssh_url":"git@github.com:steuhs/test-infra.git","clone_url":"https://github.com/steuhs/test-infra.git","svn_url":"https://github.com/steuhs/test-infra","homepage":null,"size":60045,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"7b918216d59e44ae7883e97ee13b52198df229ea","user":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":57333709,"node_id":"MDEwOlJlcG9zaXRvcnk1NzMzMzcwOQ==","name":"test-infra","full_name":"kubernetes/test-infra","private":false,"owner":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/kubernetes/test-infra","description":"Test infrastructure for the Kubernetes project.","fork":false,"url":"https://api.github.com/repos/kubernetes/test-infra","forks_url":"https://api.github.com/repos/kubernetes/test-infra/forks","keys_url":"https://api.github.com/repos/kubernetes/test-infra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/test-infra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/test-infra/teams","hooks_url":"https://api.github.com/repos/kubernetes/test-infra/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/test-infra/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/test-infra/events","assignees_url":"https://api.github.com/repos/kubernetes/test-infra/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/test-infra/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/test-infra/tags","blobs_url":"https://api.github.com/repos/kubernetes/test-infra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/test-infra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/test-infra/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/test-infra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/test-infra/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/test-infra/languages","stargazers_url":"https://api.github.com/repos/kubernetes/test-infra/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/test-infra/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/test-infra/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/test-infra/subscription","commits_url":"https://api.github.com/repos/kubernetes/test-infra/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/test-infra/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/test-infra/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/test-infra/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/test-infra/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/test-infra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/test-infra/merges","archive_url":"https://api.github.com/repos/kubernetes/test-infra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/test-infra/downloads","issues_url":"https://api.github.com/repos/kubernetes/test-infra/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/test-infra/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/test-infra/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/test-infra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/test-infra/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/test-infra/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/test-infra/deployments","created_at":"2016-04-28T21:05:35Z","updated_at":"2018-09-19T22:18:32Z","pushed_at":"2018-09-19T22:33:17Z","git_url":"git://github.com/kubernetes/test-infra.git","ssh_url":"git@github.com:kubernetes/test-infra.git","clone_url":"https://github.com/kubernetes/test-infra.git","svn_url":"https://github.com/kubernetes/test-infra","homepage":null,"size":62053,"stargazers_count":612,"watchers_count":612,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":559,"mirror_url":null,"archived":false,"open_issues_count":362,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":559,"open_issues":362,"watchers":612,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302"},"html":{"href":"https://github.com/kubernetes/test-infra/pull/9302"},"issue":{"href":"https://api.github.com/repos/kubernetes/test-infra/issues/9302"},"comments":{"href":"https://api.github.com/repos/kubernetes/test-infra/issues/9302/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/9302/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/test-infra/statuses/fe6cfd4cd7da344741fe568aad52df21b0e98402"}},"author_association":"NONE"}}
{"actor":{"display_login":"steuhs"}}