Compare commits
3 commits
edb56e96dc
...
043a1b6ffa
Author | SHA1 | Date | |
---|---|---|---|
|
043a1b6ffa | ||
|
2eb472cc20 | ||
|
b91ee462b8 |
7 changed files with 155 additions and 47 deletions
11
Dockerfile
Normal file
11
Dockerfile
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Use the published buildbot/buildbot-master image as the base
|
||||
FROM buildbot/buildbot-master:master
|
||||
|
||||
# Install buildbot-prometheus in the existing virtual environment
|
||||
RUN /buildbot_venv/bin/pip3 install buildbot-prometheus
|
||||
|
||||
# Set the working directory to where the buildbot files are expected
|
||||
WORKDIR /buildbot
|
||||
|
||||
# Keep the existing command to start buildbot
|
||||
CMD ["dumb-init", "/usr/src/buildbot/start_buildbot.sh"]
|
|
@ -119,4 +119,17 @@ def fetch_authorization(environment: str):
|
|||
roleMatchers=file_based_group_username_role_matchers,
|
||||
)
|
||||
|
||||
my_authz = buildbot.plugins.util.Authz(
|
||||
allowRules=[
|
||||
buildbot.plugins.util.AnyControlEndpointMatcher(
|
||||
role="Developers"
|
||||
), # Organization teams
|
||||
],
|
||||
roleMatchers=[
|
||||
buildbot.plugins.util.RolesFromGroups(
|
||||
groupPrefix="test-org/"
|
||||
) # Gitea organization
|
||||
],
|
||||
)
|
||||
|
||||
return my_authz
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
# SPDX-FileCopyrightText: 2011-2024 Blender Authors
|
||||
# <pep8 compliant>
|
||||
|
||||
# import buildbot.plugins
|
||||
import os
|
||||
from buildbot.www.oauth2 import OAuth2Auth
|
||||
import buildbot.plugins
|
||||
from urllib.parse import urljoin
|
||||
|
||||
# Buildbot admin with access to everything.
|
||||
|
@ -29,8 +29,8 @@ gitea_client_secret = os.environ.get("GITEA_CLIENT_SECRET", default="")
|
|||
|
||||
def get_authentication(environment: str):
|
||||
class GiteaAuth(OAuth2Auth):
|
||||
name = "projects.blender.org"
|
||||
faIcon = "fa-cogs"
|
||||
name = "Gitea"
|
||||
faIcon = "fa-gitea"
|
||||
|
||||
AUTH_URL = "login/oauth/authorize"
|
||||
TOKEN_URL = "login/oauth/access_token"
|
||||
|
@ -42,10 +42,32 @@ def get_authentication(environment: str):
|
|||
self.tokenUri = urljoin(endpoint, self.TOKEN_URL)
|
||||
|
||||
def getUserInfoFromOAuthClient(self, c):
|
||||
return self.get(c, "/api/v1/user")
|
||||
user_info = self.get(c, "/api/v1/user")
|
||||
|
||||
# class LocalEnvAuth(buildbot.plugins.util.CustomAuth):
|
||||
# def check_credentials(self, user, password):
|
||||
# return user.decode() == "admin" and password.decode() == "admin"
|
||||
orgs = self.get(c, "/api/v1/user/orgs")
|
||||
org_groups = [org["username"] for org in orgs]
|
||||
|
||||
return GiteaAuth(gitea_endpoint, gitea_client_id, gitea_client_secret)
|
||||
teams = self.get(c, "/api/v1/user/teams")
|
||||
team_groups = [
|
||||
f"{team['organization']['username']}/{team['name']}" for team in teams
|
||||
] # Format: org/team
|
||||
|
||||
groups = org_groups + team_groups
|
||||
|
||||
user_data = {
|
||||
"full_name": user_info.get("full_name", user_info.get("username")),
|
||||
"email": user_info.get("email"),
|
||||
"username": user_info.get("username"),
|
||||
"groups": groups,
|
||||
}
|
||||
|
||||
return user_data
|
||||
|
||||
class LocalEnvAuth(buildbot.plugins.util.CustomAuth):
|
||||
def check_credentials(self, user, password):
|
||||
return user.decode() == "admin" and password.decode() == "admin"
|
||||
|
||||
if gitea_endpoint and gitea_client_id and gitea_client_secret:
|
||||
return GiteaAuth(gitea_endpoint, gitea_client_id, gitea_client_secret)
|
||||
else:
|
||||
return LocalEnvAuth()
|
||||
|
|
|
@ -85,6 +85,12 @@ def setup() -> Dict[str, Any]:
|
|||
else:
|
||||
c["services"] = []
|
||||
|
||||
c["services"].append(
|
||||
buildbot.plugins.reporters.Prometheus(
|
||||
port=int(os.environ.get("BUILDBOT_PROMETHEUS_PORT", default=9100))
|
||||
)
|
||||
)
|
||||
|
||||
####### PROJECT IDENTITY
|
||||
|
||||
# the 'title' string will appear at the top of this buildbot installation's
|
||||
|
@ -99,57 +105,48 @@ def setup() -> Dict[str, Any]:
|
|||
# buildbot cannot figure out without some help.
|
||||
c["buildbotURL"] = os.environ.get("BUILDBOT_WEB_URL", "http://localhost:8010/")
|
||||
|
||||
# Minimalistic config to activate new web UI
|
||||
c["www"] = dict(
|
||||
port=os.environ.get("BUILDBOT_WEB_PORT", 8010),
|
||||
plugins=dict(waterfall_view={}, console_view={}, grid_view={}),
|
||||
theme={
|
||||
"bb-sidebar-background-color": "#1F2226", # Eerie Black 2
|
||||
"bb-sidebar-header-background-color": "#202327", # Eerie Black
|
||||
"bb-sidebar-header-text-color": "#9fa3a8", # Dim Gray (Lighter gray for text)
|
||||
"bb-sidebar-title-text-color": "#9fa3a8", # Dim Gray (Titles)
|
||||
"bb-sidebar-footer-background-color": "#292d32", # Jet
|
||||
"bb-sidebar-button-text-color": "#9fa3a8", # Dim Gray (Button text)
|
||||
"bb-sidebar-button-hover-background-color": "#292d32", # Jet (Button hover background)
|
||||
"bb-sidebar-button-hover-text-color": "#3dabf5", # Light blue for hover text
|
||||
"bb-sidebar-button-current-background-color": "#292d32", # Jet (Current button background)
|
||||
"bb-sidebar-button-current-text-color": "#3dabf5", # Light blue for current button text
|
||||
"bb-sidebar-stripe-hover-color": "#3695D5", # Celestial Blue
|
||||
"bb-sidebar-stripe-current-color": "#084F7E", # Indigo Dye
|
||||
},
|
||||
# Initialize
|
||||
c["www"] = {}
|
||||
|
||||
# Port
|
||||
c["www"]["port"] = os.environ.get("BUILDBOT_WEB_PORT", 8010)
|
||||
|
||||
# Plugins
|
||||
c["www"]["plugins"] = dict(
|
||||
waterfall_view={},
|
||||
console_view={},
|
||||
grid_view={},
|
||||
)
|
||||
|
||||
# Theme
|
||||
c["www"]["theme"] = {
|
||||
"bb-sidebar-background-color": "#1F2226", # Eerie Black 2
|
||||
"bb-sidebar-header-background-color": "#202327", # Eerie Black
|
||||
"bb-sidebar-header-text-color": "#9fa3a8", # Dim Gray (Lighter gray for text)
|
||||
"bb-sidebar-title-text-color": "#9fa3a8", # Dim Gray (Titles)
|
||||
"bb-sidebar-footer-background-color": "#292d32", # Jet
|
||||
"bb-sidebar-button-text-color": "#9fa3a8", # Dim Gray (Button text)
|
||||
"bb-sidebar-button-hover-background-color": "#292d32", # Jet (Button hover background)
|
||||
"bb-sidebar-button-hover-text-color": "#3dabf5", # Light blue for hover text
|
||||
"bb-sidebar-button-current-background-color": "#292d32", # Jet (Current button background)
|
||||
"bb-sidebar-button-current-text-color": "#3dabf5", # Light blue for current button text
|
||||
"bb-sidebar-stripe-hover-color": "#3695D5", # Celestial Blue
|
||||
"bb-sidebar-stripe-current-color": "#084F7E", # Indigo Dye
|
||||
}
|
||||
|
||||
# Database
|
||||
c["db"] = {
|
||||
"db_url": os.environ.get("BUILDBOT_DB_URL", "sqlite://").format(**os.environ)
|
||||
}
|
||||
|
||||
# Share usage data
|
||||
c["buildbotNetUsageData"] = None
|
||||
|
||||
# Authentication
|
||||
c["www"]["auth"] = conf.auth.fetch_authentication(environment)
|
||||
|
||||
# Authorization
|
||||
# c["www"]["authz"] = conf.auth.fetch_authorization(environment)
|
||||
c["www"]["authz"] = buildbot.plugins.util.Authz(
|
||||
allowRules=[
|
||||
buildbot.plugins.util.AnyControlEndpointMatcher(
|
||||
role="Admins"
|
||||
), # Organization teams
|
||||
],
|
||||
roleMatchers=[
|
||||
buildbot.plugins.util.RolesFromGroups(
|
||||
groupPrefix="test-org/"
|
||||
) # Gitea organization
|
||||
],
|
||||
)
|
||||
|
||||
# Disable UI - does not work
|
||||
c["www"]["plugins"] = {
|
||||
"waterfall_view": False,
|
||||
"console_view": False,
|
||||
"grid_view": False,
|
||||
}
|
||||
c["www"]["authz"] = conf.auth.fetch_authorization(environment)
|
||||
|
||||
# UI Defaults
|
||||
c["www"]["ui_default_config"] = {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
services:
|
||||
buildbot-master:
|
||||
image: 'buildbot/buildbot-master:${BUILDBOT_IMAGE_TAG:-v4.1.0}'
|
||||
# image: 'buildbot/buildbot-master:${BUILDBOT_IMAGE_TAG:-v4.1.0}'
|
||||
build:
|
||||
context: .
|
||||
env_file: .env
|
||||
hostname: buildbot-master
|
||||
restart: unless-stopped
|
||||
|
@ -16,6 +18,7 @@ services:
|
|||
- 'POSTGRES_USER=${POSTGRES_USER:-buildbot}'
|
||||
- 'POSTGRES_DB=${POSTGRES_DB:-buildbot}'
|
||||
- 'BUILDBOT_DB_URL=postgresql+psycopg2://{POSTGRES_USER}:{POSTGRES_PASSWORD}@postgresql/{POSTGRES_DB}'
|
||||
- 'BUILDBOT_PROMETHEUS_PORT=9100'
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
|
@ -72,6 +75,12 @@ services:
|
|||
retries: 10
|
||||
networks:
|
||||
buildbot: null
|
||||
prometheus:
|
||||
image: prom/prometheus
|
||||
volumes:
|
||||
- './prometheus.yml:/etc/prometheus/prometheus.yml'
|
||||
ports:
|
||||
- '9090:9090'
|
||||
volumes:
|
||||
buildbot-db: {}
|
||||
networks:
|
||||
|
|
7
prometheus.yml
Normal file
7
prometheus.yml
Normal file
|
@ -0,0 +1,7 @@
|
|||
global:
|
||||
scrape_interval: 60s
|
||||
scrape_configs:
|
||||
- job_name: buildbot
|
||||
static_configs:
|
||||
- targets:
|
||||
- buildbot-master:9100
|
49
provision/local/main.tf
Normal file
49
provision/local/main.tf
Normal file
|
@ -0,0 +1,49 @@
|
|||
terraform {
|
||||
required_providers {
|
||||
libvirt = {
|
||||
source = "dmacvicar/libvirt"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "libvirt" {
|
||||
uri = "qemu:///system"
|
||||
}
|
||||
|
||||
resource "libvirt_volume" "win11-ltsc-cloudbase-init" {
|
||||
name = "win11-ltsc-cloudbase-init.qcow2"
|
||||
pool = "default" # List storage pools using virsh pool-list
|
||||
source = "win11-ltsc-original.qcow2"
|
||||
format = "qcow2"
|
||||
}
|
||||
|
||||
resource "libvirt_domain" "win11-ltsc-cloudbase-init" {
|
||||
name = "win11-ltsc-cloudbase-init"
|
||||
memory = "8192"
|
||||
vcpu = 4
|
||||
|
||||
network_interface {
|
||||
network_name = "default" # List networks with virsh net-list
|
||||
}
|
||||
|
||||
disk {
|
||||
volume_id = "${libvirt_volume.win11-ltsc-cloudbase-init.id}"
|
||||
}
|
||||
|
||||
console {
|
||||
type = "pty"
|
||||
target_type = "serial"
|
||||
target_port = "0"
|
||||
}
|
||||
|
||||
graphics {
|
||||
type = "spice"
|
||||
listen_type = "address"
|
||||
autoport = true
|
||||
}
|
||||
}
|
||||
|
||||
# Output Server IP
|
||||
output "ip" {
|
||||
value = "${libvirt_domain.centos7.network_interface.0.addresses.0}"
|
||||
}
|
Loading…
Reference in a new issue