Graphical node-based CI/CD Pipeline Builder. Create and run your CI/CD pipelines by adding premade "nodes" or running custom functions. Avoid the hassle of self-hosting runners, maintaining environments, dealing with yaml config files and other common DevOps headaches.
Caution
This project is under heavy development! It is NOT recommended to run this software in production environments yet!
Contributions are always welcome!
See CONTRIBUTING.md for ways to get started. Please adhere to this project's code of conduct.
The project is separated into a frontend and backend directories. The frontend directory is a React application that uses Vite for development and build. The backend directory is a Django application that uses Django REST Framework for the API.
The project also requires the use of Cloudflare R2 for storage, Google Cloud for pipeline execution and a GitHub application for repository access.
- Python 3.8 or higher
- uv
The backend uses uv and a .env file to manage environment variables and packages.
-
Change to the backend directory:
cd backend -
Create a virtual environment and install the required packages:
uv sync
This will create a virtual environment in the
.venvdirectory and install the required packages in it. You can manually activate the virtual environment by running:source .venv/bin/activate -
Setting up the environment variables:
Copy the
project/.env.examplefile toproject/.envand update the values as needed. The project uses Cloudflare R2 for storage, GitHub for repository access, PostgreSQL for the database, and Celery for asynchronous tasks.-
Generate a Django secret key using Djecrety and update the
DJANGO_SECRET_KEYvariable in the.envfile. -
Set the
DEBUGvariable toTruefor development andFalsefor production. -
Set the
ALLOWED_HOSTSvariable tolocalhostfor development andyour-domain.comfor production. -
Set up the
CORS_ALLOWED_ORIGINSvariable to allow requests from the frontend application. For development, set it tohttp://localhost:3000and for production, set it to your frontend domain. -
Set the database variables to the appropriate values for your created PostgreSQL database. The default values are:
-
Cloudflare R2: Create a Cloudflare account and set up a R2 Object Storage bucket. Get the Access and Secret keys, bucket name and endpoint URL. With these values, update the variables in the
.envfile: -
Google Cloud: Create a Google Cloud account. Create a new project and set the variable
GCLOUD_PROJECT_IDto that project ID.Create a new service account with permissions for Cloud Run, Artifact Registry and Pub/Sub. Download the service account key in JSON format, rename it to service-account.json and place it at the root of the backend directory.
Choose a region you want to use and set the
GCLUD_REGIONvariable to that.Head to the artifact registry and create a new repository called
script-repo. Build and upload the Dockerfile from thebase-imagedirectory to the repository. Make sure to set the image name to base-image and the tag to latest.Create a new Pub/Sub topic where all the logs will be sent to. Head to the logging section and create a new sink in the
Log Routersection. Choose the Pub/Sub topic you created and set the sink name tobettercd-logs. Set the inclusion filter to:resource.type="cloud_run_job" resource.labels.job_name=~"pipeline-job-*" severity="DEFAULT"
Create a new subscription for the topic and set the delivery type to
Pull, ack deadline to 10 seconds, retention to 2 hours, disable exactly once delivery and set the expiration to 31 days. -
GitHub: Head over to the Developer settings of your GitHub account and create a new GitHub app. with repository permissions. From there, copy the App ID and Name and set those environment variables in the
.envfile.Set the
GITHUB_CALLBACK_URLvariable to the URL of your frontend +/dashboard/integrations. For example:http://localhost:3000/dashboard/integrations.Finally, generate a private key for the app and place it wherever you want in the backend directory and set the
GITHUB_PRIVATE_KEY_PATHvariable to the path of the key. Make sure the key is namedgithub-private-key.pem. -
Celery: The project uses Celery for asynchronous tasks. Make sure to set the
CELERY_BROKER_URLvariable to the URL of your Redis server.
-
-
Run the database migrations:
All the migration files are prepared and ready to be used. Run the following command to apply the migrations to the database:
python manage.py migrate
-
Create a superuser account:
Create a superuser account to access the Django admin panel. The account can also be used to log in to the frontend application. To create a superuser account, run the following command and follow the prompts:
python manage.py createsuperuser
-
Run the backend application:
python manage.py runserver
Running the Celery worker locally is needed for real-time log updates and pipeline runs. To run the Celery worker, run the following command:
celery -A project worker --loglevel=INFOCaveat: Sometimes the worker kills itself on MacOS. To fix this, run the
worker with the --pool=solo option:
celery -A project worker --loglevel=INFO --pool=solo-
Change to the frontend directory:
cd frontend -
Install the required packages:
bun install
-
Set up the environment variables:
Create a
.envfile in the frontend directory and set the following:VITE_BE_URL=http://localhost:8000
This will set the backend URL where the frontend will send requests to.
-
Run the frontend application:
bun run dev
For support or feedback email 72min@proton.me.
For issues, feature requests, bugs, etc.. please open an issue here on GitHub.