Skip to content

Commit 2667972

Browse files
Merge remote-tracking branch 'upstream/mainline' into feature/pre-gui-hook
# Conflicts: # src/deadline/cinema4d_submitter/cinema4d_render_submitter.py # test/integ/test_cinema4d.py
2 parents a55dd66 + 81222cc commit 2667972

280 files changed

Lines changed: 1057 additions & 493 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/dependabot.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ updates:
99
directory: "/" # Location of package manifests
1010
schedule:
1111
interval: "daily"
12-
commit-message:
12+
# PySide6 is pinned to 6.8 to align with VFX Reference Platform 2026, so
13+
# Dependabot must not propose bumps for it: https://vfxplatform.com/#reference-platform
14+
# Omitting `versions` and `update-types` ignores every update for the
15+
# dependency, which is what we want here.
16+
ignore:
17+
- dependency-name: "pyside6*"
18+
commit-message:
1319
prefix: "chore(deps):"
1420
# Combine all minor and patch bumps into a single PR. Major bumps do not
1521
# match this group and so each get their own individual PR.

.github/workflows/integ_macos.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ name: "Integ Tests - macOS"
22

33
on:
44
workflow_call:
5+
inputs:
6+
c4d_version:
7+
description: Cinema 4D major version to test
8+
required: true
9+
type: string
510
secrets:
611
AWS_OIDC_ROLE_ARN:
712
required: true
@@ -22,8 +27,9 @@ jobs:
2227
IntegMacOS:
2328
if: >-
2429
github.repository == 'aws-deadline/deadline-cloud-for-cinema-4d' &&
25-
github.ref == 'refs/heads/mainline'
26-
name: Integration Tests (macOS)
30+
(github.ref == 'refs/heads/mainline' ||
31+
github.ref == 'refs/heads/feature/ci-tests')
32+
name: Integration Tests (macOS, Cinema 4D ${{ inputs.c4d_version }})
2733
runs-on: macos-latest
2834
timeout-minutes: 60
2935
permissions:
@@ -35,7 +41,7 @@ jobs:
3541
redshift_LICENSE: "${{ secrets.RLM_PORT }}@127.0.0.1"
3642
g_licenseServerRLM: "127.0.0.1:${{ secrets.RLM_PORT }}"
3743
g_licenseModel: "LICENSEMODEL::RLM"
38-
C4D_VERSION: "2026"
44+
C4D_VERSION: ${{ inputs.c4d_version }}
3945
INSTALLER_BUCKET: ${{ secrets.INSTALLER_BUCKET }}
4046
INSTALLER_BUCKET_EXPECTED_OWNER: ${{ secrets.INSTALLER_BUCKET_EXPECTED_OWNER }}
4147
steps:
@@ -82,8 +88,8 @@ jobs:
8288
8389
- name: Grant accessibility to Cinema 4D
8490
run: |
85-
C4D_BIN="/Applications/Maxon Cinema 4D 2026/Cinema 4D.app/Contents/MacOS/Cinema 4D"
86-
C4DPY_BIN="/Applications/Maxon Cinema 4D 2026/c4dpy.app/Contents/MacOS/c4dpy"
91+
C4D_BIN="/Applications/Maxon Cinema 4D $C4D_VERSION/Cinema 4D.app/Contents/MacOS/Cinema 4D"
92+
C4DPY_BIN="/Applications/Maxon Cinema 4D $C4D_VERSION/c4dpy.app/Contents/MacOS/c4dpy"
8793
for BIN_PATH in "$C4D_BIN" "$C4DPY_BIN"; do
8894
if [ -f "$BIN_PATH" ]; then
8995
sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" \

.github/workflows/integ_windows.yml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ name: "Integ Tests - Windows"
22

33
on:
44
workflow_call:
5+
inputs:
6+
c4d_version:
7+
description: Cinema 4D major version to test
8+
required: true
9+
type: string
510
secrets:
611
AWS_OIDC_ROLE_ARN:
712
required: true
@@ -22,8 +27,9 @@ jobs:
2227
IntegWindows:
2328
if: >-
2429
github.repository == 'aws-deadline/deadline-cloud-for-cinema-4d' &&
25-
github.ref == 'refs/heads/mainline'
26-
name: Integration Tests (Windows)
30+
(github.ref == 'refs/heads/mainline' ||
31+
github.ref == 'refs/heads/feature/ci-tests')
32+
name: Integration Tests (Windows, Cinema 4D ${{ inputs.c4d_version }})
2733
runs-on: windows-latest
2834
timeout-minutes: 60
2935
permissions:
@@ -35,7 +41,7 @@ jobs:
3541
redshift_LICENSE: "${{ secrets.RLM_PORT }}@127.0.0.1"
3642
g_licenseServerRLM: "127.0.0.1:${{ secrets.RLM_PORT }}"
3743
g_licenseModel: "LICENSEMODEL::RLM"
38-
C4D_VERSION: "2026"
44+
C4D_VERSION: ${{ inputs.c4d_version }}
3945
INSTALLER_BUCKET: ${{ secrets.INSTALLER_BUCKET }}
4046
INSTALLER_BUCKET_EXPECTED_OWNER: ${{ secrets.INSTALLER_BUCKET_EXPECTED_OWNER }}
4147
steps:
@@ -135,6 +141,15 @@ jobs:
135141
136142
hatch run integ:test
137143
144+
- name: Upload render outputs
145+
if: always()
146+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
147+
with:
148+
name: cinema4d-${{ inputs.c4d_version }}-render-outputs
149+
path: test/integ/test_cases/**/actual/renders/**
150+
if-no-files-found: ignore
151+
retention-days: 7
152+
138153
- name: Tear down
139154
if: always()
140155
shell: pwsh

.github/workflows/integration_tests_xa11y.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,19 @@ on:
44
push:
55
branches:
66
- mainline
7+
# Restricted to developers with permission to approve pull requests.
8+
- feature/ci-tests
79

810
jobs:
911
windows:
12+
name: Windows, Cinema 4D ${{ matrix.c4d_version }}
13+
strategy:
14+
fail-fast: false
15+
matrix:
16+
c4d_version: ["2024", "2025", "2026"]
1017
uses: ./.github/workflows/integ_windows.yml
18+
with:
19+
c4d_version: ${{ matrix.c4d_version }}
1120
secrets:
1221
AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
1322
AWS_REGION: ${{ secrets.AWS_REGION }}
@@ -21,7 +30,14 @@ jobs:
2130
contents: read
2231

2332
macos:
33+
name: macOS, Cinema 4D ${{ matrix.c4d_version }}
34+
strategy:
35+
fail-fast: false
36+
matrix:
37+
c4d_version: ["2024", "2025", "2026"]
2438
uses: ./.github/workflows/integ_macos.yml
39+
with:
40+
c4d_version: ${{ matrix.c4d_version }}
2541
secrets:
2642
AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
2743
AWS_REGION: ${{ secrets.AWS_REGION }}

.github/workflows/release_bump.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
name: "Release: Bump"
22

33
on:
4+
schedule:
5+
# Every Monday at 14:00 UTC (~6/7am Pacific, ~9/10am Eastern).
6+
- cron: "0 14 * * 1"
47
workflow_dispatch:
58
inputs:
69
force_version_bump:
@@ -26,4 +29,4 @@ jobs:
2629
pull-requests: write
2730
secrets: inherit
2831
with:
29-
force_version_bump: ${{ inputs.force_version_bump }}
32+
force_version_bump: ${{ inputs.force_version_bump }}

.github/workflows/release_publish.yml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,14 @@ jobs:
3636

3737
Xa11yWindows:
3838
needs: [TagRelease, UnitTests]
39-
name: xa11y Integration Tests (Windows)
39+
name: xa11y Integration Tests (Windows, Cinema 4D ${{ matrix.c4d_version }})
40+
strategy:
41+
fail-fast: false
42+
matrix:
43+
c4d_version: ["2024", "2025", "2026"]
4044
uses: ./.github/workflows/integ_windows.yml
45+
with:
46+
c4d_version: ${{ matrix.c4d_version }}
4147
secrets:
4248
AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
4349
AWS_REGION: ${{ secrets.AWS_REGION }}
@@ -52,8 +58,14 @@ jobs:
5258

5359
Xa11yMacOS:
5460
needs: [TagRelease, UnitTests]
55-
name: xa11y Integration Tests (macOS)
61+
name: xa11y Integration Tests (macOS, Cinema 4D ${{ matrix.c4d_version }})
62+
strategy:
63+
fail-fast: false
64+
matrix:
65+
c4d_version: ["2024", "2025", "2026"]
5666
uses: ./.github/workflows/integ_macos.yml
67+
with:
68+
c4d_version: ${{ matrix.c4d_version }}
5769
secrets:
5870
AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
5971
AWS_REGION: ${{ secrets.AWS_REGION }}

hatch_custom_hook.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
import os
33
import shutil
4-
from datetime import datetime
4+
from datetime import datetime, timezone
55
from typing import Any
66

77
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
@@ -29,7 +29,7 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
2929
# Append release_date to _version.py after hatch-vcs generates it
3030
version_file = os.path.join(self.root, "_version.py")
3131
with open(version_file, "a", encoding="utf-8") as f:
32-
release_date = datetime.today().strftime("%B %d, %Y")
32+
release_date = datetime.now(timezone.utc).strftime("%B %d, %Y")
3333
f.write(f"\n__release_date__ = release_date = '{release_date}'\n")
3434

3535
for destination in self.config["copy_version_py"]["destinations"]:

pipeline/setup-runner.py

100644100755
Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,23 @@
1414
from botocore.config import Config
1515

1616
C4D_INSTALLERS = {
17+
"2024": {
18+
"windows": {
19+
"s3_key": "cinema4d/2024/Cinema4D_2024_2024.5.1_Win.exe",
20+
"sha256": "e71f7f103bb783fc5155e1b43e057d20c839052a0fe712ea3f42e447acff46b1",
21+
"type": "exe",
22+
},
23+
"macos": {
24+
"s3_key": "cinema4d/2024/Cinema4D_2024_2024.5.1_Mac.dmg",
25+
"sha256": "08d3d0efc8dd06f69fae8f86bf50539689b12029a2ac79c0d6c358f7d9d63edc",
26+
"type": "dmg",
27+
},
28+
},
1729
"2025": {
1830
"windows": {
19-
"s3_key": "cinema4d/2025/Cinema4D_2025_2025.3.3_Win.zip",
20-
"sha256": "fcf0ea40af73727f1bc1fb1a47ea0c2f3476f0652824d3b740181dc1a6123e09",
21-
"type": "zip",
31+
"s3_key": "cinema4d/2025/Cinema4D_2025_2025.3.3_Win.exe",
32+
"sha256": "66f5f5b74f93b32490d32386c642d6857aef98629a5b3eaa88fa366b1598a18e",
33+
"type": "exe",
2234
},
2335
"macos": {
2436
"s3_key": "cinema4d/2025/Cinema4D_2025_2025.3.3_Mac.dmg",
@@ -41,6 +53,10 @@
4153
}
4254

4355
C4D_INSTALL_PATHS = {
56+
"2024": {
57+
"windows": Path("C:/Program Files/Maxon Cinema 4D 2024"),
58+
"macos": Path("/Applications/Maxon Cinema 4D 2024"),
59+
},
4460
"2025": {
4561
"windows": Path("C:/Program Files/Maxon Cinema 4D 2025"),
4662
"macos": Path("/Applications/Maxon Cinema 4D 2025"),
@@ -55,7 +71,7 @@
5571
def run(cmd, check=True):
5672
"""Run a shell command, exiting on failure if check is True."""
5773
print(f"Running: {' '.join(cmd)}")
58-
result = subprocess.run(cmd)
74+
result = subprocess.run(cmd, check=False)
5975
if check and result.returncode != 0:
6076
sys.exit(result.returncode)
6177
return result
@@ -154,6 +170,7 @@ def setup_windows(versions):
154170
],
155171
capture_output=True,
156172
text=True,
173+
check=False,
157174
)
158175
print(f"Installer exit code: {result.returncode}")
159176
print(f"Installer stdout: {result.stdout}")
@@ -182,17 +199,17 @@ def setup_windows(versions):
182199
def setup_macos(versions):
183200
"""Install Cinema 4D on macOS for each version."""
184201
for version in versions:
202+
if "macos" not in C4D_INSTALLERS.get(version, {}):
203+
print(f"ERROR: No macOS installer configured for version {version}")
204+
sys.exit(1)
205+
185206
install_dir = C4D_INSTALL_PATHS[version]["macos"]
186207
marker = install_dir / ".installed"
187208

188209
if marker.exists():
189210
print(f"Cinema 4D {version} already installed at {install_dir}")
190211
continue
191212

192-
if "macos" not in C4D_INSTALLERS.get(version, {}):
193-
print(f"ERROR: No macOS installer configured for version {version}")
194-
sys.exit(1)
195-
196213
print(f"Installing Cinema 4D {version}...")
197214
installer_info = C4D_INSTALLERS[version]["macos"]
198215
local_installer = Path(f"/tmp/{Path(installer_info['s3_key']).name}")
@@ -259,6 +276,7 @@ def setup_macos(versions):
259276
],
260277
stdin=subprocess.DEVNULL,
261278
timeout=600,
279+
check=False,
262280
)
263281
print(f"Installer exit code: {result.returncode}")
264282

@@ -317,9 +335,8 @@ def _configure_rlm_licensing(versions, platform_key):
317335
# write to a temp file first then sudo cp it into place.
318336
import tempfile
319337

320-
tmp = tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt")
321-
tmp.write(new_content)
322-
tmp.close()
338+
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt") as tmp:
339+
tmp.write(new_content)
323340
run(["sudo", "cp", tmp.name, str(config_txt)])
324341
os.unlink(tmp.name)
325342
else:
@@ -333,7 +350,7 @@ def _configure_rlm_licensing(versions, platform_key):
333350
"--versions",
334351
nargs="+",
335352
required=True,
336-
help="Cinema 4D versions to install (e.g., 2025 2026)",
353+
help="Cinema 4D versions to install (e.g., 2024 2025 2026)",
337354
)
338355
args = parser.parse_args()
339356

requirements-testing.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ mypy == 2.*
44
pytest == 9.*
55
pytest-cov == 7.*
66
pytest-xdist == 3.*
7-
ruff == 0.15.*
8-
twine == 6.*
7+
ruff == 0.16.*
8+
twine == 7.*
99
types-pyyaml == 6.*
1010
# for integ tests
1111
numpy == 2.*; python_version >= "3.12"
1212
numpy >= 2.2.6, < 2.5; python_version < "3.12"
1313
pillow == 12.*
1414
openjd-cli == 0.7.*
1515
fonttools >= 4.0.0
16-
deadline-cloud-test-fixtures >= 0.18.17
16+
deadline-cloud-test-fixtures >= 0.18.18
1717
# Drives the real submitter dialog via the OS accessibility tree.
1818
# Used by test/integ/.
19-
xa11y >= 0.11.0
19+
xa11y >= 0.13.0

scripts/_project.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from enum import Enum
88
from pathlib import Path
99
from tempfile import TemporaryDirectory
10-
from typing import Any, Optional
10+
from typing import Any
1111

1212
ADAPTOR_ONLY_DEPENDENCIES = {"openjd-adaptor-runtime"}
1313

@@ -18,7 +18,7 @@ class CPUArch(Enum):
1818
AMD64: str = "amd64"
1919

2020

21-
def get_project_dict(project_path: Optional[Path] = None) -> dict[str, Any]:
21+
def get_project_dict(project_path: Path | None = None) -> dict[str, Any]:
2222
if sys.version_info < (3, 11):
2323
with TemporaryDirectory() as toml_env:
2424
toml_install_pip_args = ["pip", "install", "--target", toml_env, "toml"]
@@ -52,9 +52,9 @@ def __repr__(self) -> str:
5252

5353
def get_dependencies(pyproject_dict: dict[str, Any], exclude_adaptor_only=True) -> list[Dependency]:
5454
if "project" not in pyproject_dict:
55-
raise Exception("pyproject.toml is missing project section")
55+
raise ValueError("pyproject.toml is missing project section")
5656
if "dependencies" not in pyproject_dict["project"]:
57-
raise Exception("pyproject.toml is missing dependencies section")
57+
raise ValueError("pyproject.toml is missing dependencies section")
5858

5959
return [
6060
Dependency(dep_str)

0 commit comments

Comments
 (0)