-
Notifications
You must be signed in to change notification settings - Fork 0
sconover/raw-ci
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
raw-ci
Goals:
- Speed is the #1 feature.
Annotate a GH commit with status information as quickly as possible.
- Simple, even simplistic: bash scripts + GCP-hosted functions/storage.
Your worker daemon is something you run, like screen/tmux.
New, arbitrarily different builds are easy to set up.
- Build logs are available via the web, linked up in notifications
and Github commit status detail messages.
- Slack notifications out of the box, with message formatting capabilities
intended to be push-notification friendly: emoji represent important aspects
of a build result.
Of note, this build has no classic "web interface" - the user interface is
notification systems (like slack), which naturally allow humans to track
a build through its various states.
- Aimed at hermetic build environments (like bazel provides), where output
can be reused across builds with a high degree of confidence. These
builds have the potential to run very, very quickly.
TODO: if anyone else wants to use this, I should make a better/easier
install capability, and improve the setup experience overall.
Please get in contact.
===============================
Notes
= Setup =
Clone this repo on a build server (it's probably easiest if this server is managed by GCE)
== CONFIG.JSON ==
Under google-cloud-functions:
cp config-default.json config.json
config.json is used by the various google cloud functions and by the worker ci loop script. It should live in the google-cloud-functions directory.
It is .gitignore'd.
You'll need to fill out values custom for your environment in config.json:
BUCKET: This is the GCS bucket that will be the coordination point for the build, where build logs will live, and so on.
GCP_PROJECT: The google cloud platform project under which the bucket lives
GITHUB_ACCESS_TOKEN: A personal access token used to invoke github api functions.
In github:
- Go to your account Settings -> Developer Settings -> Personal access tokens
- Make a new token, and for its scope ONLY check "repo:status"
- Paste in the resulting random token string as the value for GITHUB_ACCESS_TOKEN
CI_*: These are subfolder names the build uses, you can leave the default names for now.
BUILD_LOG_FOLDER: Where publicly-accessible build logs will go. You probably want to just use the default value.
BUILD_NAME: Used to distinguish multiple kinds of status updates within a single git commit in github.
This only matters if you have multiple build stages that affect commit status. You probably will just want to use the default value.
== CLOUD FUNCTIONS ==
1a) Set up the cloud function that the github on-push-event webhook will invoke
cd google-cloud-functions
gcloud beta functions deploy someMainCIonGithubPushAddToCiInbox --entry-point=onGithubPushAddToCiInbox --trigger-http --stage-bucket your-cloud-functions-staging-bucket --source .
This operation will print the httpsTrigger to the console, for example:
httpsTrigger:
url: https://us-central1-yourproject.cloudfunctions.net/someMainCIonGithubPushAddToCiInbox
You'll now plug this url into a github webhook.
1b) Github webhook setup
This step will make it so github invokes the someMainCIonGithubPushAddToCiInbox https endpoint upon any push event, for your github-hosted repo.
Go to your project on github:
- Go to project Settings -> Webhooks
- Add Webhook:
Payload URL: the aforementioned url printed to the console
Content type: application/json
[TODO: Shared secret]
Which events would you like to trigger this webhook?: Just the push event.
Active: checked
- Note that if you edit the webhook, and scroll to the bottom of the page, you see "recent deliveries".
You can open up a recent delivery, and click the "Redeliver" button to test the webhook.
2) Set up the cloud function will be invoked on finle writes to the bucket
cd google-cloud-functions
gcloud beta functions deploy someMainCIonFolderEvent --entry-point=onFolderEventUpdateGithubCommitStatus --trigger-bucket your-gcs-bucket --stage-bucket your-cloud-functions-staging-bucket --source .
Note the functions are now in:
https://console.cloud.google.com/functions/list
...and in particular, that you can view log output of each function
[optional] 3) Set up the slack cloud function
cd google-cloud-functions
gcloud beta functions deploy someMainCIonFolderEventSlack --entry-point=onFolderEventSendSlackNotification --trigger-bucket your-gcs-bucket --stage-bucket your-cloud-functions-staging-bucket --source .
== PUBSUB ==
Create a topic named after the BUILD_NAME, and suffixed -topic.
https://console.cloud.google.com/cloudpubsub/topicList
For example, if your build name is "testbuild", you need to create a topic called "testbuild-topic".
== WORKER CI LOOP ==
[TODO: various apt commands to install dependencies]
You will want to invoke a key project ci command, e.g. run all tests. For example, from a cloned git repo of a bazel-based project:
../raw-ci/worker/worker_ci_loop.sh ../raw-ci/google-cloud-functions/config.json -- 'git fetch origin && git checkout $GIT_SHA && time bazel test //...'
This:
- Invokes the worker ci loop script in the raw-ci repo you cloned on the build host (sibling to the bazel-based project)
- Points at the config.json you set up in step one - and notably, which is shared by the google cloud functions
- Provides a ci command that fetches the git repo, checks out the $GIT_SHA commit (this is an environment variable)
provided by the worker script), and runs all tests.
Once started, a dot will be printed for every time the ci loop checks the bucket for new build work to do, and doesn't find any.
Trigger a build using the "Redeliver" button mentioned in step one, or by pushing a change to your git repo.
There are many tricks for keeping the ci loop running outside of a given ssh session, such as screen/tmux.
About
[WIP/alpha] github+google cloud functions+google cloud storage+slack = just enough CI
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published