Author SHA1 Message Date
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
Tirsvad 43ce34267e Merge pull request 'Bump the framework to v0.5.0 and the version to 0.3.3' (#75) from bump-framework-0.5.0 into main
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 4s
Reviewed-on: TirSystem-BashScript/RepoFoundry#75
2026-10-09 13:18:11 +02:00
Tirsvad e08d285d3b Bump the version to 0.3.3
Set VERSION in src/lib/constants.sh to 0.3.3 and the --version check in
tests/test-security.sh to match, for the framework v0.5.0 bump.
2026-10-09 19:05:19 +08:00
Tirsvad bcffd1af68 Bump the framework submodule to v0.5.0
Also point .gitmodules at the lower-case sqa-qc-framework URL.
2026-10-09 19:02:42 +08:00
Tirsvad 3e0047f36f Merge pull request 'Bump the version to 0.3.2 (task 5)' (#74) from mil-009-version into main
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 3s
Reviewed-on: TirSystem-BashScript/RepoFoundry#74
2026-10-08 08:34:23 +02:00
14 changed files with 204 additions and 4 deletions
+3
View File
@@ -7,3 +7,6 @@ end_of_line = lf
insert_final_newline = true
charset = utf-8
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
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "framework"]
path = framework
url = ssh://git@git.tirsystem.com:10022/TirSystem/SQA-QC-Framework.git
url = ssh://git@git.tirsystem.com:10022/TirSystem/sqa-qc-framework.git
+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.
+1 -1
View File
@@ -8,7 +8,7 @@
# shellcheck disable=SC2034 # read and written by the other library files
readonly PROJECT_NAME="${REPOFOUNDRY_NAME:-RepoFoundry}"
readonly VERSION="0.3.2"
readonly VERSION="0.3.3"
readonly EXIT_FAILURE=1
readonly EXIT_USAGE=2
readonly MAX_VALUE_LENGTH=2048
+1 -1
View File
@@ -103,7 +103,7 @@ test_usage_errors() {
assert_contains "help shows exit codes" "$OUT" "Exit codes"
run_cli "" --version
assert_status "version" 0 "$STATUS"
assert_contains "version output" "$OUT" "RepoFoundry 0.3.2"
assert_contains "version output" "$OUT" "RepoFoundry 0.3.3"
}
test_warns_when_env_is_not_ignored_by_git() {
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/RepoFoundry.git
cd RepoFoundry
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](SSH-and-tokens)). `.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](Getting-started) | Requirements, install and the first run |
| [SSH and tokens](SSH-and-tokens) | 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/RepoFoundry/src/branch/main/README.md).
Report a problem as an [issue](https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/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/RepoFoundry/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/RepoFoundry/src/branch/main/howto/create-access-tokens.md). The exact permissions are under [Token permissions](https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/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](SSH-and-tokens) |
| 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/RepoFoundry/src/branch/main/README.md#error-handling-and-recovery) and [Known limitations](https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/src/branch/main/README.md#known-limitations) in the README.
+4
View File
@@ -0,0 +1,4 @@
- [Home](Home)
- [Getting started](Getting-started)
- [SSH and tokens](SSH-and-tokens)
- [Troubleshooting](Troubleshooting)