4 Commits
Author SHA1 Message Date
stilobique a561a35030 Fix clean docker job 2026-09-06 20:19:36 +02:00
stilobique 467a6ce0e3 Fix with the branch 5.2 2026-09-06 19:40:07 +02:00
stilobique 77075e369c Windows fix and API 2026-08-14 19:06:40 +02:00
stilobique 2b994e04cb Fix readme info 2026-08-14 10:06:37 +02:00
5 changed files with 36 additions and 14 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Build BlenderDocker" type="docker-deploy" factoryName="dockerfile" server-name="Docker Desktop"> <configuration default="false" name="Build BlenderDocker" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="stilobique/blender:4.5.11" /> <option name="imageTag" value="stilobique/blender:4.5.11" />
+12 -1
View File
@@ -6,11 +6,22 @@ This repository is an automated blender docker image file generated, it's useful
# Building # Building
## Docker Hub credentials
`main.py` logs into Docker Hub before building, so it needs `DOCKER_HUB_USER` and `DOCKER_HUB_PASSWORD` in the environment.
Create a `config.env` file at the repo root (gitignored):
```shell
DOCKER_HUB_USER=your_docker_hub_username
DOCKER_HUB_PASSWORD=your_docker_hub_password
```
It's loaded automatically by the `Automation Builder` run configuration (`ENV_FILES`) when running `main.py` from the IDE. Running it another way? Export those two variables yourself first.
## Start your build ## Start your build
You can use Invoke to easily start a build, a clean or more. You can use Invoke to easily start a build, a clean or more.
```shell ```shell
invoke --li invoke --list
``` ```
## Debug and logs ## Debug and logs
Some log are generated inside a `logs` folder. Some log are generated inside a `logs` folder.
- `build`: all operation on build docker file. - `build`: all operation on build docker file.
+11 -6
View File
@@ -13,7 +13,7 @@ _EXTRA_PACKAGE_NAMES = {'wayland protocols'}
class BlenderDependency: class BlenderDependency:
def __init__(self, blender: BlenderVersion): def __init__(self, blender: BlenderVersion):
self._blender_version = blender self._blender_version = blender
self._url = rf'https://projects.blender.org/blender/blender/raw/tag/v{self._blender_version.tag_name()}/build_files/build_environment/install_linux_packages.py' self._url = rf'https://projects.blender.org/api/v1/repos/blender/blender/raw/build_files/build_environment/install_linux_packages.py?ref=v{self._blender_version.tag_name()}'
self.module = self._get_source_file() self.module = self._get_source_file()
self.packages = list() self.packages = list()
@@ -25,6 +25,7 @@ class BlenderDependency:
def _get_source_file(self): def _get_source_file(self):
"""Download the Blender dependency script and import it at runtime.""" """Download the Blender dependency script and import it at runtime."""
r = requests.get(self._url) r = requests.get(self._url)
r.raise_for_status()
with tempfile.NamedTemporaryFile(mode='wb', suffix='.py', delete=False) as t: with tempfile.NamedTemporaryFile(mode='wb', suffix='.py', delete=False) as t:
t.write(r.content) t.write(r.content)
@@ -40,7 +41,10 @@ class BlenderDependency:
def _get_list(self): def _get_list(self):
"""Keep the mandatory 'library' packages (and Wayland Protocols) as Debian/Ubuntu apt names.""" """Keep the mandatory 'library' packages (and Wayland Protocols) as Debian/Ubuntu apt names."""
sources = self.module.BUILD_MANDATORY_SUBPACKAGES + self.module.DEPS_CRITICAL_SUBPACKAGES sources = self.module.BUILD_MANDATORY_SUBPACKAGES
if hasattr(self.module, 'DEPS_CRITICAL_SUBPACKAGES'):
sources += self.module.DEPS_CRITICAL_SUBPACKAGES
for package in self._flatten(sources): for package in self._flatten(sources):
if 'library' not in package.name.lower() and package.name.lower() not in _EXTRA_PACKAGE_NAMES: if 'library' not in package.name.lower() and package.name.lower() not in _EXTRA_PACKAGE_NAMES:
continue continue
@@ -50,10 +54,11 @@ class BlenderDependency:
def _get_complete_list(self): def _get_complete_list(self):
"""All packages required to build Blender (PACKAGES_BASICS_BUILD) as Debian/Ubuntu apt names.""" """All packages required to build Blender (PACKAGES_BASICS_BUILD) as Debian/Ubuntu apt names."""
for package in self._flatten(self.module.PACKAGES_BASICS_BUILD): if hasattr(self.module, 'PACKAGES_BASICS_BUILD'):
name = package.distro_package_names.get(self.module.DISTRO_ID_DEBIAN) for package in self._flatten(self.module.PACKAGES_BASICS_BUILD):
if isinstance(name, str): name = package.distro_package_names.get(self.module.DISTRO_ID_DEBIAN)
self.packages_complete.append(name) if isinstance(name, str):
self.packages_complete.append(name)
def _flatten(self, packages): def _flatten(self, packages):
"""Yield every leaf Package, descending into is_group sub_packages.""" """Yield every leaf Package, descending into is_group sub_packages."""
+5 -5
View File
@@ -23,8 +23,7 @@ def _clean_log_line(text: str) -> str:
class BlenderDocker: class BlenderDocker:
def __init__(self, blender: BlenderVersion, severity: int = logging.WARNING): def __init__(self, blender: BlenderVersion, severity: int = logging.WARNING):
self._blender_version = blender self._blender_version = blender
# Todo get a user config self._docker_client = docker.from_env()
self._docker_client = docker.DockerClient(base_url=f'unix:///var/run/docker.sock')
self.login() self.login()
self._docker_image = None self._docker_image = None
self._repository = 'stilobique/blender' self._repository = 'stilobique/blender'
@@ -52,9 +51,10 @@ class BlenderDocker:
release, so the build stage's base image can match it instead of drifting with release, so the build stage's base image can match it instead of drifting with
whatever a floating `python` tag currently resolves to. whatever a floating `python` tag currently resolves to.
""" """
url = (f'https://projects.blender.org/blender/blender/raw/tag/' url = (f'https://projects.blender.org/api/v1/repos/blender/blender/raw/'
f'v{self._blender_version.tag_name()}/build_files/cmake/Modules/FindPythonLibsUnix.cmake') f'build_files/cmake/Modules/FindPythonLibsUnix.cmake?ref=v{self._blender_version.tag_name()}')
r = requests.get(url) r = requests.get(url)
r.raise_for_status()
match = re.search(r'set\(_PYTHON_VERSION_SUPPORTED\s+([0-9]+\.[0-9]+)\)', r.text) match = re.search(r'set\(_PYTHON_VERSION_SUPPORTED\s+([0-9]+\.[0-9]+)\)', r.text)
if not match: if not match:
print(f'Could not determine required Python version from {url}') print(f'Could not determine required Python version from {url}')
@@ -75,7 +75,7 @@ class BlenderDocker:
logger.propagate = False logger.propagate = False
if not logger.handlers: if not logger.handlers:
handler = logging.FileHandler(log_dir / f'{name}.log') handler = logging.FileHandler(log_dir / f'{name}.log', encoding='utf-8')
handler.setFormatter(logging.Formatter( handler.setFormatter(logging.Formatter(
'%(asctime)s | [%(levelname)s] %(message)s' '%(asctime)s | [%(levelname)s] %(message)s'
)) ))
+6
View File
@@ -90,3 +90,9 @@ def get_all_tags_from_docker():
# All tags data: # All tags data:
for release in j: for release in j:
print(release) print(release)
if __name__ == '__main__':
print('Clean docker')
clean_all_dockers()
print('Done')