Add the Danish and Bahasa Malaysia wiki pages
Validate workflows / validate (pull_request) Successful in 15s
Validate workflows / validate (pull_request) Successful in 15s
Draft ten translations (Home, Onboarding, Credentials, Troubleshooting, Capabilities in da and ms) with the source hash header from ADR-0001, a language switcher on every page and a term list. build_wiki.py --check now reports missing or stale translations, and tests assert that translations follow the structure of the English page. The drafts await review by a native reader (MIL-005 task 5). Task: MIL-005#4
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# Wiki term list
|
||||
|
||||
Terms used in the Danish (`da`) and Bahasa Malaysia (`ms`) wiki pages, so the
|
||||
same English word is always translated the same way (ADR-0001, MIL-005 task 4).
|
||||
English is authoritative. A term in parentheses is shown once beside the
|
||||
translation when a reader may only know the English word.
|
||||
|
||||
This is a working list for translators and reviewers, not a project artifact.
|
||||
Add a row when a translation needs a term that is not here, in the same pull
|
||||
request.
|
||||
|
||||
## Kept in English
|
||||
|
||||
These stay as they are in every language: `workflow_dispatch`, `runs-on`, the
|
||||
names of secrets and workflows (`TOKEN_FOR_GITEA`, **Sync GitHub mirror
|
||||
metadata**, **Publish wiki**), command lines, file names, JSON keys, scope
|
||||
names, status labels such as `online` and `waiting`, and the workflow's
|
||||
messages, including the category names (`configuration`, `credentials`,
|
||||
`permissions`, `api`).
|
||||
|
||||
| English | Danish (`da`) | Bahasa Malaysia (`ms`) | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| runner | runner | runner | Not translated in either language. |
|
||||
| label (of a runner) | label | label | |
|
||||
| token | token | token | |
|
||||
| repository | repository | repositori | Danish IT language keeps the English word. |
|
||||
| mirror, push mirror | spejl, push-spejl | cermin, push mirror | Malay keeps `push mirror` where it is the Gitea feature name. |
|
||||
| secret | secret | rahsia (secret) | Gitea's own term is `secret`. |
|
||||
| description | beskrivelse | penerangan | |
|
||||
| topics (of a repository) | emner (topics) | topik | |
|
||||
| workflow | workflow | aliran kerja (workflow) | |
|
||||
| least privilege | mindste rettigheder | keistimewaan paling minimum | |
|
||||
| permission | tilladelse | kebenaran | |
|
||||
| scope (of a token) | scope | skop | `scope` is the Gitea term in the UI. |
|
||||
| preflight check | forhåndskontrol (preflight) | semakan awal (preflight) | The log line `Preflight passed` stays in English. |
|
||||
| credentials | credentials | kelayakan (credentials) | |
|
||||
| rotate a token | udskifte et token | menukar token | |
|
||||
| revoke | tilbagekalde | membatalkan | |
|
||||
| onboard a repository | tilslutte et repository | menyertakan repositori | |
|
||||
| DevOps professional | DevOps-professionel | profesional DevOps | |
|
||||
| software engineer | softwareudvikler | jurutera perisian | |
|
||||
| capability | funktionalitet | keupayaan | |
|
||||
| implemented | implementeret | dilaksanakan | |
|
||||
| planned | planlagt | dirancang | |
|
||||
| verified, not verified | verificeret, ikke verificeret | disahkan, belum disahkan | |
|
||||
| schedule (cron) | tidsplan | jadual | |
|
||||
| manual run | manuel kørsel | pencetusan manual | |
|
||||
| pull request | pull request | pull request | Not translated. |
|
||||
| use case | use case | kes guna (use case) | |
|
||||
| Project Plan | projektplan | Pelan Projek | |
|
||||
| wiki | wiki | wiki | |
|
||||
@@ -179,3 +179,91 @@ class TestWriteAndCheck:
|
||||
def test_committed_wiki_pages_are_current():
|
||||
"""The pages in wiki/ match what README.md and guides/ produce."""
|
||||
assert build_wiki.check_pages() == []
|
||||
|
||||
|
||||
class TestLanguageSwitcher:
|
||||
def test_english_page_links_to_the_translations(self):
|
||||
assert build_wiki.language_switcher("Home") == (
|
||||
"English | [Dansk](Home.da) | [Bahasa Melayu](Home.ms)"
|
||||
)
|
||||
|
||||
def test_translation_does_not_link_to_itself(self):
|
||||
assert build_wiki.language_switcher("Home", "da") == (
|
||||
"[English](Home) | Dansk | [Bahasa Melayu](Home.ms)"
|
||||
)
|
||||
|
||||
|
||||
class TestCheckTranslations:
|
||||
@pytest.fixture()
|
||||
def repo(self, tmp_path):
|
||||
root = tmp_path / "repo"
|
||||
root.mkdir()
|
||||
_write_sources(root)
|
||||
return root
|
||||
|
||||
@staticmethod
|
||||
def write_translations(wiki, repo, only_hash=None):
|
||||
english = build_wiki.build_all(repo)
|
||||
wiki.mkdir(exist_ok=True)
|
||||
for page in build_wiki.PAGES:
|
||||
digest = only_hash or build_wiki.source_hash(
|
||||
english[f"{page.name}.md"].encode("utf-8")
|
||||
)
|
||||
for code, _label in build_wiki.LANGUAGES:
|
||||
(wiki / f"{page.name}.{code}.md").write_text(
|
||||
f"<!-- translation of {page.name}.md, source sha256 {digest} -->\n\nText\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
def test_current_translations_pass(self, repo, tmp_path):
|
||||
wiki = tmp_path / "wiki"
|
||||
self.write_translations(wiki, repo)
|
||||
assert build_wiki.check_translations(wiki, repo) == []
|
||||
|
||||
def test_reports_missing_translations(self, repo, tmp_path):
|
||||
wiki = tmp_path / "wiki"
|
||||
self.write_translations(wiki, repo)
|
||||
(wiki / "Home.ms.md").unlink()
|
||||
assert build_wiki.check_translations(wiki, repo) == ["Home.ms.md: missing"]
|
||||
|
||||
def test_reports_a_stale_translation(self, repo, tmp_path):
|
||||
wiki = tmp_path / "wiki"
|
||||
self.write_translations(wiki, repo)
|
||||
(repo / "guides" / "onboarding.md").write_text("# Changed\n", encoding="utf-8")
|
||||
problems = build_wiki.check_translations(wiki, repo)
|
||||
assert [p.split(":")[0] for p in problems] == ["Onboarding.da.md", "Onboarding.ms.md"]
|
||||
assert all("stale" in problem for problem in problems)
|
||||
|
||||
def test_reports_a_missing_or_wrong_header(self, repo, tmp_path):
|
||||
wiki = tmp_path / "wiki"
|
||||
self.write_translations(wiki, repo)
|
||||
(wiki / "Home.da.md").write_text("no header\n", encoding="utf-8")
|
||||
assert build_wiki.check_translations(wiki, repo) == [
|
||||
"Home.da.md: first line is not the translation header"
|
||||
]
|
||||
|
||||
|
||||
def _shape(text: str) -> dict:
|
||||
lines = text.splitlines()
|
||||
return {
|
||||
"fences": sum(line.startswith("```") for line in lines),
|
||||
"table_rows": sum(line.startswith("|") for line in lines),
|
||||
"heading_levels": [
|
||||
len(line) - len(line.lstrip("#")) for line in lines if line.startswith("#")
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize("page", [page.name for page in build_wiki.PAGES])
|
||||
@pytest.mark.parametrize("code", [code for code, _label in build_wiki.LANGUAGES])
|
||||
def test_committed_translations_follow_the_english_structure(page, code):
|
||||
"""A translation has the same code blocks, table rows and heading levels."""
|
||||
wiki = REPO_ROOT / "wiki"
|
||||
english = _shape((wiki / f"{page}.md").read_text(encoding="utf-8"))
|
||||
translated = _shape((wiki / f"{page}.{code}.md").read_text(encoding="utf-8"))
|
||||
assert translated == english
|
||||
|
||||
|
||||
def test_committed_translations_are_current():
|
||||
"""No translation follows an older version of its English page."""
|
||||
assert build_wiki.check_translations() == []
|
||||
|
||||
+68
-2
@@ -10,6 +10,7 @@ Usage:
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import posixpath
|
||||
import re
|
||||
import sys
|
||||
@@ -45,6 +46,13 @@ PAGES: tuple[Page, ...] = (
|
||||
Page("Capabilities", "README.md", ("Capabilities",)),
|
||||
)
|
||||
|
||||
# Translations (ADR-0001): `<Page>.<code>` written by hand in wiki/.
|
||||
LANGUAGES: tuple[tuple[str, str], ...] = (("da", "Dansk"), ("ms", "Bahasa Melayu"))
|
||||
HASH_LENGTH = 12
|
||||
_TRANSLATION_HEADER = re.compile(
|
||||
r"^<!-- translation of (?P<page>\S+)\.md, source sha256 (?P<hash>[0-9a-f]+) -->$"
|
||||
)
|
||||
|
||||
# The page a link to a source file should point to. The README is the home page.
|
||||
_PAGE_FOR_SOURCE = {
|
||||
"README.md": "Home",
|
||||
@@ -124,6 +132,22 @@ def split_h2_sections(text: str) -> tuple[list[str], dict[str, list[str]]]:
|
||||
return preamble, sections
|
||||
|
||||
|
||||
def language_switcher(page_name: str, current: str | None = None) -> str:
|
||||
"""Return the line that links a page to its other languages.
|
||||
|
||||
``current`` is a language code, or None for the English page.
|
||||
"""
|
||||
items = ["English" if current is None else f"[English]({page_name})"]
|
||||
for code, label in LANGUAGES:
|
||||
items.append(label if code == current else f"[{label}]({page_name}.{code})")
|
||||
return " | ".join(items)
|
||||
|
||||
|
||||
def source_hash(content: bytes) -> str:
|
||||
"""Return the short content hash a translation records for its source."""
|
||||
return hashlib.sha256(content).hexdigest()[:HASH_LENGTH]
|
||||
|
||||
|
||||
def render_page(page: Page, repo_root: Path = REPO_ROOT) -> str:
|
||||
"""Return the full Markdown of one wiki page."""
|
||||
source_path = repo_root / page.source
|
||||
@@ -150,6 +174,7 @@ def render_page(page: Page, repo_root: Path = REPO_ROOT) -> str:
|
||||
f"> This page is generated from [`{page.source}`]"
|
||||
f"({SOURCE_BASE_URL}/{page.source}). Changes made here are overwritten "
|
||||
"the next time the wiki is published.\n\n"
|
||||
f"{language_switcher(page.name)}\n\n"
|
||||
)
|
||||
body = convert_markdown("\n".join(body_lines), page.source).strip("\n")
|
||||
return banner + body + "\n"
|
||||
@@ -185,18 +210,59 @@ def check_pages(wiki_dir: Path = WIKI_DIR, repo_root: Path = REPO_ROOT) -> list[
|
||||
return problems
|
||||
|
||||
|
||||
def check_translations(
|
||||
wiki_dir: Path = WIKI_DIR, repo_root: Path = REPO_ROOT
|
||||
) -> list[str]:
|
||||
"""Return a message for every translation that is missing or stale.
|
||||
|
||||
A translation is stale when the hash it records no longer matches the
|
||||
English page it follows (the English page changed after it was written).
|
||||
"""
|
||||
problems: list[str] = []
|
||||
english = build_all(repo_root)
|
||||
for page in PAGES:
|
||||
current = source_hash(english[f"{page.name}.md"].encode("utf-8"))
|
||||
for code, _label in LANGUAGES:
|
||||
name = f"{page.name}.{code}.md"
|
||||
path = wiki_dir / name
|
||||
if not path.exists():
|
||||
problems.append(f"{name}: missing")
|
||||
continue
|
||||
lines = path.read_text(encoding="utf-8").splitlines()
|
||||
match = _TRANSLATION_HEADER.match(lines[0]) if lines else None
|
||||
if match is None or match.group("page") != page.name:
|
||||
problems.append(f"{name}: first line is not the translation header")
|
||||
elif match.group("hash") != current:
|
||||
problems.append(
|
||||
f"{name}: stale, follows {match.group('hash')} but "
|
||||
f"{page.name}.md is {current}"
|
||||
)
|
||||
return problems
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
"""Run the generator; return the process exit code."""
|
||||
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
||||
parser.add_argument(
|
||||
"--check",
|
||||
action="store_true",
|
||||
help="report pages that differ from their sources and exit 1",
|
||||
help="report pages that differ from their sources or stale translations, exit 1",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--hash",
|
||||
metavar="PAGE",
|
||||
help="print the source hash a translation of PAGE must record",
|
||||
)
|
||||
args = parser.parse_args(argv)
|
||||
try:
|
||||
if args.hash:
|
||||
content = build_all().get(f"{args.hash}.md")
|
||||
if content is None:
|
||||
raise WikiBuildError(f"unknown page '{args.hash}'")
|
||||
print(source_hash(content.encode("utf-8")))
|
||||
return 0
|
||||
if args.check:
|
||||
problems = check_pages()
|
||||
problems = check_pages() + check_translations()
|
||||
for problem in problems:
|
||||
print(f"ERROR: wiki/{problem}", file=sys.stderr)
|
||||
if problems:
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<!-- translation of Capabilities.md, source sha256 468c912e521b -->
|
||||
|
||||
> Dette er en oversættelse af [`Capabilities`](Capabilities). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres.
|
||||
|
||||
[English](Capabilities) | Dansk | [Bahasa Melayu](Capabilities.ms)
|
||||
|
||||
## Funktionalitet
|
||||
|
||||
Kun den første række er implementeret. Resten er planlagt og følges i [projektplanen](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/docs/project-plan.md), som også beskriver hver enkelt use case.
|
||||
|
||||
| Funktionalitet | Status |
|
||||
| --- | --- |
|
||||
| Synkronisering af repositorymetadata (Gitea til GitHub-spejl) | Implementeret i `.gitea/scoped_workflows/`, med offline-tests og et valideringsworkflow |
|
||||
| Konfiguration og validering af workflow-credentials | Implementeret for synkroniseringsworkflowet: en forhåndskontrol tjekker begge tokens før enhver ændring ([vejledning](Credentials.da)) |
|
||||
| Tilslutning af et repository, administration af runners, fejlfinding | Vejledninger er skrevet ([tilslutning](Onboarding.da), [fejlfinding](Troubleshooting.da)); scoped levering til andre repositories er ikke verificeret endnu; korte use cases er åbne (MIL-002) |
|
||||
| Fælles kvalitetskontrol | Planlagt (MIL-003) |
|
||||
| Versioneret udgivelse og publicering | Planlagt (MIL-004) |
|
||||
|
||||
### Synkronisering af GitHub-metadata
|
||||
|
||||
Synkroniserer Gitea-repositoryets beskrivelse og emner til GitHub push-spejlet.
|
||||
|
||||
#### Tidsplan (cron)
|
||||
|
||||
Dagligt kl. 03:17 UTC (`17 3 * * *`) samt ved hvert push til `main` og manuel `workflow_dispatch`.
|
||||
|
||||
#### Workflow
|
||||
|
||||
```plantuml
|
||||
@startuml
|
||||
title Sync Gitea repository description and topics to GitHub
|
||||
|
||||
autonumber
|
||||
|
||||
actor "Push to main,\nmanual trigger, or schedule" as Trigger
|
||||
participant "Gitea Actions\nsync-github-metadata" as Workflow
|
||||
participant "Gitea REST API" as Gitea
|
||||
participant "GitHub REST API" as GitHub
|
||||
|
||||
Trigger -> Workflow: Start workflow
|
||||
activate Workflow
|
||||
|
||||
Workflow -> Workflow: Read and validate secrets
|
||||
note right
|
||||
TOKEN_FOR_GITEA
|
||||
CREDENTIALS_FOR_GITHUB
|
||||
end note
|
||||
|
||||
alt secret validation failed
|
||||
Workflow --> Trigger: workflow failed
|
||||
end
|
||||
|
||||
|
||||
Workflow -> Gitea: GET /repos/{owner}/{repo}
|
||||
Gitea --> Workflow: Description and topics
|
||||
|
||||
Workflow -> Gitea: GET /repos/{owner}/{repo}/push_mirrors
|
||||
Gitea --> Workflow: Push mirror response
|
||||
|
||||
alt mirrors is not a list
|
||||
Workflow --> Trigger: Log a warning and succeed\n(GitHub metadata not synced)
|
||||
else mirrors is a list with no GitHub mirror
|
||||
Workflow --> Trigger: Log that there is nothing to sync and succeed
|
||||
else mirrors is a list
|
||||
Workflow -> Workflow: Find GitHub owner and repo from remote_address
|
||||
|
||||
Workflow -> GitHub: PATCH /repos/{owner}/{repo}\n{description}
|
||||
GitHub --> Workflow: Repository updated
|
||||
|
||||
Workflow -> GitHub: PUT /repos/{owner}/{repo}/topics\n{names}
|
||||
GitHub --> Workflow: Topics updated
|
||||
|
||||
Workflow --> Trigger: Sync completed
|
||||
else Gitea API denies access
|
||||
Gitea --> Workflow: HTTP 403 Forbidden
|
||||
Workflow --> Trigger: Workflow fails
|
||||
else GitHub API denies access
|
||||
GitHub --> Workflow: HTTP error
|
||||
Workflow --> Trigger: Workflow fails
|
||||
end
|
||||
deactivate Workflow
|
||||
@enduml
|
||||
```
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> This page is generated from [`README.md`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/README.md). Changes made here are overwritten the next time the wiki is published.
|
||||
|
||||
English | [Dansk](Capabilities.da) | [Bahasa Melayu](Capabilities.ms)
|
||||
|
||||
## Capabilities
|
||||
|
||||
Only the first row is implemented. The rest is planned and tracked in the [Project Plan](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/docs/project-plan.md), which also describes each use case.
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<!-- translation of Capabilities.md, source sha256 468c912e521b -->
|
||||
|
||||
> Ini ialah terjemahan [`Capabilities`](Capabilities). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya.
|
||||
|
||||
[English](Capabilities) | [Dansk](Capabilities.da) | Bahasa Melayu
|
||||
|
||||
## Keupayaan
|
||||
|
||||
Hanya baris pertama yang dilaksanakan. Selebihnya dirancang dan dijejaki dalam [Pelan Projek](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/docs/project-plan.md), yang juga menerangkan setiap kes guna (use case).
|
||||
|
||||
| Keupayaan | Status |
|
||||
| --- | --- |
|
||||
| Menyegerakkan metadata repositori (Gitea ke cermin GitHub) | Dilaksanakan dalam `.gitea/scoped_workflows/`, dengan ujian luar talian dan aliran kerja pengesahan |
|
||||
| Mengkonfigur dan mengesahkan kelayakan (credentials) aliran kerja | Dilaksanakan untuk aliran kerja penyegerakan: semakan awal (preflight) memeriksa kedua-dua token sebelum sebarang perubahan ([panduan](Credentials.ms)) |
|
||||
| Menyertakan repositori, mengurus runner, mendiagnosis kegagalan | Panduan telah ditulis ([menyertakan repositori](Onboarding.ms), [diagnosis](Troubleshooting.ms)); penghantaran scoped ke repositori lain belum disahkan; use case ringkas masih terbuka (MIL-002) |
|
||||
| Semakan kualiti bersama | Dirancang (MIL-003) |
|
||||
| Keluaran dan penerbitan berversi | Dirancang (MIL-004) |
|
||||
|
||||
### Menyegerakkan metadata GitHub
|
||||
|
||||
Menyegerakkan penerangan dan topik repositori Gitea ke push mirror GitHub.
|
||||
|
||||
#### Jadual (cron)
|
||||
|
||||
Setiap hari pada 03:17 UTC (`17 3 * * *`), serta pada setiap push ke `main` dan `workflow_dispatch` manual.
|
||||
|
||||
#### Aliran kerja
|
||||
|
||||
```plantuml
|
||||
@startuml
|
||||
title Sync Gitea repository description and topics to GitHub
|
||||
|
||||
autonumber
|
||||
|
||||
actor "Push to main,\nmanual trigger, or schedule" as Trigger
|
||||
participant "Gitea Actions\nsync-github-metadata" as Workflow
|
||||
participant "Gitea REST API" as Gitea
|
||||
participant "GitHub REST API" as GitHub
|
||||
|
||||
Trigger -> Workflow: Start workflow
|
||||
activate Workflow
|
||||
|
||||
Workflow -> Workflow: Read and validate secrets
|
||||
note right
|
||||
TOKEN_FOR_GITEA
|
||||
CREDENTIALS_FOR_GITHUB
|
||||
end note
|
||||
|
||||
alt secret validation failed
|
||||
Workflow --> Trigger: workflow failed
|
||||
end
|
||||
|
||||
|
||||
Workflow -> Gitea: GET /repos/{owner}/{repo}
|
||||
Gitea --> Workflow: Description and topics
|
||||
|
||||
Workflow -> Gitea: GET /repos/{owner}/{repo}/push_mirrors
|
||||
Gitea --> Workflow: Push mirror response
|
||||
|
||||
alt mirrors is not a list
|
||||
Workflow --> Trigger: Log a warning and succeed\n(GitHub metadata not synced)
|
||||
else mirrors is a list with no GitHub mirror
|
||||
Workflow --> Trigger: Log that there is nothing to sync and succeed
|
||||
else mirrors is a list
|
||||
Workflow -> Workflow: Find GitHub owner and repo from remote_address
|
||||
|
||||
Workflow -> GitHub: PATCH /repos/{owner}/{repo}\n{description}
|
||||
GitHub --> Workflow: Repository updated
|
||||
|
||||
Workflow -> GitHub: PUT /repos/{owner}/{repo}/topics\n{names}
|
||||
GitHub --> Workflow: Topics updated
|
||||
|
||||
Workflow --> Trigger: Sync completed
|
||||
else Gitea API denies access
|
||||
Gitea --> Workflow: HTTP 403 Forbidden
|
||||
Workflow --> Trigger: Workflow fails
|
||||
else GitHub API denies access
|
||||
GitHub --> Workflow: HTTP error
|
||||
Workflow --> Trigger: Workflow fails
|
||||
end
|
||||
deactivate Workflow
|
||||
@enduml
|
||||
```
|
||||
@@ -0,0 +1,71 @@
|
||||
<!-- translation of Credentials.md, source sha256 59f87b6dca4b -->
|
||||
|
||||
> Dette er en oversættelse af [`Credentials`](Credentials). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres.
|
||||
|
||||
[English](Credentials) | Dansk | [Bahasa Melayu](Credentials.ms)
|
||||
|
||||
# Workflow-credentials
|
||||
|
||||
Synkroniseringsworkflowet bruger to secrets. Giv hver af dem de mindste rettigheder, der virker, gem den kun som en Gitea-secret, og skift den, når en person med adgang forlader teamet.
|
||||
|
||||
| Secret | Indhold | Bruges til |
|
||||
| --- | --- | --- |
|
||||
| `TOKEN_FOR_GITEA` | Et almindeligt token, en JSON-streng eller JSON med `GITEA_TOKEN` | At læse repositoryet (beskrivelse, emner) og dets push-spejle |
|
||||
| `CREDENTIALS_FOR_GITHUB` | JSON-objekt med et `GITHUB_PAT`, der ikke er tomt | At ændre beskrivelse og emner på GitHub-spejlet |
|
||||
|
||||
## Mindste rettigheder
|
||||
|
||||
Disse kommer fra dokumentationen til Gitea og GitHub og fra de API-kald, workflowet foretager. De er **endnu ikke bekræftet med et minimalt token på denne instans**; S05 bør bekræfte dem, når tokens oprettes.
|
||||
|
||||
**Gitea-token** (et personal access token for en bruger, ikke en deploy key; deploy keys virker ikke til REST API'et):
|
||||
|
||||
- scope `read:repository`
|
||||
- brugeren skal have lov til at læse repositoryets push-spejle, hvilket Gitea begrænser til repository-administratorer
|
||||
|
||||
Kald, der foretages: `GET /repos/{owner}/{repo}` og `GET /repos/{owner}/{repo}/push_mirrors`.
|
||||
|
||||
**GitHub-token** (fine-grained personal access token):
|
||||
|
||||
- Resource owner: ejeren af spejl-repositoryet
|
||||
- Repository access: kun spejl-repositoryet
|
||||
- Repository permission: **Administration: Read and write** (ingen andre tilladelser)
|
||||
- Angiv en udløbsdato
|
||||
|
||||
Kald, der foretages: `GET /repos/{owner}/{repo}`, `PATCH /repos/{owner}/{repo}` (beskrivelse) og `PUT /repos/{owner}/{repo}/topics`.
|
||||
|
||||
Format for `CREDENTIALS_FOR_GITHUB`:
|
||||
|
||||
```json
|
||||
{"GITHUB_PAT": "<token>"}
|
||||
```
|
||||
|
||||
## Hvad workflowet kontrollerer, før det ændrer noget
|
||||
|
||||
Workflowet kører en forhåndskontrol (preflight) og skriver intet til GitHub, medmindre den består:
|
||||
|
||||
1. Begge secrets findes og har den forventede form.
|
||||
2. Gitea accepterer tokenet, og repositoryet er synligt med det.
|
||||
3. Højst ét GitHub push-spejl er konfigureret. Hvis der ingen er, slutter kørslen med succes uden at synkronisere, og GitHub-secreten bliver ikke læst.
|
||||
4. GitHub accepterer tokenet for spejl-repositoryet **og** tokenet melder, at det har administrationsadgang.
|
||||
|
||||
Ved succes står der i loggen `Preflight passed: Gitea and GitHub accepted the credentials.` Fejl begynder med en kategori som `[credentials]` eller `[permissions]`; se [troubleshooting.md](Troubleshooting.da). Ingen secret-værdi bliver nogensinde udskrevet.
|
||||
|
||||
## Secret til publicering af wiki
|
||||
|
||||
Workflowet **Publish wiki** (kun dette repository) kopierer `wiki/` til Gitea-wikien, når en ændring af `wiki/` flettes til `main`. Det bruger sin egen secret, så synkroniseringstokens aldrig får skriveadgang.
|
||||
|
||||
| Secret | Indhold | Bruges til |
|
||||
| --- | --- | --- |
|
||||
| `TOKEN_FOR_GITEA_WIKI` | Et almindeligt token, en JSON-streng eller JSON med `GITEA_TOKEN` | At skrive wikisiderne for dette repository |
|
||||
|
||||
- Et Gitea personal access token med scope `write:repository`. Gitea har intet scope kun til wikien, så opret tokenet til en dedikeret bruger, der kun har skriveadgang til dette repository. S05 godkender scopet, og S03 gemmer secreten.
|
||||
- Kald, der foretages: `GET /repos/{owner}/{repo}`, `GET /repos/{owner}/{repo}/wiki/pages`, `GET`, `POST` og `PATCH /repos/{owner}/{repo}/wiki/...` og, for en side, der ikke længere findes i `wiki/`, `DELETE /repos/{owner}/{repo}/wiki/page/{name}`.
|
||||
- Wikien skal være aktiveret i repositoryets indstillinger. Workflowet nægter at køre, hvis den ikke er det.
|
||||
- Wikien er altid lig med `wiki/`: sider, der er redigeret eller tilføjet i Gitea's weboverflade, overskrives eller fjernes ved næste publicering.
|
||||
|
||||
## Udskiftning af et token
|
||||
|
||||
1. Opret det nye token med de rettigheder, der er nævnt ovenfor.
|
||||
2. Erstat secret-værdien i repositoryets eller organisationens indstillinger.
|
||||
3. Kør workflowet manuelt, og vent på `Preflight passed`.
|
||||
4. Tilbagekald det gamle token.
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> This page is generated from [`guides/credentials.md`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/guides/credentials.md). Changes made here are overwritten the next time the wiki is published.
|
||||
|
||||
English | [Dansk](Credentials.da) | [Bahasa Melayu](Credentials.ms)
|
||||
|
||||
# Workflow credentials
|
||||
|
||||
The sync workflow uses two secrets. Give each the least privilege that works,
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
<!-- translation of Credentials.md, source sha256 59f87b6dca4b -->
|
||||
|
||||
> Ini ialah terjemahan [`Credentials`](Credentials). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya.
|
||||
|
||||
[English](Credentials) | [Dansk](Credentials.da) | Bahasa Melayu
|
||||
|
||||
# Kelayakan (credentials) aliran kerja
|
||||
|
||||
Aliran kerja penyegerakan menggunakan dua rahsia (secret). Beri setiap satu keistimewaan paling minimum yang berfungsi, simpan hanya sebagai secret Gitea, dan tukar apabila seseorang yang mempunyai akses meninggalkan pasukan.
|
||||
|
||||
| Secret | Kandungan | Digunakan untuk |
|
||||
| --- | --- | --- |
|
||||
| `TOKEN_FOR_GITEA` | Token biasa, rentetan JSON, atau JSON dengan `GITEA_TOKEN` | Membaca repositori (penerangan, topik) dan push mirror-nya |
|
||||
| `CREDENTIALS_FOR_GITHUB` | Objek JSON dengan `GITHUB_PAT` yang tidak kosong | Mengubah penerangan dan topik cermin GitHub |
|
||||
|
||||
## Kebenaran minimum
|
||||
|
||||
Ini datang daripada dokumentasi Gitea dan GitHub serta panggilan API yang dibuat oleh aliran kerja. Ia **belum disahkan dengan token minimum pada instans ini**; S05 harus mengesahkannya apabila token dicipta.
|
||||
|
||||
**Token Gitea** (personal access token seorang pengguna, bukan deploy key; deploy key tidak berfungsi untuk REST API):
|
||||
|
||||
- skop `read:repository`
|
||||
- pengguna mesti dibenarkan membaca push mirror repositori, yang dihadkan oleh Gitea kepada pentadbir repositori
|
||||
|
||||
Panggilan yang dibuat: `GET /repos/{owner}/{repo}` dan `GET /repos/{owner}/{repo}/push_mirrors`.
|
||||
|
||||
**Token GitHub** (fine-grained personal access token):
|
||||
|
||||
- Resource owner: pemilik repositori cermin
|
||||
- Repository access: hanya repositori cermin
|
||||
- Repository permission: **Administration: Read and write** (tiada kebenaran lain)
|
||||
- Tetapkan tarikh tamat tempoh
|
||||
|
||||
Panggilan yang dibuat: `GET /repos/{owner}/{repo}`, `PATCH /repos/{owner}/{repo}` (penerangan) dan `PUT /repos/{owner}/{repo}/topics`.
|
||||
|
||||
Format `CREDENTIALS_FOR_GITHUB`:
|
||||
|
||||
```json
|
||||
{"GITHUB_PAT": "<token>"}
|
||||
```
|
||||
|
||||
## Perkara yang disemak oleh aliran kerja sebelum mengubah apa-apa
|
||||
|
||||
Aliran kerja menjalankan semakan awal (preflight) dan tidak menulis apa-apa ke GitHub melainkan ia lulus:
|
||||
|
||||
1. Kedua-dua secret wujud dan mempunyai bentuk yang dijangka.
|
||||
2. Gitea menerima token dan repositori kelihatan dengannya.
|
||||
3. Paling banyak satu push mirror GitHub dikonfigurasi. Jika tiada, larian berakhir dengan jayanya tanpa menyegerakkan dan secret GitHub tidak dibaca.
|
||||
4. GitHub menerima token untuk repositori cermin **dan** token melaporkan akses pentadbiran padanya.
|
||||
|
||||
Apabila berjaya, log menyatakan `Preflight passed: Gitea and GitHub accepted the credentials.` Kegagalan bermula dengan kategori seperti `[credentials]` atau `[permissions]`; lihat [troubleshooting.md](Troubleshooting.ms). Tiada nilai secret yang pernah dicetak.
|
||||
|
||||
## Secret untuk menerbitkan wiki
|
||||
|
||||
Aliran kerja **Publish wiki** (repositori ini sahaja) menyalin `wiki/` ke wiki Gitea apabila perubahan pada `wiki/` digabungkan ke `main`. Ia menggunakan secret sendiri supaya token penyegerakan metadata tidak pernah mendapat akses tulis.
|
||||
|
||||
| Secret | Kandungan | Digunakan untuk |
|
||||
| --- | --- | --- |
|
||||
| `TOKEN_FOR_GITEA_WIKI` | Token biasa, rentetan JSON, atau JSON dengan `GITEA_TOKEN` | Menulis halaman wiki repositori ini |
|
||||
|
||||
- Personal access token Gitea dengan skop `write:repository`. Gitea tidak mempunyai skop untuk wiki sahaja, jadi cipta token untuk pengguna khusus yang hanya mempunyai akses tulis kepada repositori ini. S05 meluluskan skop dan S03 menyimpan secret.
|
||||
- Panggilan yang dibuat: `GET /repos/{owner}/{repo}`, `GET /repos/{owner}/{repo}/wiki/pages`, `GET`, `POST` dan `PATCH /repos/{owner}/{repo}/wiki/...` dan, bagi halaman yang tidak lagi wujud dalam `wiki/`, `DELETE /repos/{owner}/{repo}/wiki/page/{name}`.
|
||||
- Wiki mesti diaktifkan dalam tetapan repositori. Aliran kerja enggan berjalan jika ia tidak diaktifkan.
|
||||
- Wiki sentiasa sama dengan `wiki/`: halaman yang diedit atau ditambah dalam antara muka web Gitea ditimpa atau dibuang pada penerbitan seterusnya.
|
||||
|
||||
## Menukar token
|
||||
|
||||
1. Cipta token baharu dengan kebenaran di atas.
|
||||
2. Gantikan nilai secret dalam tetapan repositori atau organisasi.
|
||||
3. Jalankan aliran kerja secara manual dan tunggu `Preflight passed`.
|
||||
4. Batalkan token lama.
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- translation of Home.md, source sha256 362c897f1425 -->
|
||||
|
||||
> Dette er en oversættelse af [`Home`](Home). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres.
|
||||
|
||||
[English](Home) | Dansk | [Bahasa Melayu](Home.ms)
|
||||
|
||||
# TirSystem GitHub Actions
|
||||
|
||||
En samling af genbrugelige Gitea Actions-workflows til DevOps-professionelle og softwareudviklere, der arbejder på TirSystem-projekter.
|
||||
|
||||
|
||||
## Oversigt
|
||||
|
||||
Dette repository er den centrale samling af genbrugelig automatisering til TirSystems repositories. Det primære repository ligger på `git.tirsystem.com` (Gitea) og spejles med push til GitHub.
|
||||
|
||||
Det indeholder i øjeblikket Gitea-workflowet [`sync-github-metadata.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/scoped_workflows/sync-github-metadata.yml), som kopierer repositoryets beskrivelse og emner (topics) fra Gitea til GitHub-spejlet ved hvert push til `main`, ved manuel kørsel og dagligt kl. 03:17 UTC.
|
||||
|
||||
|
||||
## Krav
|
||||
|
||||
- En Gitea-instans med Actions aktiveret og en runner med labelen `ubuntu-latest` og `python3`
|
||||
- Et konfigureret GitHub push-spejl på Gitea-repositoryet (højst ét; repositories uden spejl springes over uden fejl)
|
||||
- Repository-secrets:
|
||||
- `TOKEN_FOR_GITEA`: Gitea API-token (almindelig tekststreng eller JSON med `GITEA_TOKEN`)
|
||||
- `CREDENTIALS_FOR_GITHUB`: JSON-objekt med `GITHUB_PAT`, et GitHub personal access token, der må redigere spejl-repositoryet
|
||||
- `TOKEN_FOR_GITEA_WIKI` (kun i dette repository, til workflowet **Publish wiki**): Gitea-token, der kan skrive til repositoryets wiki
|
||||
|
||||
|
||||
## Opsætning
|
||||
|
||||
Der skal ikke installeres afhængigheder; workflowet bruger kun Pythons standardbibliotek.
|
||||
|
||||
1. Klon repositoryet:
|
||||
```bash
|
||||
git clone ssh://git@git.tirsystem.com:10022/TirSystem/github-action.git
|
||||
```
|
||||
2. Tilføj de secrets, der er nævnt under [Krav](#krav), til repositoryets indstillinger i Gitea.
|
||||
3. Konfigurer GitHub push-spejlet i repositoryets indstillinger.
|
||||
|
||||
|
||||
## Kørsel
|
||||
|
||||
Workflows kører automatisk ved push til `main` og efter den daglige tidsplan. For at køre manuelt skal du starte **Sync GitHub mirror metadata** via `workflow_dispatch` fra fanen Actions i Gitea.
|
||||
|
||||
|
||||
## Tests
|
||||
|
||||
Workflow-filerne og den Python-kode, der er indlejret i dem, valideres af offline-tests, som hverken kræver netværksadgang eller secrets:
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python -m pytest -q tests
|
||||
```
|
||||
|
||||
De samme kontroller kører ved hver pull request og hvert push til `main` gennem [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). De parser alle workflows som YAML, kompilerer den indlejrede Python-kode, kræver eksplicitte jobtilladelser og tester parsing af credentials, parsing af push-spejlets adresse og synkroniseringsforløbet mod et falsk API.
|
||||
|
||||
Efter en ændring af synkroniseringsworkflowet skal du også starte **Sync GitHub mirror metadata** manuelt i Gitea og sammenligne beskrivelsen og emnerne på GitHub-spejlet.
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> This page is generated from [`README.md`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/README.md). Changes made here are overwritten the next time the wiki is published.
|
||||
|
||||
English | [Dansk](Home.da) | [Bahasa Melayu](Home.ms)
|
||||
|
||||
# TirSystem GitHub Actions
|
||||
|
||||
A collection of reusable Gitea Actions workflows for DevOps professionals and software engineers working on TirSystem projects.
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- translation of Home.md, source sha256 362c897f1425 -->
|
||||
|
||||
> Ini ialah terjemahan [`Home`](Home). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya.
|
||||
|
||||
[English](Home) | [Dansk](Home.da) | Bahasa Melayu
|
||||
|
||||
# TirSystem GitHub Actions
|
||||
|
||||
Koleksi aliran kerja (workflow) Gitea Actions yang boleh digunakan semula untuk profesional DevOps dan jurutera perisian yang mengusahakan projek TirSystem.
|
||||
|
||||
|
||||
## Gambaran keseluruhan
|
||||
|
||||
Repositori ini ialah koleksi pusat bagi automasi yang boleh digunakan semula untuk repositori TirSystem. Repositori utama berada di `git.tirsystem.com` (Gitea) dan dicerminkan dengan push ke GitHub.
|
||||
|
||||
Buat masa ini ia mengandungi aliran kerja Gitea [`sync-github-metadata.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/scoped_workflows/sync-github-metadata.yml), yang menyalin penerangan dan topik repositori dari Gitea ke cermin GitHub pada setiap push ke `main`, pada pencetusan manual dan setiap hari pada 03:17 UTC.
|
||||
|
||||
|
||||
## Keperluan
|
||||
|
||||
- Satu instans Gitea dengan Actions diaktifkan dan satu runner yang menyediakan `ubuntu-latest` dengan `python3`
|
||||
- Satu push mirror GitHub yang dikonfigurasi pada repositori Gitea (paling banyak satu; repositori tanpa cermin dilangkau dengan jayanya)
|
||||
- Rahsia (secret) repositori:
|
||||
- `TOKEN_FOR_GITEA`: token API Gitea (rentetan biasa, atau JSON dengan `GITEA_TOKEN`)
|
||||
- `CREDENTIALS_FOR_GITHUB`: objek JSON yang mengandungi `GITHUB_PAT`, iaitu personal access token GitHub yang dibenarkan mengubah suai repositori cermin
|
||||
- `TOKEN_FOR_GITEA_WIKI` (hanya dalam repositori ini, untuk aliran kerja **Publish wiki**): token Gitea yang boleh menulis ke wiki repositori
|
||||
|
||||
|
||||
## Persediaan
|
||||
|
||||
Tiada kebergantungan perlu dipasang; aliran kerja hanya menggunakan pustaka standard Python.
|
||||
|
||||
1. Klon repositori:
|
||||
```bash
|
||||
git clone ssh://git@git.tirsystem.com:10022/TirSystem/github-action.git
|
||||
```
|
||||
2. Tambah rahsia yang disenaraikan di bawah [Keperluan](#keperluan) ke tetapan repositori dalam Gitea.
|
||||
3. Konfigurasikan push mirror GitHub dalam tetapan repositori.
|
||||
|
||||
|
||||
## Jalankan
|
||||
|
||||
Aliran kerja berjalan secara automatik pada push ke `main` dan mengikut jadual harian. Untuk menjalankannya secara manual, cetuskan **Sync GitHub mirror metadata** melalui `workflow_dispatch` dari tab Actions dalam Gitea.
|
||||
|
||||
|
||||
## Ujian
|
||||
|
||||
Fail aliran kerja dan kod Python yang tertanam di dalamnya disahkan oleh ujian luar talian yang tidak memerlukan akses rangkaian dan tidak memerlukan rahsia:
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python -m pytest -q tests
|
||||
```
|
||||
|
||||
Semakan yang sama dijalankan pada setiap pull request dan setiap push ke `main` melalui [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). Semakan itu menghurai setiap aliran kerja sebagai YAML, mengkompil Python yang tertanam, memerlukan kebenaran kerja yang jelas, dan menguji penghuraian kelayakan (credentials), penghuraian alamat push mirror dan aliran penyegerakan terhadap API palsu.
|
||||
|
||||
Selepas perubahan pada aliran kerja penyegerakan, cetuskan juga **Sync GitHub mirror metadata** secara manual dalam Gitea dan bandingkan penerangan dan topik pada cermin GitHub.
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- translation of Onboarding.md, source sha256 044127b33c19 -->
|
||||
|
||||
> Dette er en oversættelse af [`Onboarding`](Onboarding). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres.
|
||||
|
||||
[English](Onboarding) | Dansk | [Bahasa Melayu](Onboarding.ms)
|
||||
|
||||
# Tilslutning af et repository
|
||||
|
||||
Sådan får en DevOps-professionel et TirSystem-repository til at bruge det fælles workflow **Sync GitHub mirror metadata**, og hvilke runners det kræver. Kun dette workflow findes i dag; workflows til kvalitetskontrol og udgivelse er planlagt (se [projektplanen](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/docs/project-plan.md)).
|
||||
|
||||
## Hvad er verificeret
|
||||
|
||||
| Punkt | Status |
|
||||
| --- | --- |
|
||||
| Gitea-version | 1.27.3 |
|
||||
| `.gitea/scoped_workflows/sync-github-metadata.yml` kører i dette repository | Verificeret: kørsel 16, `workflow_dispatch`, gennemført |
|
||||
| Samme workflow gælder automatisk for andre repositories | **Ikke verificeret.** Bekræft, hvordan scoped workflows leveres på instansen (admin- eller organisationsindstillinger), før du stoler på det. |
|
||||
|
||||
Indtil leveringen er verificeret, tilsluttes et repository ved at kopiere workflowet (se nedenfor).
|
||||
|
||||
## Trin
|
||||
|
||||
1. **Kontroller forudsætningerne** i repositoryet: Actions er aktiveret, og en runner med labelen `ubuntu-latest` og `python3` er online (se [Runners](#runners)).
|
||||
2. **Konfigurer ét GitHub push-spejl** i repositoryets indstillinger (Settings, Repository, Mirror settings, Push mirror). Workflowet fejler, hvis der er flere GitHub-spejle. Hvis der ingen er, lykkes det uden at synkronisere noget.
|
||||
3. **Tilføj de to secrets** i repositoryets (eller organisationens) indstillinger med de scopes, der står i [credentials.md](Credentials.da):
|
||||
- `TOKEN_FOR_GITEA`
|
||||
- `CREDENTIALS_FOR_GITHUB` (JSON med `GITHUB_PAT`)
|
||||
4. **Lever workflowet:**
|
||||
- *Hvis scoped workflows gælder for repositoryet:* der er intet at kopiere.
|
||||
- *Ellers:* kopier `.gitea/scoped_workflows/sync-github-metadata.yml` fra dette repository til `.gitea/workflows/` i mål-repositoryet. Fastlås kopien til en gennemgået version af dette repository, og kopier igen, når den ændres.
|
||||
5. **Angiv en beskrivelse og emner** på Gitea-repositoryet, så der er noget at synkronisere.
|
||||
6. **Kør det én gang manuelt:** Actions, **Sync GitHub mirror metadata**, Run workflow. Loggen skal slutte med `Synced description and topics to <owner>/<repo>.`, og GitHub-repositoryet skal vise samme beskrivelse og emner.
|
||||
7. Hvis det fejler, brug [troubleshooting.md](Troubleshooting.da).
|
||||
|
||||
## Runners
|
||||
|
||||
| Punkt | Værdi |
|
||||
| --- | --- |
|
||||
| Label, som workflowet bruger | `ubuntu-latest` |
|
||||
| Labels, som runneren på denne instans tilbyder | `ubuntu-latest`, `ubuntu-24.04`, `ubuntu-22.04` |
|
||||
| Værktøjer, workflowet skal bruge | `python3` (kun standardbiblioteket), udgående HTTPS til Gitea API og `api.github.com` |
|
||||
| Kræves af `actions/checkout` (bruges af valideringsworkflowet) | `git` og Node.js, normalt i runner-imaget |
|
||||
|
||||
**Kontroller, at en passende runner er online** (kræver tilladelse til at se runners):
|
||||
|
||||
```bash
|
||||
curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||||
https://git.tirsystem.com/api/v1/repos/<owner>/<repo>/actions/runners
|
||||
```
|
||||
|
||||
For runners, der deles af hele instansen, bruger en administrator `/api/v1/admin/actions/runners`. På skrivetidspunktet er lister for repository og organisation tomme, og én runner på instansniveau (`36cd20104923`) er `online`.
|
||||
|
||||
**Offline eller inkompatibel runner**
|
||||
|
||||
| Symptom | Sandsynlig årsag | Handling |
|
||||
| --- | --- | --- |
|
||||
| Kørslen bliver stående som `waiting` | Ingen online runner har den label, der står i `runs-on` | Start runneren, eller registrer én med labelen |
|
||||
| Jobbet fejler i starten med en manglende kommando | Runner-imaget mangler `python3`, `git` eller Node.js | Brug et image, der har dem |
|
||||
| Jobbet kan ikke nå API'et | Runneren har ingen udgående HTTPS | Ret runnerens netværks- eller proxyindstillinger |
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> This page is generated from [`guides/onboarding.md`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/guides/onboarding.md). Changes made here are overwritten the next time the wiki is published.
|
||||
|
||||
English | [Dansk](Onboarding.da) | [Bahasa Melayu](Onboarding.ms)
|
||||
|
||||
# Onboarding a repository
|
||||
|
||||
How a DevOps professional makes a TirSystem repository use the shared
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- translation of Onboarding.md, source sha256 044127b33c19 -->
|
||||
|
||||
> Ini ialah terjemahan [`Onboarding`](Onboarding). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya.
|
||||
|
||||
[English](Onboarding) | [Dansk](Onboarding.da) | Bahasa Melayu
|
||||
|
||||
# Menyertakan sebuah repositori
|
||||
|
||||
Cara seorang profesional DevOps menjadikan repositori TirSystem menggunakan aliran kerja bersama **Sync GitHub mirror metadata**, dan runner yang diperlukannya. Hanya aliran kerja ini yang wujud sekarang; aliran kerja semakan kualiti dan keluaran dirancang (lihat [Pelan Projek](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/docs/project-plan.md)).
|
||||
|
||||
## Perkara yang telah disahkan
|
||||
|
||||
| Perkara | Status |
|
||||
| --- | --- |
|
||||
| Versi Gitea | 1.27.3 |
|
||||
| `.gitea/scoped_workflows/sync-github-metadata.yml` berjalan dalam repositori ini | Disahkan: larian 16, `workflow_dispatch`, berjaya |
|
||||
| Aliran kerja yang sama terpakai pada repositori lain secara automatik | **Belum disahkan.** Sahkan cara scoped workflow dihantar pada instans (tetapan pentadbir atau organisasi) sebelum bergantung padanya. |
|
||||
|
||||
Selagi penghantaran belum disahkan, sertakan repositori dengan menyalin aliran kerja (lihat di bawah).
|
||||
|
||||
## Langkah
|
||||
|
||||
1. **Semak prasyarat** dalam repositori: Actions diaktifkan, dan runner dengan label `ubuntu-latest` dan `python3` berada dalam talian (lihat [Runners](#runners)).
|
||||
2. **Konfigurasikan satu push mirror GitHub** dalam tetapan repositori (Settings, Repository, Mirror settings, Push mirror). Aliran kerja gagal jika terdapat beberapa cermin GitHub. Jika tiada, ia berjaya tanpa menyegerakkan apa-apa.
|
||||
3. **Tambah dua rahsia (secret)** dalam tetapan repositori (atau organisasi), dengan skop yang tertera dalam [credentials.md](Credentials.ms):
|
||||
- `TOKEN_FOR_GITEA`
|
||||
- `CREDENTIALS_FOR_GITHUB` (JSON dengan `GITHUB_PAT`)
|
||||
4. **Hantar aliran kerja:**
|
||||
- *Jika scoped workflow terpakai pada repositori:* tiada apa yang perlu disalin.
|
||||
- *Jika tidak:* salin `.gitea/scoped_workflows/sync-github-metadata.yml` dari repositori ini ke `.gitea/workflows/` dalam repositori sasaran. Sematkan salinan itu pada versi repositori ini yang telah disemak, dan salin semula apabila ia berubah.
|
||||
5. **Tetapkan penerangan dan topik** pada repositori Gitea, supaya ada sesuatu untuk disegerakkan.
|
||||
6. **Jalankan sekali secara manual:** Actions, **Sync GitHub mirror metadata**, Run workflow. Log mesti berakhir dengan `Synced description and topics to <owner>/<repo>.` dan repositori GitHub mesti menunjukkan penerangan dan topik yang sama.
|
||||
7. Jika gagal, gunakan [troubleshooting.md](Troubleshooting.ms).
|
||||
|
||||
## Runners
|
||||
|
||||
| Perkara | Nilai |
|
||||
| --- | --- |
|
||||
| Label yang digunakan oleh aliran kerja | `ubuntu-latest` |
|
||||
| Label yang ditawarkan oleh runner pada instans ini | `ubuntu-latest`, `ubuntu-24.04`, `ubuntu-22.04` |
|
||||
| Alat yang diperlukan oleh aliran kerja | `python3` (pustaka standard sahaja), HTTPS keluar ke API Gitea dan `api.github.com` |
|
||||
| Diperlukan untuk `actions/checkout` (digunakan oleh aliran kerja pengesahan) | `git` dan Node.js, biasanya terdapat dalam imej runner |
|
||||
|
||||
**Semak bahawa runner yang sesuai berada dalam talian** (memerlukan kebenaran untuk melihat runner):
|
||||
|
||||
```bash
|
||||
curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||||
https://git.tirsystem.com/api/v1/repos/<owner>/<repo>/actions/runners
|
||||
```
|
||||
|
||||
Bagi runner yang dikongsi oleh seluruh instans, pentadbir menggunakan `/api/v1/admin/actions/runners`. Pada masa penulisan, senarai repositori dan organisasi kosong dan satu runner peringkat instans (`36cd20104923`) berstatus `online`.
|
||||
|
||||
**Runner luar talian atau tidak serasi**
|
||||
|
||||
| Gejala | Punca yang mungkin | Tindakan |
|
||||
| --- | --- | --- |
|
||||
| Larian kekal `waiting` | Tiada runner dalam talian yang mempunyai label dalam `runs-on` | Mulakan runner, atau daftarkan satu dengan label itu |
|
||||
| Kerja gagal pada permulaan dengan arahan yang tiada | Imej runner tiada `python3`, `git` atau Node.js | Gunakan imej yang mempunyainya |
|
||||
| Kerja tidak dapat mencapai API | Runner tiada HTTPS keluar | Betulkan tetapan rangkaian atau proksi runner |
|
||||
@@ -0,0 +1,62 @@
|
||||
<!-- translation of Troubleshooting.md, source sha256 060a822225e1 -->
|
||||
|
||||
> Dette er en oversættelse af [`Troubleshooting`](Troubleshooting). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres.
|
||||
|
||||
[English](Troubleshooting) | Dansk | [Bahasa Melayu](Troubleshooting.ms)
|
||||
|
||||
# Fejlfinding af en mislykket kørsel
|
||||
|
||||
Åbn kørslen i Gitea (Actions) og læs de sidste linjer i det trin, der fejler. Hver fejl fra synkroniseringsscriptet skrives som
|
||||
|
||||
```
|
||||
ERROR: [<category>] <message>
|
||||
```
|
||||
|
||||
Kategorien fortæller, hvor du skal kigge. En fejl uden for scriptet (jobbet starter aldrig eller stopper før trinnet) er et **runner**-problem.
|
||||
|
||||
| Kategori | Betydning | Første ting at kontrollere |
|
||||
| --- | --- | --- |
|
||||
| `configuration` | En secret eller en repository-indstilling mangler eller er forkert udformet | Secretnavne og format, opsætning af push-spejl |
|
||||
| `credentials` | En tjeneste afviste tokenet (HTTP 401) | Token er udløbet, tilbagekaldt eller forkert indtastet |
|
||||
| `permissions` | Tokenet er gyldigt, men har ikke tilladelse (HTTP 403, eller ingen GitHub-administrationsadgang) | Token-scopes og repository-adgang |
|
||||
| `api` | En anden HTTP-fejl, eller tjenesten kunne ikke nås | Tjenestens status, runnerens netværk |
|
||||
| runner | Ingen `ERROR:`-linje; kørslen venter, eller jobbet fejler før scriptet | Runner online, label, værktøjer |
|
||||
|
||||
## Meddelelser og løsninger
|
||||
|
||||
| Meddelelse (begyndelsen) | Kategori | Årsag og løsning |
|
||||
| --- | --- | --- |
|
||||
| `CREDENTIALS_FOR_GITHUB is missing or empty.` | configuration | Tilføj secreten |
|
||||
| `CREDENTIALS_FOR_GITHUB must contain valid JSON.` | configuration | Værdien skal være JSON, fx `{"GITHUB_PAT": "..."}` |
|
||||
| `CREDENTIALS_FOR_GITHUB must be a JSON object.` | configuration | Brug et objekt, ikke en liste eller en streng |
|
||||
| `CREDENTIALS_FOR_GITHUB must contain a non-empty GITHUB_PAT.` | configuration | Tilføj nøglen `GITHUB_PAT` med et token |
|
||||
| `TOKEN_FOR_GITEA is missing or empty.` | configuration | Tilføj secreten |
|
||||
| `TOKEN_FOR_GITEA must contain a non-empty GITEA_TOKEN.` | configuration | JSON-formen kræver nøglen `GITEA_TOKEN` |
|
||||
| `Could not determine the Gitea source repository.` | configuration | Kørslen har intet repositorynavn; meld det som en defekt |
|
||||
| `Expected at most one GitHub push mirror ... found N` | configuration | Behold ét GitHub push-spejl |
|
||||
| `TOKEN_FOR_GITEA_WIKI is missing or empty.` | configuration | Kun wiki-publicering: tilføj secreten (se [credentials.md](Credentials.da)) |
|
||||
| `The wiki is not enabled on <repo>` | configuration | Kun wiki-publicering: aktivér wikien i repositoryets indstillinger |
|
||||
| `The wiki source directory ... has no Markdown pages` | configuration | Kun wiki-publicering: `wiki/` er tom eller mangler; intet blev ændret |
|
||||
| `Could not determine the GitHub owner and repository ...` | configuration | Spejlets adresse skal se ud som `https://github.com/<owner>/<repo>.git` |
|
||||
| `Gitea API request failed with HTTP 401` | credentials | Opret et nyt Gitea-token, og opdatér `TOKEN_FOR_GITEA` |
|
||||
| `GitHub API request failed with HTTP 401` | credentials | Opret et nyt GitHub-token, og opdatér `CREDENTIALS_FOR_GITHUB` |
|
||||
| `... HTTP 403 ...` (Gitea) | permissions | Tokenet skal have `read:repository`, og dets bruger skal være administrator af repositoryet |
|
||||
| `... HTTP 403 ...` (GitHub) | permissions | Tokenet skal have Administration read and write på spejl-repositoryet |
|
||||
| `The GitHub token cannot administer <repo>` | permissions | Som ovenfor; tokenet kan læse repositoryet, men ikke redigere det |
|
||||
| `... HTTP 404 ...` | configuration | Repositoryet blev ikke fundet, eller tokenet kan ikke se det; kontroller spejlets adresse og tokenets adgang til repositoryet |
|
||||
| `... HTTP 5xx ...` | api | Problem hos tjenesten; kør igen senere |
|
||||
| `... API is unreachable ...` | api | Netværks-, DNS- eller proxyproblem på runneren |
|
||||
|
||||
## Ikke en fejl
|
||||
|
||||
`No GitHub push mirror configured for <repo>; nothing to sync.` Kørslen lykkes. Ikke alle Gitea-repositories har et GitHub-spejl, så det er forventet for dem. Hvis repositoryet skal have et, så tilføj det i repositoryets indstillinger.
|
||||
|
||||
`WARNING: Gitea returned an invalid push mirror list; GitHub metadata was not synced.` Kørslen lykkes, men intet blev synkroniseret. Kontroller, at Gitea-versionen understøtter push mirror-API'et, og kør igen.
|
||||
|
||||
## Runner-problemer
|
||||
|
||||
Se afsnittet [Runners](Onboarding.da#runners). Kort sagt: hvis kørslen bliver stående som `waiting`, har ingen online runner labelen; hvis jobbet fejler før scriptet, mangler runner-imaget et værktøj.
|
||||
|
||||
## Ny kørsel
|
||||
|
||||
Brug **Run workflow** (`workflow_dispatch`), når årsagen er rettet. Synkroniseringen kan trygt gentages: den overskriver GitHub-beskrivelsen og -emnerne med værdierne fra Gitea.
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> This page is generated from [`guides/troubleshooting.md`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/guides/troubleshooting.md). Changes made here are overwritten the next time the wiki is published.
|
||||
|
||||
English | [Dansk](Troubleshooting.da) | [Bahasa Melayu](Troubleshooting.ms)
|
||||
|
||||
# Diagnosing a failed run
|
||||
|
||||
Open the run in Gitea (Actions) and read the last lines of the failing step.
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<!-- translation of Troubleshooting.md, source sha256 060a822225e1 -->
|
||||
|
||||
> Ini ialah terjemahan [`Troubleshooting`](Troubleshooting). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya.
|
||||
|
||||
[English](Troubleshooting) | [Dansk](Troubleshooting.da) | Bahasa Melayu
|
||||
|
||||
# Mendiagnosis larian yang gagal
|
||||
|
||||
Buka larian dalam Gitea (Actions) dan baca baris terakhir langkah yang gagal. Setiap kegagalan daripada skrip penyegerakan ditulis sebagai
|
||||
|
||||
```
|
||||
ERROR: [<category>] <message>
|
||||
```
|
||||
|
||||
Kategori menunjukkan di mana perlu dilihat. Kegagalan di luar skrip (kerja tidak pernah bermula, atau berhenti sebelum langkah itu) ialah masalah **runner**.
|
||||
|
||||
| Kategori | Maksud | Perkara pertama yang disemak |
|
||||
| --- | --- | --- |
|
||||
| `configuration` | Secret atau tetapan repositori tiada atau tidak betul bentuknya | Nama dan format secret, penyediaan push mirror |
|
||||
| `credentials` | Satu perkhidmatan menolak token (HTTP 401) | Token tamat tempoh, dibatalkan atau tersalah taip |
|
||||
| `permissions` | Token sah tetapi tidak dibenarkan (HTTP 403, atau tiada akses pentadbiran GitHub) | Skop token dan akses repositori |
|
||||
| `api` | Ralat HTTP lain, atau perkhidmatan tidak dapat dicapai | Status perkhidmatan, rangkaian runner |
|
||||
| runner | Tiada baris `ERROR:`; larian menunggu, atau kerja gagal sebelum skrip | Runner dalam talian, label, alat |
|
||||
|
||||
## Mesej dan pembetulan
|
||||
|
||||
| Mesej (permulaan) | Kategori | Punca dan pembetulan |
|
||||
| --- | --- | --- |
|
||||
| `CREDENTIALS_FOR_GITHUB is missing or empty.` | configuration | Tambah secret |
|
||||
| `CREDENTIALS_FOR_GITHUB must contain valid JSON.` | configuration | Nilai mesti JSON seperti `{"GITHUB_PAT": "..."}` |
|
||||
| `CREDENTIALS_FOR_GITHUB must be a JSON object.` | configuration | Gunakan objek, bukan senarai atau rentetan |
|
||||
| `CREDENTIALS_FOR_GITHUB must contain a non-empty GITHUB_PAT.` | configuration | Tambah kunci `GITHUB_PAT` dengan token |
|
||||
| `TOKEN_FOR_GITEA is missing or empty.` | configuration | Tambah secret |
|
||||
| `TOKEN_FOR_GITEA must contain a non-empty GITEA_TOKEN.` | configuration | Bentuk JSON memerlukan kunci `GITEA_TOKEN` |
|
||||
| `Could not determine the Gitea source repository.` | configuration | Larian tiada nama repositori; laporkan sebagai kecacatan |
|
||||
| `Expected at most one GitHub push mirror ... found N` | configuration | Kekalkan satu push mirror GitHub |
|
||||
| `TOKEN_FOR_GITEA_WIKI is missing or empty.` | configuration | Penerbitan wiki sahaja: tambah secret (lihat [credentials.md](Credentials.ms)) |
|
||||
| `The wiki is not enabled on <repo>` | configuration | Penerbitan wiki sahaja: aktifkan wiki dalam tetapan repositori |
|
||||
| `The wiki source directory ... has no Markdown pages` | configuration | Penerbitan wiki sahaja: `wiki/` kosong atau tiada; tiada apa-apa diubah |
|
||||
| `Could not determine the GitHub owner and repository ...` | configuration | Alamat cermin mesti kelihatan seperti `https://github.com/<owner>/<repo>.git` |
|
||||
| `Gitea API request failed with HTTP 401` | credentials | Cipta token Gitea baharu dan kemas kini `TOKEN_FOR_GITEA` |
|
||||
| `GitHub API request failed with HTTP 401` | credentials | Cipta token GitHub baharu dan kemas kini `CREDENTIALS_FOR_GITHUB` |
|
||||
| `... HTTP 403 ...` (Gitea) | permissions | Token memerlukan `read:repository`, dan penggunanya mesti pentadbir repositori |
|
||||
| `... HTTP 403 ...` (GitHub) | permissions | Token memerlukan Administration read and write pada repositori cermin |
|
||||
| `The GitHub token cannot administer <repo>` | permissions | Sama seperti di atas; token boleh membaca repositori tetapi tidak boleh mengeditnya |
|
||||
| `... HTTP 404 ...` | configuration | Repositori tidak ditemui, atau token tidak dapat melihatnya; semak alamat cermin dan akses repositori token |
|
||||
| `... HTTP 5xx ...` | api | Masalah perkhidmatan; jalankan semula kemudian |
|
||||
| `... API is unreachable ...` | api | Masalah rangkaian, DNS atau proksi pada runner |
|
||||
|
||||
## Bukan satu ralat
|
||||
|
||||
`No GitHub push mirror configured for <repo>; nothing to sync.` Larian berjaya. Tidak semua repositori Gitea mempunyai cermin GitHub, jadi ini dijangka bagi repositori tersebut. Jika repositori itu sepatutnya mempunyainya, tambahkannya dalam tetapan repositori.
|
||||
|
||||
`WARNING: Gitea returned an invalid push mirror list; GitHub metadata was not synced.` Larian berjaya tetapi tiada apa-apa disegerakkan. Semak bahawa versi Gitea menyokong API push mirror dan jalankan semula.
|
||||
|
||||
## Masalah runner
|
||||
|
||||
Lihat bahagian [Runners](Onboarding.ms#runners). Ringkasnya: jika larian kekal `waiting`, tiada runner dalam talian yang mempunyai label itu; jika kerja gagal sebelum skrip, imej runner tiada satu alat.
|
||||
|
||||
## Menjalankan semula
|
||||
|
||||
Gunakan **Run workflow** (`workflow_dispatch`) selepas puncanya dibetulkan. Penyegerakan selamat diulang: ia menimpa penerangan dan topik GitHub dengan nilai daripada Gitea.
|
||||
Reference in New Issue
Block a user