{"action":"created","comment":{"url":"https://api.github.com/repos/flutter/website/pulls/comments/188472610","pull_request_review_id":120458101,"id":188472610,"diff_hunk":"@@ -0,0 +1,170 @@\n+---\n+layout: page\n+title: Continuous Delivery using Fastlane with Flutter\n+\n+permalink: /fastlane-cd/\n+---\n+\n+It's possible to follow continuous delivery best practices on top of existing\n+testing to make sure your application is delivered to your beta testers and\n+validated on a frequent basis without resorting to manual workflows.\n+\n+In this example, the open-source tool suite [Fastlane](https://docs.fastlane.tools/)\n+is leveraged for its ability to seamlessly integrate with platform resources\n+like the Play Store and the App Store.\n+\n+* TOC Placeholder\n+{:toc}\n+\n+## Local setup\n+\n+Follow these steps while testing the build and deployment process before\n+migrating to a cloud-based system or if you will ultimately perform the\n+continuous delivery from a local machine.\n+\n+1. Install Fastlane `gem install fastlane` or `brew cask install fastlane`.\n+1. Create your Flutter project and when ready, make sure that your project builds via\n+    * ![Android](/images/fastlane-cd/android.png) `flutter build apk --release`; and\n+    * ![iOS](/images/fastlane-cd/ios.png) `flutter build ios --release --no-codesign`.\n+1. Initialize the Fastlane projects for each platform.\n+    * ![Android](/images/fastlane-cd/android.png) In your `[project]/android`\n+    directory, run `fastlane init`.\n+    * ![iOS](/images/fastlane-cd/ios.png) In your `[project]/ios` directory,\n+    run `fastlane init`.\n+1. Edit the `Appfile`s to ensure it has adequate matadata for your app.\n+    * ![Android](/images/fastlane-cd/android.png) Ensure `package_name` in\n+    `[project]/android/Appfile` matches your package in pubspec.yaml.\n+    * ![iOS](/images/fastlane-cd/ios.png) Ensure `app_identifier` in\n+    `[project]/ios/Appfile` also matches. Also fill in `apple_id`, `itc_team_id`,\n+    `team_id` with your respective account info.\n+1. Set up your local login credentials for the stores.\n+    * ![Android](/images/fastlane-cd/android.png) Follow the [Supply setup steps](https://docs.fastlane.tools/getting-started/android/setup/#setting-up-supply)\n+    and ensure that `fastlane supply init` can successfully sync data from your\n+    Play Store console. _Treat the .json file like your password and do not check\n+    it into any public source control repositories._\n+    * ![iOS](/images/fastlane-cd/ios.png) Your iTunes Connect username is already\n+    in your `Appfile`'s `apple_id` field. You can set `FASTLANE_PASSWORD` shell\n+    environment variable with your iTunes Connect password. Otherwise, you'll be\n+    prompted whe uploading to iTunes/TestFlight.\n+1. Set up code signing.\n+    * ![Android](/images/fastlane-cd/android.png) On Android, there are 2 signing\n+    keys. The 'deployment key' is used to sign the .apk end-users ultimately\n+    download. An 'upload key' is used to authenticate the .apk uploaded by\n+    developers onto the Play Store and is re-signed over with the deployment key\n+    once in the Play Store.\n+        * It's highly recommended to use the automatic cloud managed signing for\n+        the deployment key. See details at from the [official Play Store documentation](https://support.google.com/googleplay/android-developer/answer/7384423?hl=en).\n+        * Follow the [key generation steps](https://developer.android.com/studio/publish/app-signing#sign-apk)\n+        to create your upload key.\n+        * Configure gradle to use your upload key when building your app in\n+        release mode by editing `android.buildTypes.release` in\n+        `[project]/android/app/build.gradle`.\n+    * ![iOS](/images/fastlane-cd/ios.png) On iOS, you need to create and sign\n+    using a distribution certificate instead of a development certification when\n+    you're ready to test and deploy using TestFlight or App Store.\n+        * Create and download a distribution certificate in your [Apple Developer Account console](https://developer.apple.com/account/ios/certificate/).\n+        * `open [project]/ios/Runner.xcworkspace/` and select the distribution\n+        certificate in your target's settings pane.\n+1. Create a `Fastfile` script for each platform.\n+    * ![Android](/images/fastlane-cd/android.png) On Android, follow the\n+    [Fastlane Android beta deployment guide](https://docs.fastlane.tools/getting-started/android/beta-deployment/).\n+    It could be as simple as a `lane` that calls `upload_to_play_store`. The\n+    `apk` argument can be set to `../build/app/outputs/apk/release/app-release.apk`\n+    to use the apk `flutter build` already built.\n+    * ![iOS](/images/fastlane-cd/ios.png) On iOS, follow the [Fastlane iOS beta deployment guide](https://docs.fastlane.tools/getting-started/ios/beta-deployment/).\n+    It could be as simple as a `lane` that calls `build_ios_app` with\n+    `export_method: 'app-store'` and `upload_to_testflight`. An extra build is\n+    used after `flutter build` on iOS since `flutter build` builds and .app and\n+    doesn't archive .ipas for release.\n+\n+You're now ready to perform deployments locally or migrate the deployment\n+process to a CI system.\n+\n+## Running deployment locally\n+\n+1. Build the release mode app.\n+    * ![Android](/images/fastlane-cd/android.png) `flutter build apk --release`.\n+    * ![iOS](/images/fastlane-cd/ios.png) `flutter build ios --release --no-codesign`.\n+    No need to sign now since we'll archive using Fastlane which will sign at that point.\n+1. Run the Fastfile script on each platform.\n+    * ![Android](/images/fastlane-cd/android.png) `cd android` then\n+    `fastlane [name of the lane you created]`.\n+    * ![iOS](/images/fastlane-cd/ios.png) `cd ios` then\n+    `fastlane [name of the lane you created]`.\n+\n+## Cloud build and deploy setup\n+\n+Follow the local setup section above first to make sure the process works before\n+migrating onto a cloud system like Travis.\n+\n+The main aspects to consider is that since cloud instances are ephemeral and\n+untrusted, you won't be leaving your credentials like your Play Store service\n+account JSON or your iTunes distribution certificate on the server.\n+\n+Both [Travis](https://docs.travis-ci.com/user/environment-variables/#Encrypting-environment-variables)\n+and [Cirrus](https://cirrus-ci.org/guide/writing-tasks/#encrypted-variables)\n+(randomly chosen examples, you can use any CI systems you wish) support the\n+concept of encrypted environment variables to store private data.\n+\n+**Take precaution to not re-echo those variable values back onto the console in\n+your test scripts**. Those variables are also not available in pull requests\n+until they're merged to ensure that malicious actors cannot create a pull\n+request that prints these secrets out. Be careful with interactions with these\n+secrets in pull requests you accept and merge.\n+\n+1. Make login credentials ephemeral.\n+    * ![Android](/images/fastlane-cd/android.png) On Android:\n+        * Remove the `json_key_file` field from `Appfile` and store the string\n+        content of the JSON in your CI system's encrypted variable. Use the\n+        `json_key_data` argument in `upload_to_play_store` to read the\n+        environment variable directly in your `Fastfile`.\n+        * Serialize your upload key such as with base64 and save as a encrypted\n+        environment variable. You can deserialize it on your CI system during the\n+        install phase with\n+        ```bash\n+        echo \"$PLAY_STORE_UPLOAD_KEY\" | base64 --decode > /home/travis/[directory and filename specified in your gradle].keystore\n+        ```\n+    * ![iOS](/images/fastlane-cd/ios.png) On iOS:\n+        * Move the `FASTLANE_PASSWORD` variable to use encrypted environment variables.\n+        * The CI system needs access to your distribution certificate. Fastlane's\n+        [Match](https://docs.fastlane.tools/actions/match/) system is\n+        recommended to synchronize your certificates across machines.\n+\n+2. It's recommended to use a Gemfile instead of using an indeterministic `gem\n+install fastlane` on the CI system each time to ensure the Fastlane\n+dependencies are stable and reproducible between local and cloud machines.\n+    * In both your `[project]/android` and `[project]/ios` folders, create a\n+    `Gemfile` and as content, add\n+      ```\n+      source \"https://rubygems.org\"\n+\n+      gem \"fastlane\"\n+      ```\n+    * In both directories, run `bundle update` and check in both `Gemfile` and\n+    `Gemfile.lock` into source control.\n+    * When running locally, use `bundle exec fastlane` instead of `fastlane`.\n+\n+3. Create the CI test script such `.travis.yml` or `.cirrus.yml` in your\n+repository root.\n+    * Shard your script to run on both Linux and OSX platforms.\n+    * Be sure to specify a dependency on Xcode for OSX such as with\n+    `osx_image: xcode9.2`.\n+    * See [Fastlane CI documentation](https://docs.fastlane.tools/best-practices/continuous-integration/)\n+    for CI specific setup.\n+    * During the setup phase, depending on the platform, make sure:\n+         * Bundler is available via `gem install bundler`.\n+         * For Android, make sure the Android SDK is available and `ANDROID_HOME`","path":"fastlane.md","position":null,"original_position":156,"commit_id":"ba52eadf4b56292921eb0e1e2edabf5146971acb","original_commit_id":"8ec6d00df26efa686f4ab884df233f027d2f46c1","user":{"login":"xster","id":156888,"avatar_url":"https://avatars2.githubusercontent.com/u/156888?v=4","gravatar_id":"","url":"https://api.github.com/users/xster","html_url":"https://github.com/xster","followers_url":"https://api.github.com/users/xster/followers","following_url":"https://api.github.com/users/xster/following{/other_user}","gists_url":"https://api.github.com/users/xster/gists{/gist_id}","starred_url":"https://api.github.com/users/xster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xster/subscriptions","organizations_url":"https://api.github.com/users/xster/orgs","repos_url":"https://api.github.com/users/xster/repos","events_url":"https://api.github.com/users/xster/events{/privacy}","received_events_url":"https://api.github.com/users/xster/received_events","type":"User","site_admin":false},"body":"done","created_at":"2018-05-16T00:14:30Z","updated_at":"2018-05-16T00:14:30Z","html_url":"https://github.com/flutter/website/pull/1026#discussion_r188472610","pull_request_url":"https://api.github.com/repos/flutter/website/pulls/1026","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/flutter/website/pulls/comments/188472610"},"html":{"href":"https://github.com/flutter/website/pull/1026#discussion_r188472610"},"pull_request":{"href":"https://api.github.com/repos/flutter/website/pulls/1026"}},"in_reply_to_id":188407843},"pull_request":{"url":"https://api.github.com/repos/flutter/website/pulls/1026","id":187941838,"html_url":"https://github.com/flutter/website/pull/1026","diff_url":"https://github.com/flutter/website/pull/1026.diff","patch_url":"https://github.com/flutter/website/pull/1026.patch","issue_url":"https://api.github.com/repos/flutter/website/issues/1026","number":1026,"state":"open","locked":false,"title":"Add a doc for using Fastlane","user":{"login":"xster","id":156888,"avatar_url":"https://avatars2.githubusercontent.com/u/156888?v=4","gravatar_id":"","url":"https://api.github.com/users/xster","html_url":"https://github.com/xster","followers_url":"https://api.github.com/users/xster/followers","following_url":"https://api.github.com/users/xster/following{/other_user}","gists_url":"https://api.github.com/users/xster/gists{/gist_id}","starred_url":"https://api.github.com/users/xster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xster/subscriptions","organizations_url":"https://api.github.com/users/xster/orgs","repos_url":"https://api.github.com/users/xster/repos","events_url":"https://api.github.com/users/xster/events{/privacy}","received_events_url":"https://api.github.com/users/xster/received_events","type":"User","site_admin":false},"body":"https://github.com/flutter/flutter/issues/15582","created_at":"2018-05-14T20:29:34Z","updated_at":"2018-05-16T00:14:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"db62664cf8326c659c8d2ef02559c1cb4437aa98","assignee":null,"assignees":[],"requested_reviewers":[{"login":"cbracken","id":351029,"avatar_url":"https://avatars3.githubusercontent.com/u/351029?v=4","gravatar_id":"","url":"https://api.github.com/users/cbracken","html_url":"https://github.com/cbracken","followers_url":"https://api.github.com/users/cbracken/followers","following_url":"https://api.github.com/users/cbracken/following{/other_user}","gists_url":"https://api.github.com/users/cbracken/gists{/gist_id}","starred_url":"https://api.github.com/users/cbracken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbracken/subscriptions","organizations_url":"https://api.github.com/users/cbracken/orgs","repos_url":"https://api.github.com/users/cbracken/repos","events_url":"https://api.github.com/users/cbracken/events{/privacy}","received_events_url":"https://api.github.com/users/cbracken/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":487495822,"url":"https://api.github.com/repos/flutter/website/labels/cla:%20yes","name":"cla: yes","color":"0e8a16","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/flutter/website/pulls/1026/commits","review_comments_url":"https://api.github.com/repos/flutter/website/pulls/1026/comments","review_comment_url":"https://api.github.com/repos/flutter/website/pulls/comments{/number}","comments_url":"https://api.github.com/repos/flutter/website/issues/1026/comments","statuses_url":"https://api.github.com/repos/flutter/website/statuses/ba52eadf4b56292921eb0e1e2edabf5146971acb","head":{"label":"xster:fastlane","ref":"fastlane","sha":"ba52eadf4b56292921eb0e1e2edabf5146971acb","user":{"login":"xster","id":156888,"avatar_url":"https://avatars2.githubusercontent.com/u/156888?v=4","gravatar_id":"","url":"https://api.github.com/users/xster","html_url":"https://github.com/xster","followers_url":"https://api.github.com/users/xster/followers","following_url":"https://api.github.com/users/xster/following{/other_user}","gists_url":"https://api.github.com/users/xster/gists{/gist_id}","starred_url":"https://api.github.com/users/xster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xster/subscriptions","organizations_url":"https://api.github.com/users/xster/orgs","repos_url":"https://api.github.com/users/xster/repos","events_url":"https://api.github.com/users/xster/events{/privacy}","received_events_url":"https://api.github.com/users/xster/received_events","type":"User","site_admin":false},"repo":{"id":91503101,"name":"website","full_name":"xster/website","owner":{"login":"xster","id":156888,"avatar_url":"https://avatars2.githubusercontent.com/u/156888?v=4","gravatar_id":"","url":"https://api.github.com/users/xster","html_url":"https://github.com/xster","followers_url":"https://api.github.com/users/xster/followers","following_url":"https://api.github.com/users/xster/following{/other_user}","gists_url":"https://api.github.com/users/xster/gists{/gist_id}","starred_url":"https://api.github.com/users/xster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xster/subscriptions","organizations_url":"https://api.github.com/users/xster/orgs","repos_url":"https://api.github.com/users/xster/repos","events_url":"https://api.github.com/users/xster/events{/privacy}","received_events_url":"https://api.github.com/users/xster/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xster/website","description":"Flutter web site","fork":true,"url":"https://api.github.com/repos/xster/website","forks_url":"https://api.github.com/repos/xster/website/forks","keys_url":"https://api.github.com/repos/xster/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xster/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xster/website/teams","hooks_url":"https://api.github.com/repos/xster/website/hooks","issue_events_url":"https://api.github.com/repos/xster/website/issues/events{/number}","events_url":"https://api.github.com/repos/xster/website/events","assignees_url":"https://api.github.com/repos/xster/website/assignees{/user}","branches_url":"https://api.github.com/repos/xster/website/branches{/branch}","tags_url":"https://api.github.com/repos/xster/website/tags","blobs_url":"https://api.github.com/repos/xster/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xster/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xster/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/xster/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xster/website/statuses/{sha}","languages_url":"https://api.github.com/repos/xster/website/languages","stargazers_url":"https://api.github.com/repos/xster/website/stargazers","contributors_url":"https://api.github.com/repos/xster/website/contributors","subscribers_url":"https://api.github.com/repos/xster/website/subscribers","subscription_url":"https://api.github.com/repos/xster/website/subscription","commits_url":"https://api.github.com/repos/xster/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/xster/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/xster/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/xster/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/xster/website/contents/{+path}","compare_url":"https://api.github.com/repos/xster/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xster/website/merges","archive_url":"https://api.github.com/repos/xster/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xster/website/downloads","issues_url":"https://api.github.com/repos/xster/website/issues{/number}","pulls_url":"https://api.github.com/repos/xster/website/pulls{/number}","milestones_url":"https://api.github.com/repos/xster/website/milestones{/number}","notifications_url":"https://api.github.com/repos/xster/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xster/website/labels{/name}","releases_url":"https://api.github.com/repos/xster/website/releases{/id}","deployments_url":"https://api.github.com/repos/xster/website/deployments","created_at":"2017-05-16T20:48:13Z","updated_at":"2018-03-21T22:59:11Z","pushed_at":"2018-05-16T00:13:22Z","git_url":"git://github.com/xster/website.git","ssh_url":"git@github.com:xster/website.git","clone_url":"https://github.com/xster/website.git","svn_url":"https://github.com/xster/website","homepage":"https://flutter.io","size":72902,"stargazers_count":0,"watchers_count":0,"language":"CSS","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":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"flutter:master","ref":"master","sha":"8b34965feac2237c9bf294386e23a33784ecf650","user":{"login":"flutter","id":14101776,"avatar_url":"https://avatars3.githubusercontent.com/u/14101776?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter","html_url":"https://github.com/flutter","followers_url":"https://api.github.com/users/flutter/followers","following_url":"https://api.github.com/users/flutter/following{/other_user}","gists_url":"https://api.github.com/users/flutter/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter/subscriptions","organizations_url":"https://api.github.com/users/flutter/orgs","repos_url":"https://api.github.com/users/flutter/repos","events_url":"https://api.github.com/users/flutter/events{/privacy}","received_events_url":"https://api.github.com/users/flutter/received_events","type":"Organization","site_admin":false},"repo":{"id":41847366,"name":"website","full_name":"flutter/website","owner":{"login":"flutter","id":14101776,"avatar_url":"https://avatars3.githubusercontent.com/u/14101776?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter","html_url":"https://github.com/flutter","followers_url":"https://api.github.com/users/flutter/followers","following_url":"https://api.github.com/users/flutter/following{/other_user}","gists_url":"https://api.github.com/users/flutter/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter/subscriptions","organizations_url":"https://api.github.com/users/flutter/orgs","repos_url":"https://api.github.com/users/flutter/repos","events_url":"https://api.github.com/users/flutter/events{/privacy}","received_events_url":"https://api.github.com/users/flutter/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/flutter/website","description":"Flutter web site","fork":false,"url":"https://api.github.com/repos/flutter/website","forks_url":"https://api.github.com/repos/flutter/website/forks","keys_url":"https://api.github.com/repos/flutter/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/flutter/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/flutter/website/teams","hooks_url":"https://api.github.com/repos/flutter/website/hooks","issue_events_url":"https://api.github.com/repos/flutter/website/issues/events{/number}","events_url":"https://api.github.com/repos/flutter/website/events","assignees_url":"https://api.github.com/repos/flutter/website/assignees{/user}","branches_url":"https://api.github.com/repos/flutter/website/branches{/branch}","tags_url":"https://api.github.com/repos/flutter/website/tags","blobs_url":"https://api.github.com/repos/flutter/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/flutter/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/flutter/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/flutter/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/flutter/website/statuses/{sha}","languages_url":"https://api.github.com/repos/flutter/website/languages","stargazers_url":"https://api.github.com/repos/flutter/website/stargazers","contributors_url":"https://api.github.com/repos/flutter/website/contributors","subscribers_url":"https://api.github.com/repos/flutter/website/subscribers","subscription_url":"https://api.github.com/repos/flutter/website/subscription","commits_url":"https://api.github.com/repos/flutter/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/flutter/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/flutter/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/flutter/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/flutter/website/contents/{+path}","compare_url":"https://api.github.com/repos/flutter/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/flutter/website/merges","archive_url":"https://api.github.com/repos/flutter/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/flutter/website/downloads","issues_url":"https://api.github.com/repos/flutter/website/issues{/number}","pulls_url":"https://api.github.com/repos/flutter/website/pulls{/number}","milestones_url":"https://api.github.com/repos/flutter/website/milestones{/number}","notifications_url":"https://api.github.com/repos/flutter/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/flutter/website/labels{/name}","releases_url":"https://api.github.com/repos/flutter/website/releases{/id}","deployments_url":"https://api.github.com/repos/flutter/website/deployments","created_at":"2015-09-03T07:30:01Z","updated_at":"2018-05-15T17:18:30Z","pushed_at":"2018-05-16T00:13:24Z","git_url":"git://github.com/flutter/website.git","ssh_url":"git@github.com:flutter/website.git","clone_url":"https://github.com/flutter/website.git","svn_url":"https://github.com/flutter/website","homepage":"https://flutter.io","size":72779,"stargazers_count":140,"watchers_count":140,"language":"CSS","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":302,"mirror_url":null,"archived":false,"open_issues_count":25,"license":null,"forks":302,"open_issues":25,"watchers":140,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/flutter/website/pulls/1026"},"html":{"href":"https://github.com/flutter/website/pull/1026"},"issue":{"href":"https://api.github.com/repos/flutter/website/issues/1026"},"comments":{"href":"https://api.github.com/repos/flutter/website/issues/1026/comments"},"review_comments":{"href":"https://api.github.com/repos/flutter/website/pulls/1026/comments"},"review_comment":{"href":"https://api.github.com/repos/flutter/website/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/flutter/website/pulls/1026/commits"},"statuses":{"href":"https://api.github.com/repos/flutter/website/statuses/ba52eadf4b56292921eb0e1e2edabf5146971acb"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"xster"}}