github-app-secret
Generate Github app auth token and write it into a Kubernetes Secret and refresh
it periodically.
The application ./cmd/github-app-secret
takes Github app private key, app ID,
installation ID and a secret name, and generates an auth token and writes it to
a Kubernetes Secret with the given secret name. This can be used by any
application that needs Github app based authentication.
Instructions
⚠️ WARNING: Please make sure that the system time where this program runs is
up-to-date. The token generation requests contain expiry time. If the expiry
time used in the request is in the past, token generation would fail with 401
Unauthorized error.
Create a new Github app with the appropriate permissions, generate a private key
for the app and install the app in the target repositories. Refer the official
docs
for detailed instructions.
The app ID can be obtained from the app settings page at
https://github.com/settings/apps/<app-name>
.
The installation ID can be obtained from
https://github.com/settings/installations
page. On clicking an installed app,
the URL will contain the installation ID
https://github.com/settings/installations/<installation-id>
. For
organizations, the first part of the URL may be different, but it follows the
same pattern.
Put the private key in a Kubernetes Secret with
$ kubectl create secret generic github-app-private-key --from-file=privatekey.pem=/path-to-private-key.pem
This secret will be mounted as a volume and used by github-app-secret
.
github-app-secret
is run as a Kubernetes CronJob. Modify the manifests from
./deploy
directory, adding the parameters collected above as argument to the
github-app-secret
container. For example:
...
containers:
- name: github-app-secret
args:
- "-v=3"
- --privateKeyPath=/etc/secret-volume/privatekey.pem
- --appID=<app-id>
- --installationID=<installation-id>
- --secretName=<secret-name>
...
Update the CronJob schedule depending on the needs, ensuring that the token gets
refreshed before expiry.
Make sure that the manifests in ./deploy/rbac.yaml
, which provide
github-app-secret
the necessary permissions it needs to create and update the
Secret, are applied along with the CronJob manifest.
For cloning git repositories, the secret of type git
can be used. This is the
default type of Secret. It creates secret data with username
field
x-access-token
as required by Github for http based clone.
For just the auth token, the secret of type plain
can be used. This can be
configured in github-app-secret
by using --secretType
flag.
For Github Enterprise, the Github API URL can be configured with --apiURL
flag.
Build
Since this is a very basic golang application, ko
can be
used to build a container image for it.
Install ko
and run make ko-build
to build a container image for it. This
will build the image and load it in the local container image store.
In order to build and publish to a remote repository, run
KO_DOCKER_REPO=<container-repo-address> make ko-publish
. Refer
https://ko.build/get-started/#choose-destination for more examples.