GitHub integration
Attribution works without GitHub. What connecting it adds is pull request titles, authors, and whether the work merged, and with those, cost per merged pull request.
Panorama asks GitHub only about branches and pull requests it has already seen in your engineers’ traffic. It never lists your repositories, so it needs read access only to what your engineers touch, and the number of API calls follows the number of conversations, not the size of your organization.
Before you start
Section titled “Before you start”Set an encryption key. The GitHub credential is encrypted before it is stored, and the key stays in your configuration, so a database dump or backup carries nothing usable. Any passphrase of 16 characters or more works:
PANORAMA_ENCRYPTION_KEY=a-long-passphrase-you-will-not-loseOr mint a full-strength key with panorama admin generate-key. Restart after
setting it. The CloudFormation template generates one for you.
Without a key, the GitHub form is replaced by a message saying so.
Create a GitHub App
Section titled “Create a GitHub App”A GitHub App is the right credential for a real deployment. It is installed on the organization with a stated scope, so its access does not belong to whoever set it up.
-
In your GitHub organization: Settings → Developer settings → GitHub Apps → New GitHub App.
-
Give it a name and any homepage URL. Untick Webhook → Active. Panorama polls; it receives nothing.
-
Under Repository permissions, grant read-only access to:
- Pull requests
- Contents
- Metadata (GitHub selects this for you)
Nothing else, and no organization or account permissions.
-
Create the app. Note its App ID.
-
Generate a private key and download the
.pemfile. -
Install the app on your organization, on all repositories or on the ones your engineers work in.
Connect it
Section titled “Connect it”In Settings → Integrations, on the GitHub band:
- Leave the credential shape on GitHub App.
- Enter the App ID.
- Leave Installation ID empty if the app is installed in one place. It is found automatically. If it is installed in several, the error lists them with their IDs.
- Paste the whole contents of the
.pemfile into Private key. - For GitHub Enterprise Server only, set API base URL.
- Press Connect.
The credential is write-only. No screen and no API ever shows it again, which is why there is no masked value to reveal. To replace it, paste a new one.
Trying it with a personal access token
Section titled “Trying it with a personal access token”Choose Token and paste a token with read access to the repositories. This is fine for an evaluation and wrong for a deployment: the token belongs to a person, every read is recorded as theirs, and it stops working when they leave. The console labels a token-backed connection as one.
Check it worked
Section titled “Check it worked”The band shows one of four states:
| State | Meaning |
|---|---|
not connected |
No credential is stored. |
never run |
Connected, and the first check has not happened yet. |
connected |
The last check succeeded. |
failing |
The last check failed. The error is shown, and is kept after it clears, because an intermittent failure is the one worth chasing. |
Checks run every 15 minutes (integrations.sync_interval). Press Check now
to run one immediately. Last run reads like “42 confirmed of 45 asked”.
A failing connection also appears on Analytics → Attention.
What goes wrong
Section titled “What goes wrong”Some work items stay unconfirmed. That is normal. A branch nobody pushed is not on GitHub, and Panorama records it as absent, not as an error. The attribution itself is unaffected.
failing, with a rate limit message. GitHub’s API budget for the app is
used up. The message says when it resets. While a source is unreachable,
Panorama confirms nothing at all, so that one broken API call cannot mark every
work item in the deployment as “not found”.
“this app is not installed anywhere”. Step 6 was missed.
“the private key is not PEM”. Paste the file’s full contents, including the
-----BEGIN and -----END lines.
It was connected and is now failing after a redeploy. The encryption
key changed. Enter the credential again.
Good to know
Section titled “Good to know”- Merged means merged. Panorama reads a pull request’s
merged_at, never itsstate, because a merged pull request reportsclosed. - Confirmation never changes attribution. It adds a relation: this branch was opened as that pull request.
- Jira is not in v1. It appears on the screen as coming soon. Naming it as an integration in the configuration file is refused at startup.
This manual is licensed underCC BY 4.0. Code samples in it are part of Panorama, licensed under theGNU AGPL v3.0 only.