обновлён /admin/config и API для os_registry. - Molecule/раннер: env из конфигурации, ensure roleforge-os (ensure_roleforge_os.yml), os_registry_pull и доработки executors / runner / create.yml. - /admin/os-images: выбор реестра, buildx (в т.ч. split amd64+arm64 + imagetools), опция --no-cache, стрим логов; domain.py: план команд build, ретраи push. - UI: брендинг (app_name, app_tagline) из app_config через get_ui_branding_context; base.xhtml, role-create / role-view, core.js, pages-main, стили. - Dockerfiles: требование Python ≥3.9 (assert), доработки alt9/astra/debian9/ubuntu20 и др.; новые Dockerfile.arm64 для centos7/centos8. - Конфиг: .env.example, config.py, pyproject.toml.
115 lines
7.5 KiB
HTML
115 lines
7.5 KiB
HTML
{% extends "base.xhtml" %}
|
|
{% from "macros/page-hero.xhtml" import page_hero %}
|
|
{% block content %}
|
|
<div class="dashboard-page">
|
|
{{ page_hero("Admin", "OS Images", "Build test images from dockerfiles for Molecule runs.") }}
|
|
<section class="dashboard-panel dashboard-panel--primary">
|
|
<div class="dashboard-panel-h">
|
|
<div>
|
|
<h2 class="dashboard-panel-title">Image Build</h2>
|
|
<p class="dashboard-panel-sub">Build images from <code>dockerfiles/</code>. Push layout uses <code>:<os></code> tag on the registry; after build, copy the suggested <code>docker pull</code> / <code>docker tag</code> lines so Molecule keeps using <code>roleforge-os:<os></code> locally.</p>
|
|
<p id="admin-os-registry-note" class="muted small-note" style="display:none"></p>
|
|
</div>
|
|
</div>
|
|
<div class="admin-os-registry-target">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-registry-provider">Push registry</label>
|
|
<select id="admin-os-registry-provider" aria-label="Push registry">
|
|
<option value="hub">Docker Hub (hub.docker.com)</option>
|
|
<option value="harbor">Harbor</option>
|
|
<option value="nexus">Sonatype Nexus Repository</option>
|
|
</select>
|
|
</div>
|
|
<div id="admin-os-registry-panel-hub" class="admin-os-registry-panel">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-repo-path-hub">Repository path</label>
|
|
<input id="admin-os-repo-path-hub" type="text" autocomplete="off" placeholder="username/repo (e.g. inecs/roleforge)" />
|
|
</div>
|
|
<div class="admin-os-registry-doc-links" role="group" aria-label="Docker Hub">
|
|
<a id="admin-os-dynamic-repo-link" class="admin-os-doc-link" href="https://hub.docker.com/" target="_blank" rel="noopener noreferrer">
|
|
<span class="admin-os-doc-link__text">Repository on Hub</span>
|
|
</a>
|
|
<a class="admin-os-doc-link" href="https://docs.docker.com/docker-hub/" target="_blank" rel="noopener noreferrer">
|
|
<span class="admin-os-doc-link__text">Docker Hub docs</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div id="admin-os-registry-panel-harbor" class="admin-os-registry-panel admin-os-registry-panel--hidden" hidden="hidden">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-registry-host-harbor">Registry host</label>
|
|
<input id="admin-os-registry-host-harbor" type="text" autocomplete="off" placeholder="harbor.example.com or host:443" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-repo-path-harbor">Project / image path</label>
|
|
<input id="admin-os-repo-path-harbor" type="text" autocomplete="off" placeholder="project/service-image" />
|
|
</div>
|
|
<div class="admin-os-registry-doc-links" role="group" aria-label="Harbor documentation">
|
|
<a id="admin-os-help-harbor" class="admin-os-doc-link" href="https://goharbor.io/docs/" target="_blank" rel="noopener noreferrer">
|
|
<span class="admin-os-doc-link__text">Harbor documentation</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div id="admin-os-registry-panel-nexus" class="admin-os-registry-panel admin-os-registry-panel--hidden" hidden="hidden">
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-registry-host-nexus">Registry host</label>
|
|
<input id="admin-os-registry-host-nexus" type="text" autocomplete="off" placeholder="nexus.example.com:8083" />
|
|
</div>
|
|
<div class="schema-field schema-field--wide admin-os-registry-field">
|
|
<label class="schema-field-label" for="admin-os-repo-path-nexus">Docker repository path</label>
|
|
<input id="admin-os-repo-path-nexus" type="text" autocomplete="off" placeholder="repository/docker-hosted/my-image" />
|
|
</div>
|
|
<div class="admin-os-registry-doc-links" role="group" aria-label="Nexus Docker repositories">
|
|
<a id="admin-os-help-nexus" class="admin-os-doc-link" href="https://help.sonatype.com/repomanager3/formats/docker-registry/docker-registry-repositories" target="_blank" rel="noopener noreferrer">
|
|
<span class="admin-os-doc-link__text">Nexus Docker repositories</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="admin-os-docker-auth schema-field schema-field--wide">
|
|
<label class="schema-field-label" for="admin-os-docker-user">Registry username</label>
|
|
<input id="admin-os-docker-user" type="text" name="docker-login-user" autocomplete="username" placeholder="Username for docker login" />
|
|
<label class="schema-field-label" for="admin-os-docker-password">Password or access token</label>
|
|
<input id="admin-os-docker-password" type="password" name="docker-login-password" autocomplete="current-password" placeholder="Required before each build" />
|
|
<p class="muted small-note">Sent only for this session to run <code>docker login</code> on the server; not stored.</p>
|
|
</div>
|
|
<div class="admin-os-selectors">
|
|
<div class="admin-os-selectors__head">
|
|
<strong>Images to build</strong>
|
|
<div class="admin-os-selectors__actions">
|
|
<button type="button" class="menu-link" id="admin-os-images-select-all">Select all</button>
|
|
<button type="button" class="menu-link" id="admin-os-images-select-none">Select none</button>
|
|
</div>
|
|
</div>
|
|
<div id="admin-os-images-list" class="admin-os-images-list" aria-live="polite"></div>
|
|
</div>
|
|
<div class="admin-os-mini-card" aria-live="polite">
|
|
<div class="admin-os-mini-card__top">
|
|
<span id="admin-os-images-state" class="admin-os-mini-card__state admin-os-state--idle">Idle</span>
|
|
<span id="admin-os-images-summary" class="admin-os-mini-card__summary muted small-note">Discovered 0 dockerfile variants.</span>
|
|
</div>
|
|
<div class="admin-os-mini-card__chips">
|
|
<span class="admin-os-build-status__chip admin-os-build-status__chip--built">Built: <strong id="admin-os-images-built">0</strong></span>
|
|
<span class="admin-os-build-status__chip admin-os-build-status__chip--failed">Failed: <strong id="admin-os-images-failed">0</strong></span>
|
|
<span class="admin-os-build-status__chip admin-os-build-status__chip--total">Total: <strong id="admin-os-images-total">0</strong></span>
|
|
</div>
|
|
<div class="admin-os-mini-card__bar-wrap">
|
|
<div id="admin-os-images-progress" class="admin-os-build-status__bar" style="width:0%"></div>
|
|
</div>
|
|
</div>
|
|
<label class="schema-field schema-field--wide">
|
|
<textarea id="admin-os-images-logs" rows="20" readonly placeholder="Build logs will appear here..."></textarea>
|
|
</label>
|
|
<div class="admin-os-toolbar">
|
|
<label class="admin-os-no-cache" for="admin-os-images-no-cache">
|
|
<input type="checkbox" id="admin-os-images-no-cache" />
|
|
<span>Do not use build cache (<code>--no-cache</code>)</span>
|
|
</label>
|
|
<div class="roles-form-actions admin-os-toolbar__actions">
|
|
<button type="button" class="cta-button" id="admin-os-images-build-btn">Build selected images</button>
|
|
<button type="button" class="btn-danger" id="admin-os-images-stop-btn" disabled="disabled">Stop build</button>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
{% endblock %}
|