danger-js icon indicating copy to clipboard operation
danger-js copied to clipboard

Github Action fails when PR comes from forked repo

Open sobolevn opened this issue 6 years ago • 22 comments

Problem

Danger crashes when I accept a PR from the fork: https://github.com/sobolevn/itmo-2019/pull/18/checks?check_run_id=222332195

But, works well when I create PRs inside the repo: https://github.com/sobolevn/itmo-2019/pulls?q=is%3Apr+is%3Aclosed (just an example).

My configuration:

name: comments

on: [pull_request]

jobs:
  danger:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@master
    - name: Danger JS Action
      uses: danger/[email protected]
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Link: https://github.com/sobolevn/itmo-2019/blob/master/.github/workflows/review.yml

Output

 Danger JS Action5s
##[error]Docker run failed with exit code 1
Run danger/[email protected]
  env:
    GITHUB_TOKEN: ***
/usr/bin/docker run --name df7dcddf0fc01b57b4276b942607159610154_53cda2 --label 0df7dc --workdir /github/workspace --rm -e GITHUB_TOKEN -e HOME -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e RUNNER_OS -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/itmo-2019/itmo-2019":"/github/workspace" 0df7dc:ddf0fc01b57b4276b942607159610154

Failing the build, there is 1 fail.
Request failed [403]: https://api.github.com/repos/sobolevn/itmo-2019/issues/18/comments
Response: {
  "message": "Resource not accessible by integration",
  "documentation_url": "https://developer.github.com/v3/issues/comments/#create-a-comment"
}
Feedback: undefined
##[error]Docker run failed with exit code 1

Image (in case output it is easier to read):

Снимок экрана 2019-09-14 в 22 11 00

Possible reason

I guess that this is possibly related with how GITHUB_TOKEN works for forked repos: https://help.github.com/en/articles/virtual-environments-for-github-actions#github_token-secret

Снимок экрана 2019-09-14 в 22 12 13

And I have no ideas, how to fix it. [Official docs] do not say much about this problem: https://danger.systems/js/guides/getting_started.html#setting-up-danger-to-run-on-your-ci Moreover, I cannot find any other real-world usage of danger-js as an action. So, I cannot verify that it also happens to other users as well.

Any ideas where to look?

sobolevn avatar Sep 14 '19 19:09 sobolevn

Update: something happened and the next push was successful:

/usr/bin/docker run --name df7dc6a609fa1e95f49a1a8cfbf0ea53375c7_04d9b2 --label 0df7dc --workdir /github/workspace --rm -e GITHUB_TOKEN -e HOME -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e RUNNER_OS -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/itmo-2019/itmo-2019":"/github/workspace" 0df7dc:6a609fa1e95f49a1a8cfbf0ea53375c7

Found no issues or messages from Danger. Removing any existing messages on GitHub.

Link: https://github.com/sobolevn/itmo-2019/pull/19/checks?check_run_id=222337878

sobolevn avatar Sep 14 '19 19:09 sobolevn

This happened again: https://github.com/sobolevn/itmo-2019/pull/24/checks?check_run_id=222778615

sobolevn avatar Sep 15 '19 13:09 sobolevn

I've heard reports of issues when the other person doesn't have access to GitHub Actions yet, could be that?

orta avatar Sep 16 '19 12:09 orta

Yes, that's correct. These users don't have an access yet.

sobolevn avatar Sep 16 '19 12:09 sobolevn

a solution here might be to report the status using the github actions tooling when running in a github action (there is an env var to detect that) instead of submitting a comment and a commit status. This way, the github API would be used only in read-only mode.

stof avatar Oct 18 '19 09:10 stof

Good point, Danger supports both the checks api and the comment API - but it looks like both are read-only in that list. Are there other useful feedback mechanisms for an action?

orta avatar Oct 18 '19 12:10 orta

I think that just dumping everything into std.out would be at least something. It would be good enough for me.

sobolevn avatar Oct 18 '19 12:10 sobolevn

you can write to stdout (and use the exit code to indicate failure)

stof avatar Oct 18 '19 12:10 stof

From the docs about secrets in GitHub:

Secrets are not passed to the runner when a workflow is triggered from a forked repository.

More details, you can reference here: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#using-encrypted-secrets-in-a-workflow

BrightRan avatar Mar 31 '20 01:03 BrightRan

IMO we should be recommending people use their own GitHub auth tokens, rather than the provided GH one

orta avatar Mar 31 '20 01:03 orta

@orta is it safe? I have seen several article that do not recommend using personal tokens. Because they can be leaked.

sobolevn avatar Mar 31 '20 06:03 sobolevn

It's always been the recommended way to do it: https://danger.systems/js/guides/getting_started.html#creating-a-bot-account-for-danger-to-use

It's safe for OSS, as long as you don't give the bot access to anything

orta avatar Mar 31 '20 15:03 orta

Well, there should be a mode where danger-js reports things using the Github Actions reporting system (sending some logs to the output of the script, with some special formats in it to achieve some actions like adding annotations, if needed) instead of adding a comment. Then, it would be usable in actions directly. Github Actions already have a reporting UI integrated in Gtihub.

stof avatar Apr 01 '20 13:04 stof

I had a play around, and it's relatively straightforward to understand whether Danger is running on a PR originated from a fork.

I came up with this simple dangerfile.ts:

const headRepoName = danger.github.pr.head.repo.full_name
const baseRepoName = danger.github.pr.base.repo.full_name

if headRepoName != baseRepoName {
  // This is shown inline in the output
  console.log("\033[1;31mRunning from a forked repo. Danger won't be able to post comments on the main repo unless GitHub Actions are enabled on the fork, too.\033[0m")

  // This is shown inline in the output and also integrates with the GitHub 
  // Action reporting UI and produces a warning
  console.log("##[warning]Running from a forked repo. Danger won't be able to post comments on the main repo unless GitHub Actions are enabled on the fork, too.\033[0m")
}
Screen Shot 2020-06-18 at 4 36 18 pm Screen Shot 2020-06-18 at 4 36 37 pm

I guess logic could be added somewhere that, if it detects that the CI source is GitHub Actions and the PR is from a fork posts this comments.

Or, even better, when the API call to post a comment gets a 403 with message "Resource not accessible by integration", checks the above conditions and post the warning. In this case, one could use ##[error] in the log and actually make the build fail. I'm not sure how to make the build fail, just logging ##[error] is not enough. Maybe a throw?

Screen Shot 2020-06-18 at 4 42 29 pm

mokagio avatar Jun 18 '20 06:06 mokagio

Also worth trying to use the Danger checks implementation on a forked PR as @stof mentioned

orta avatar Jun 18 '20 12:06 orta

Also worth trying to use the Danger checks implementation on a forked PR as @stof mentioned

I tried it with this commit, same result, see the build here.

Request failed [403]: https://api.github.com/repos/wordpress-mobile/WordPress-iOS/check-runs
Response: {
  "message": "Resource not accessible by integration",
  "documentation_url": "https://developer.github.com/v3/checks/runs/#create-a-check-run"
}

I also tried to use a custom public_repo token, as per the docs.

A PR from the base repo works as expected. A PR from a forked repo fails saying there's no token. My guess would be that despite running on the base repo, it accesses the environment of the forked repo, where no token exists.

mokagio avatar Jun 19 '20 03:06 mokagio

I also found this as an issue on my org. I have also tried to use DANGER_GITHUB_APP_ID, DANGER_GITHUB_APP_PRIVATE_SIGNING_KEY, and DANGER_GITHUB_APP_INSTALL_ID from around 2020 (#594), but it still isn't working.

It seems that there are #1125 and #1126. It's days ago, but hopefully it got implemented soon.

Hans5958 avatar Apr 02 '21 08:04 Hans5958

Anyone have any success working around this issue?

I'd love to use Danger for the Zed repo, but not being able to run on forks is a huge blocker for us.

maxdeviant avatar Apr 10 '24 18:04 maxdeviant

Big fan of Zed, but the issue here is "a CI security thing" (in this case how GitHub CI works) which we can't really address inside danger - for DefinitelyTyped, a very non-trivial repo we do use the advice from this comment: https://github.com/danger/danger-js/issues/918#issuecomment-606682743

orta avatar Apr 11 '24 00:04 orta

Big fan of Zed, but the issue here is "a CI security thing" (in this case how GitHub CI works) which we can't really address inside danger - for DefinitelyTyped, a very non-trivial repo we do use the advice from this comment: #918 (comment)

Gotcha. I suppose if it has been fine to have a token out in the open like that for DefinitelyTyped it's probably fine for us (even if it does make my skin crawl 😅).

I guess another option would be to run a small proxying service that forwards to the GitHub API and attaches the access token at that point?

maxdeviant avatar Apr 11 '24 00:04 maxdeviant

I guess another option would be to run a small proxying service that forwards to the GitHub API and attaches the access token at that point?

I ended up pursuing this route.

Here's the solution I came up with: https://github.com/maxdeviant/danger-proxy

If anyone else finds the proxy useful, do let me know 😄

maxdeviant avatar Apr 11 '24 03:04 maxdeviant

Cool answer 👍🏻

orta avatar Apr 11 '24 11:04 orta