10 Commits
Author SHA1 Message Date
Tirsvad 44ee25d97d Merge pull request 'Rename the wiki pages without hyphens' (#80) from rename-wiki-pages-no-hyphens into main
Quality checks / quality-checks (push) Successful in 25s
Quality / quality (push) Successful in 25s
TirSystem/github-action: Publish wiki / publish-wiki (push) Successful in 9s
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 5s
Reviewed-on: #80
2026-10-12 12:03:33 +02:00
Tirsvad 32fa6a819e Rename the wiki pages without hyphens
Quality checks / quality-checks (pull_request) Successful in 29s
Quality / quality (pull_request) Successful in 29s
Gitea stores a page whose name has a hyphen under an escaped address
(Getting-started.-), which the shared publish workflow does not match, so
the second run tried to create the page again and got HTTP 400. Use
GettingStarted and SshAndTokens, as the wiki of TirSystem/github-action
does.
2026-10-12 18:02:38 +08:00
Tirsvad a06b54ee7e Merge pull request 'Use the kebab-case repository name' (#79) from rename-repo-kebab-case into main
Quality checks / quality-checks (push) Successful in 24s
TirSystem/github-action: Publish wiki / publish-wiki (push) Failing after 7s
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 6s
Quality / quality (push) Successful in 25s
Reviewed-on: #79
2026-10-12 11:59:00 +02:00
Tirsvad 7e9551e151 Use the kebab-case repository name in URLs and paths
Quality checks / quality-checks (pull_request) Successful in 28s
Quality / quality (pull_request) Successful in 28s
The repository is now TirSystem-BashScript/repo-foundry on Gitea and GitHub.
Update the clone URL, the example paths and the wiki links. Old links keep
working through the redirects of both hosts, so documents that only cite
commits and milestones are left as they are.
2026-10-12 17:52:43 +08:00
Tirsvad fa546d4134 Merge pull request 'Add the wiki, Quality and Release workflows' (#78) from add-wiki-quality-release-workflows into main
TirSystem/github-action: Publish wiki / publish-wiki (push) Successful in 8s
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 5s
Quality checks / quality-checks (push) Successful in 25s
Quality / quality (push) Successful in 25s
Reviewed-on: TirSystem-BashScript/RepoFoundry#78
2026-10-12 11:46:15 +02:00
Tirsvad 01cc6a4548 Merge main into add-wiki-quality-release-workflows
Quality checks / quality-checks (pull_request) Successful in 26s
Quality / quality (pull_request) Successful in 26s
Keep one Quality workflow: the one from main, pinned to v1.1.0 with
tools-ref instead of main, plus workflow_dispatch.
2026-10-12 17:43:29 +08:00
Tirsvad cc03cf420d Fix the Quality status context in the release workflow
Quality checks / quality-checks (pull_request) Successful in 30s
Quality / quality (pull_request) Successful in 30s
The real context of the Quality run on a push is
"Quality / quality (push)", not the nested job name. Also store the file
with LF line endings, as .editorconfig requires.
2026-10-12 17:29:29 +08:00
Tirsvad 88eac33602 Add the wiki, Quality and Release workflows
Quality checks / quality-checks (pull_request) Successful in 31s
Quality / quality (pull_request) Successful in 31s
Add a wiki/ folder with a .publish marker for the shared Publish wiki
workflow, a Quality workflow (shellcheck and shfmt through the shared
reusable workflow) and a manual Release workflow that builds the release
page from CHANGELOG.md.

Set switch_case_indent for *.sh in .editorconfig so shfmt accepts the
existing case layout.
2026-10-12 00:32:12 +08:00
Tirsvad 6a5da649da Merge pull request 'Run the shared quality checks on pull requests' (#76) from adopt-shared-quality-checks into main
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 5s
Quality checks / quality-checks (push) Successful in 28s
Quality / quality (push) Successful in 29s
Reviewed-on: TirSystem-BashScript/RepoFoundry#76
2026-10-10 21:21:46 +02:00
Tirsvad ca07b0669a Run the shared quality checks on pull requests
Quality checks / quality-checks (pull_request) Successful in 22s
Quality / quality (pull_request) Successful in 22s
Call the reusable quality-check workflow of TirSystem/github-action for the
shell files: shellcheck and shfmt -d. Add switch_case_indent to the
[*.sh] section of .editorconfig so that shfmt, which reads it, agrees with
the style the project already uses (shfmt -i 2 -ci in tests/run-tests.sh).
2026-10-10 16:25:09 +08:00
11 changed files with 204 additions and 4 deletions
+3
View File
@@ -7,3 +7,6 @@ end_of_line = lf
insert_final_newline = true insert_final_newline = true
charset = utf-8 charset = utf-8
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.sh]
switch_case_indent = true
+23
View File
@@ -0,0 +1,23 @@
name: Quality
# Calls the shared quality-check workflow of TirSystem/github-action
# (contract: ADR-0005 there). It runs shellcheck and shfmt on the tracked
# shell files and changes no file. Configuration comes from .shellcheckrc
# and .editorconfig in this repository. The release workflow requires this run
# to be green on the commit it releases.
on:
pull_request:
push:
branches: [ main ]
workflow_dispatch:
jobs:
quality:
permissions:
contents: read
# Pinned to an exact tag, never to main; tools-ref pins the script to the
# same tag, so the whole check is fixed.
uses: TirSystem/github-action/.gitea/workflows/quality-checks.yml@v1.1.0
with:
languages: shell
tools-ref: v1.1.0
+56
View File
@@ -0,0 +1,56 @@
name: Release
# Releases this repository: creates the version tag and the release page from
# the CHANGELOG.md entry, and only when the commit is the tip of main, its
# Quality run is green and the changelog has an entry for the version. The
# script is a file of TirSystem/github-action (tools/release.py), fetched at an
# exact tag. dry_run defaults to true: it checks and prints and writes nothing,
# so a release is a deliberate second run with dry_run false.
#
# release.py also keeps a moving major tag (v0 for 0.x versions) pointing to
# the highest release of its major version, as in TirSystem/github-action.
on:
workflow_dispatch:
inputs:
version:
description: "Version to release, MAJOR.MINOR.PATCH without a leading v"
required: true
dry_run:
description: "true checks only; false creates the tag and the release page"
required: false
default: "true"
concurrency:
group: release
cancel-in-progress: false
jobs:
release:
permissions:
contents: write
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Check out the repository
uses: actions/checkout@v4.2.2
- name: Fetch the shared script
uses: actions/checkout@v4.2.2
with:
repository: TirSystem/github-action
ref: v1.1.0
path: shared-scripts
- name: Check and publish the release
env:
GITEA_API_URL: ${{ gitea.api_url }}
SOURCE_REPOSITORY: ${{ gitea.repository }}
RELEASE_CREDENTIALS: ${{ secrets.TOKEN_FOR_GITEA_RELEASE || github.token }}
RELEASE_VERSION: ${{ inputs.version }}
RELEASE_DRY_RUN: ${{ inputs.dry_run }}
RELEASE_SHA: ${{ gitea.sha }}
# The status context of the Quality run on the commit. Check the exact
# text on a pull request and correct it here if the dry run says the
# run was not found.
VALIDATION_CONTEXT: "Quality / quality (push)"
run: python3 shared-scripts/tools/release.py
+23
View File
@@ -0,0 +1,23 @@
# Changelog
All notable changes to RepoFoundry. Versions are tags `vMAJOR.MINOR.PATCH`.
The release workflow takes the text of a release page from the entry of its
version, so every release needs an entry here before it is started.
Each release lists its changes in these groups, in this order: **Breaking**,
**Added**, **Changed**, **Fixed**. A release with a Breaking entry has a new
major version.
`python tools/changelog.py check` of `TirSystem/github-action` verifies this
file.
## [Unreleased]
### Added
- Gitea workflows: Quality (shellcheck and shfmt through the shared reusable
workflow) and Release (tag and release page from this changelog).
- A `wiki/` folder with a `.publish` marker, published to the Gitea wiki by the
shared Publish wiki workflow.
- `switch_case_indent` for `*.sh` in `.editorconfig`, so `shfmt` accepts the
existing layout of `case` branches.
+4 -4
View File
@@ -52,8 +52,8 @@ Requirements:
| `jq` (optional) | JSON parsing; without it a small built-in reader is used | | `jq` (optional) | JSON parsing; without it a small built-in reader is used |
```bash ```bash
git clone https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry.git git clone https://git.tirsystem.com/TirSystem-BashScript/repo-foundry.git
cd RepoFoundry cd repo-foundry
src/create-project.sh --help src/create-project.sh --help
``` ```
@@ -69,7 +69,7 @@ command (below):
```bash ```bash
cd ~/work # the folder that will hold my-app cd ~/work # the folder that will hold my-app
~/src/RepoFoundry/src/create-project.sh # creates ~/work/my-app ~/src/repo-foundry/src/create-project.sh # creates ~/work/my-app
``` ```
### Make it a global command ### Make it a global command
@@ -104,7 +104,7 @@ run `export MSYS=winsymlinks:nativestrict` before the `ln -s`, or use an alias
in `~/.bashrc`, which works because the script finds its own folder: in `~/.bashrc`, which works because the script finds its own folder:
```bash ```bash
alias repo-foundry='bash /c/Users/me/RepoFoundry/src/create-project.sh' alias repo-foundry='bash /c/Users/me/repo-foundry/src/create-project.sh'
``` ```
## Configuration ## Configuration
View File
+36
View File
@@ -0,0 +1,36 @@
# Getting started
## Requirements
| Tool | Needed for |
| --- | --- |
| bash 4.4 or later | the script (macOS ships 3.2: install a newer bash first) |
| `git` | the local project and the framework submodule |
| `curl` | the GitHub and Gitea APIs |
| `ssh` (optional) | the SSH check; without it the framework steps are skipped |
| `jq` (optional) | JSON parsing; without it a small built-in reader is used |
## Install
```bash
git clone https://git.tirsystem.com/TirSystem-BashScript/repo-foundry.git
cd repo-foundry
src/create-project.sh --help
```
Nothing is installed system-wide: the script runs from the checkout.
## Configure
Copy `config.env.example` to `config.env` and `.env.example` to `.env`, then set the service addresses and the tokens (see [SSH and tokens](SshAndTokens)). `.env` holds credentials and is never committed.
## Run
Start the script from the folder that should hold the new project:
```bash
src/create-project.sh # dry run: reads from the hosts, creates nothing
src/create-project.sh --apply # creates everything after a final yes
```
No commit is made in the new project. Work on a branch there: the framework's hooks refuse commits on `main`.
+20
View File
@@ -0,0 +1,20 @@
# Repo Foundry
Repo Foundry (`src/create-project.sh`) sets up a new project in one run:
- a **Gitea** repository, the source of truth;
- optionally an empty **GitHub** repository that receives everything through a push mirror from Gitea;
- a **local project** with one credential-free remote, `origin`, and the SQA-QC-Framework as a git submodule, with its skills, git hooks and templates installed.
It is a Bash script. It shows a plan first and creates nothing until you pass `--apply` and answer yes.
## Pages
| Page | What it covers |
| --- | --- |
| [Getting started](GettingStarted) | Requirements, install and the first run |
| [SSH and tokens](SshAndTokens) | SSH access to Gitea and the two access tokens |
| [Troubleshooting](Troubleshooting) | Common failures and what to do |
The full reference (configuration files, security decisions, error handling, known limitations) is the [README](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/src/branch/main/README.md).
Report a problem as an [issue](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/issues).
+25
View File
@@ -0,0 +1,25 @@
# SSH and tokens
## SSH access to Gitea
The framework submodule is fetched over SSH on port **10022**. Before you run the script:
1. Add your SSH public key to your Gitea account.
2. Connect once by hand so the server's host key is known (the script refuses unknown host keys):
```bash
ssh -p 10022 -T git@git.tirsystem.com
```
A message that you have successfully authenticated, without shell access, means it works.
> **Passphrase keys.** The script never prompts for a passphrase. A key with a passphrase must already be loaded in `ssh-agent` (`ssh-add`). This is tracked in [issue 77](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/issues/77).
## Tokens
| Token | Key in `.env` | Needed | Type |
| --- | --- | --- | --- |
| Gitea access token | `GITEA_TOKEN` | always | access token with scopes |
| GitHub personal access token | `GITHUB_PAT` | only when you choose GitHub | **classic** personal access token |
Step by step with pictures: [how to create the access tokens](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/src/branch/main/howto/create-access-tokens.md). The exact permissions are under [Token permissions](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/src/branch/main/README.md#token-permissions) in the README.
+10
View File
@@ -0,0 +1,10 @@
# Troubleshooting
| Symptom | What to check |
| --- | --- |
| The plan says the SSH test failed | Your key is in your Gitea account, the host key is known (`ssh -p 10022 -T git@git.tirsystem.com`), and a passphrase key is loaded with `ssh-add` |
| The script stops at the tool check | bash is 4.4 or later, and `git` and `curl` are installed |
| A host rejects the token | The token is current and has the scopes in [SSH and tokens](SshAndTokens) |
| A run stopped half way | Fix the cause and run the same command again with `--apply`: what was already created is offered for reuse |
More: [Error handling and recovery](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/src/branch/main/README.md#error-handling-and-recovery) and [Known limitations](https://git.tirsystem.com/TirSystem-BashScript/repo-foundry/src/branch/main/README.md#known-limitations) in the README.
+4
View File
@@ -0,0 +1,4 @@
- [Home](Home)
- [Getting started](GettingStarted)
- [SSH and tokens](SshAndTokens)
- [Troubleshooting](Troubleshooting)