Compare commits

...

No commits in common. "main" and "librepages" have entirely different histories.

69 changed files with 4268 additions and 1845 deletions

View file

@ -1,32 +0,0 @@
name: Documentation
on: push
jobs:
build:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
submodules: true
fetch-depth: 0
- name: Install Zola
run: ./scripts/ci.sh install
- name: Build production website
run: ./scripts/ci.sh build
- name: Deploy to gh-pages 🚀
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
uses: JamesIves/github-pages-deploy-action@v4.6.4
with:
branch: gh-pages
token: ${{ secrets.GITHUB_TOKEN }}
folder: ./public
- name: deploy
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository == 'forgeflux-org/docs' }}
run: >-
curl --location --request POST "https://deploy.batsense.net/api/v1/update" --header 'Content-Type: application/json' --data-raw "{ \"secret\": \"${{ secrets.DEPLOY_TOKEN }}\", \"branch\": \"gh-pages\" }"

2
.gitignore vendored
View file

@ -1,2 +0,0 @@
public/
sec/

View file

@ -1,10 +0,0 @@
pipeline:
build:
image: python
when:
event: [ push, pull_request, tag, deployment ]
commands:
- make env
- make
- make ci-deploy
secrets: [ GITEA_WRITE_DEPLOY_KEY, LIBREPAGES_DEPLOY_SECRET ]

3
404.html Normal file
View file

@ -0,0 +1,3 @@
<!doctype html>
<title>404 Not Found</title>
<h1>404 Not Found</h1>

298
Interface/about/index.html Normal file
View file

@ -0,0 +1,298 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | About Interface </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
checked />
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li class="active">
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="interface">Interface</h1>
<p>Interface is a service that acts as a connecting end of the bridge, listening
in for Notifications from a particular forge repository.</p>
<p>These notifications, which may be in the form of a Comment, Issue, or Pull Request,
are then further defined into Events to create
a workable unit set, that the interface can use to translate operations from
one forge to another forge.</p>
<p>The procedure of the Notification-Event Translation System, works as follows,</p>
<ol>
<li>Upon creation of the Interface, and set up of a forge repository to look for, the interface subscribes to the forge's notifications.</li>
<li>Every notification received by the interface from the forges, is then identified and translated into it's respective <code>Event</code> model, be it an Issue or PR.</li>
<li>Upon conversion into the respective model, Interface processes these <code>Events</code>, and converts them into the model required for the destination forge.</li>
</ol>
<h2 id="setting-up-the-development-environment">Setting up the Development Environment</h2>
<p>In order to test out and utilise the Northstar lookup service, we will need to set
up an interface to be run on the local machine. There are a few configuration
changes that must be made for the interface to be recognized by the lookup service.</p>
<p>Changes to the <code>config/settings.toml</code>,</p>
<pre data-lang="toml" style="background-color:#eff1f5;color:#4f5b66;" class="language-toml "><code class="language-toml" data-lang="toml"><span>[default.system]
</span><span style="color:#bf616a;">northstar </span><span>= &quot;</span><span style="color:#a3be8c;">http://computer.domain.com:port</span><span>&quot;
</span><span>
</span><span>[default.server]
</span><span style="color:#bf616a;">url </span><span>= &quot;</span><span style="color:#a3be8c;">http://computer.domain.com:port</span><span>&quot;
</span></code></pre>
<p>Note that the port assigned to the interface and northstar must not already be in
use by another application/service, and that you can find out the hostname for
your system through the following command,</p>
<pre data-lang="sh" style="background-color:#eff1f5;color:#4f5b66;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#bf616a;">hostname --fqdn
</span></code></pre>
<p>There are a few more settings to add in, as a means to validate the user who hosts
the interface, this also depends on the forge of your choosing. As of right now,
<code>interface</code> supports only gitea, and we can fill up the <code>config/settings.toml</code>,
with the same.</p>
<pre data-lang="toml" style="background-color:#eff1f5;color:#4f5b66;" class="language-toml "><code class="language-toml" data-lang="toml"><span>[default]
</span><span style="color:#bf616a;">forge </span><span>= &quot;</span><span style="color:#a3be8c;">gitea</span><span>&quot;
</span><span>
</span><span>[default.gitea]
</span><span style="color:#bf616a;">host </span><span>= &quot;</span><span style="color:#a3be8c;">https://gitea.com</span><span>&quot;
</span><span style="color:#bf616a;">api_key </span><span>= &quot;</span><span style="color:#a3be8c;">generate-the-api-key-from-gitea-and-paste-here</span><span>&quot;
</span><span style="color:#bf616a;">username </span><span>= &quot;</span><span style="color:#a3be8c;">fluxer101</span><span>&quot;
</span><span style="color:#bf616a;">password </span><span>= &quot;</span><span style="color:#a3be8c;">flux101</span><span>&quot;
</span></code></pre>
<p>Note that the API key in Gitea is known as an access token, one which can be
generated <a href="https://gitea.com/user/settings/applications">here</a>.</p>
<h2 id="faq">FAQ</h2>
<h3 id="why-does-an-integrity-error-show-up">Why does an integrity error show up?</h3>
<p>As ForgeFlux's Interface is an actively developing project, there are a few
errors that are caused by an upgrade to the database, in which case integrity errors
are bound to pop up. In this case, remove the <code>instance/</code> directory where the database
for the service would be stored, to rebuild it the next time the application is run.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

43
Interface/index.html Normal file
View file

@ -0,0 +1,43 @@
<html>
<head>
<title>Zola</title>
</head>
<body>
<div class="container">
<h1>Welcome to Zola!</h1>
<p>
You're seeing this page because we couldn't find a template to render.
</p>
<p>
To modify this page, create a <b>section.html</b> file in the templates directory or
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>.
<br>
You can find what variables are available in this template in the <a href="https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;templates&#x2F;pages-sections&#x2F;#section-variables" target="_blank">documentation</a>.
</p>
</div>
<footer>
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a>
</footer>
<style>
html {
line-height: 1.5;
}
h1 {
margin-bottom: 2rem;
}
.container {
font-family: "sans-serif";
text-align: center;
margin-top: 20vh;
padding: 2rem;
background: #e9e9e9;
}
footer {
position: fixed;
width: 100%;
bottom: 1rem;
text-align: center;
}
</style>
</body>
</html>

21
LICENSE
View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021 Roman Soldatenkov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,27 +0,0 @@
default: ## Build the website
./scripts/spellcheck.sh --check
./scripts/zola.sh build
clean: ## Clean build assets
./scripts/zola.sh clean
ci-deploy: ## Deploy from CI/CD. Only call from within CI
@if [ "${CI}" != "woodpecker" ]; \
then echo "Only call from within CI. Will re-write your local Git configuration. To override, set export CI=woodpecker"; \
exit 1; \
fi
git config --global user.email "${CI_COMMIT_AUTHOR_EMAIL}"
git config --global user.name "${CI_COMMIT_AUTHOR}"
./scripts/zola.sh deploy librepages public "${CI_COMMIT_AUTHOR} <${CI_COMMIT_AUTHOR_EMAIL}>"
./scripts/ci.sh --init "$$GITEA_WRITE_DEPLOY_KEY"
./scripts/ci.sh --deploy ${LIBREPAGES_DEPLOY_SECRET} librepages
./scripts/ci.sh --clean
env: ## Download build dependencies and setup dev environment
./scripts/zola.sh install
help: ## Prints help for targets with comments
@cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-]+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
serve: ## Serve website during development
./scripts/zola.sh zola -- serve

250
Northstar/about/index.html Normal file
View file

@ -0,0 +1,250 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | About Northstar </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
checked />
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li class="active">
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="northstar">Northstar&nbsp;<a class="anchor" href="#northstar">&#xE732;</a></h1>
<p>Northstar is a lookup service, which acts as a source of information
for interfaces which hold particular forge information.</p>
<p>An <a href="https://docs.forgeflux.org/Interface/">Interface</a> connects and looks
through an instance of Northstar, to find the appropriate the forge
information that it seeks.</p>
<p>An instance of Northstar has the functionality to act as an API to
register and provide forge information.
These routes/payloads are covered in the <a href="https://northstar.forgeflux.org/docs/openapi/">OpenAPI specification</a>
for Northstar.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

43
Northstar/index.html Normal file
View file

@ -0,0 +1,43 @@
<html>
<head>
<title>Zola</title>
</head>
<body>
<div class="container">
<h1>Welcome to Zola!</h1>
<p>
You're seeing this page because we couldn't find a template to render.
</p>
<p>
To modify this page, create a <b>section.html</b> file in the templates directory or
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>.
<br>
You can find what variables are available in this template in the <a href="https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;templates&#x2F;pages-sections&#x2F;#section-variables" target="_blank">documentation</a>.
</p>
</div>
<footer>
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a>
</footer>
<style>
html {
line-height: 1.5;
}
h1 {
margin-bottom: 2rem;
}
.container {
font-family: "sans-serif";
text-align: center;
margin-top: 20vh;
padding: 2rem;
background: #e9e9e9;
}
footer {
position: fixed;
width: 100%;
bottom: 1rem;
text-align: center;
}
</style>
</body>
</html>

View file

@ -1,4 +0,0 @@
# ForgeFlux
This is the documentation repository for the ForgeFlux Ecosystem. \
Check us out at [ForgeFlux.org](https://forgeflux.org).

View file

@ -1,13 +0,0 @@
base_url = "https://docs.forgeflux.org"
title = "Docs"
compile_sass = true
build_search_index = true
[markdown]
highlight_code = true
highlight_theme = "base16-ocean-light"
[extra]
logo = "/logo.svg"
#release = "https://api.github.com/repos/getzola/zola/releases/latest"
favicon = "https://forgeflux.org/favicon.ico"

View file

@ -1,4 +0,0 @@
+++
title = "Interface"
weight = 40
+++

View file

@ -1,72 +0,0 @@
+++
title = "About Interface"
weight = 40
+++
# Interface
Interface is a service that acts as a connecting end of the bridge, listening
in for Notifications from a particular forge repository.
These notifications, which may be in the form of a Comment, Issue, or Pull Request,
are then further defined into Events to create
a workable unit set, that the interface can use to translate operations from
one forge to another forge.
The procedure of the Notification-Event Translation System, works as follows,
1. Upon creation of the Interface, and set up of a forge repository to look for, the interface subscribes to the forge's notifications.
2. Every notification received by the interface from the forges, is then identified and translated into it's respective `Event` model, be it an Issue or PR.
3. Upon conversion into the respective model, Interface processes these `Events`, and converts them into the model required for the destination forge.
## Setting up the Development Environment
In order to test out and utilise the Northstar lookup service, we will need to set
up an interface to be run on the local machine. There are a few configuration
changes that must be made for the interface to be recognized by the lookup service.
Changes to the `config/settings.toml`,
```toml
[default.system]
northstar = "http://computer.domain.com:port"
[default.server]
url = "http://computer.domain.com:port"
```
Note that the port assigned to the interface and northstar must not already be in
use by another application/service, and that you can find out the hostname for
your system through the following command,
```sh
hostname --fqdn
```
There are a few more settings to add in, as a means to validate the user who hosts
the interface, this also depends on the forge of your choosing. As of right now,
`interface` supports only gitea, and we can fill up the `config/settings.toml`,
with the same.
```toml
[default]
forge = "gitea"
[default.gitea]
host = "https://gitea.com"
api_key = "generate-the-api-key-from-gitea-and-paste-here"
username = "fluxer101"
password = "flux101"
```
Note that the API key in Gitea is known as an access token, one which can be
generated [here](https://gitea.com/user/settings/applications).
## FAQ
### Why does an integrity error show up?
As ForgeFlux's Interface is an actively developing project, there are a few
errors that are caused by an upgrade to the database, in which case integrity errors
are bound to pop up. In this case, remove the `instance/` directory where the database
for the service would be stored, to rebuild it the next time the application is run.

View file

@ -1,5 +0,0 @@
+++
title = "Northstar"
insert_anchor_links = "right"
weight = 50
+++

View file

@ -1,18 +0,0 @@
+++
title = "About Northstar"
insert_anchor_links = "right"
+++
# Northstar
Northstar is a lookup service, which acts as a source of information
for interfaces which hold particular forge information.
An [Interface](@/Interface/_index.md) connects and looks
through an instance of Northstar, to find the appropriate the forge
information that it seeks.
An instance of Northstar has the functionality to act as an API to
register and provide forge information.
These routes/payloads are covered in the [OpenAPI specification](https://northstar.forgeflux.org/docs/openapi/)
for Northstar.

View file

@ -1,92 +0,0 @@
+++
title = "Welcome to ForgeFlux Documentation"
insert_anchor_links = "right"
+++
## Status
This site is Work-in-Progress, and as such, everything is in an
incomplete-state.
## Source code
Split between two forges, slowly migrating to self-hosted
[Forgejo](https://forgejo.org) instance at
[git.batsense.net](https://git.batsense.net)
1. [git.batsense.net](https://git.batsense.net/ForgeFlux)
1. [GitHub](https://github.com/forgeflux-org)
## Projects Overview
### Project Status: what does it mean?
1. WIP: Code isn't usable.
2. Usable: Code works, but user experience isn't polished. Can be used
with a bit of patience ;)
3. Production: Ready for use
### 1. Interface
- [Source code](https://github.com/forgeflux-org/interface)
- Status: WIP
- Description: API-space software forge federation implementation.
Federation will take time to implement in most, popular software forge
implementations. Interface aims to use the forge's REST API or similar
and create a federation layer on top of it.
Currently, implementation has minimal support for Forgejo and Gitea. A
Forgejo user can be exposed to Fediverse through WebFinger using
Interface.
### 2. Northstar
- [Source code](https://github.com/forgeflux-org/northstar)
- Status: Production
- Description: A lookup service for federating software forges
- Flagship instance: [northstar.forgeflux.org](https://northstar.forgeflux.org)
Interface's API-based, external, third-party approach introduces a
unique problem: how to locate the internet address (hostname) of the
Interface that services a forgege? Enter Northstar. It is a simple
Key-Value search server that maps forges and internfaces
### 3. Starchart
- [Source code](https://github.com/forgeflux-org/starchart)
- Status: Usable
- Description: Spider and search engine for federating forges
- Flagship instance:
[starchart.forgeflux.org](https://starchart.forgeflux.org)
Projects on centralized forges like GitHub and GitLab enjoy good
visibility through network effect, good search engine indexing and
through third-party tools like
[awesomeopensource.com/](https://awesomeopensource.com/).
Starchart aims to provide high-visibility for projects on independently
hosted forges by indexing them and exposing the index with a searchable
index. The index is designed to be replicated, so that new Starchart
instances can be bootstrapped from an existing Starchart instance's
data.
### 4. f3-rs
- [Source code](https://git.batsense.net/ForgeFlux/f3-rs)
- Status: WIP
- Description: Rust port of the [Friendly Forge Format](https://f3.forgefriends.org/) library
- Documentation link: [f3.forgeflux.org](https://forgeflux.org)
### 4. ftest
- [Source code](https://git.batsense.net/ForgeFlux/ftest)
- Status: Usable
- Description: Compliance checker/test runner for [ActivityPub](https://activitypub.rocks) and by
extension, [ForgeFed](https://forgefed.org)
The idea is to create something similar to
[matrix-org/sytest](https://github.com/matrix-org/sytest), but for
ActivityPub and ForgeFed. This way, we'll be able to measure how
compliant an implementation is to the specifications, which we hope will
improve interoperability between instances.

View file

@ -1,7 +0,0 @@
+++
title = "ftest"
insert_anchor_links = "right"
weight = 1
sort_by = "weight"
redirect_to = "/ftest/introduction"
+++

View file

@ -1,113 +0,0 @@
+++
title = "Using ftest CLI"
insert_anchor_links = "right"
weight = 2
+++
The ftest binary can run in the following modes:
1. Daemon: will act as a job server, listening for webhook events to
schedule new jobs. This mode is to be used on servers.
2. CLI: Useful for running compliance tests locally on one's own
computer.
## 0. Install Runtime Dependencies
ftest invokes a few binaries that are listed bellow:
1. [iproute2](https://packages.debian.org/bookworm/iproute2)
2. Docker
3. docker-compose
4. git
_NOTE: The user running ftest binary must be part of the `docker` UNIX
group_
## 1. Setup networking
ftest spawns a HTTP server to collect results from test suites. Right
now, it is hard-coded to listen on port `29130`. And, since test jobs
are run in containers and the ftest binary is going to be run on host
machine, we have to setup Docker and host machine's firewall to allow
traffic. We use an [nginx
container](https://git.batsense.net/ForgeFlux/ftest-nginx-proxy) to
achieve this.
This guide has instructions for `ufw`, please adopt the same for your
setup.
### i. Create Docker network `ftest`
```
docker network create --attachable -d bridge --subnet 192.168.32.0/20 ftest
```
_NOTE: if choosing custom subnet, adjust instructions in the section to match it_
### ii. Allow traffic from `ftest` net to host machine on port `29130`
```bash
sudo ufw allow from 192.168.32.0/20 proto tcp to any port 29130
```
### 2. [Optional] Install from source
Requires cargo, the Rust build tool. Please see
[here](https://rustup.rs/) for installation instructions.
```bash
git clone https://git.batsense.net/ForgeFlux/ftest
cd ftest
cargo build --release
sudo cp target/release/ftest /usr/local/bin
```
## 2. Install from binary
### i. Download assets
```bash
wget https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz.asc
wget https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz.sha256
wget https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz
```
### ii Verify checksum
```bash
sha256sum -c ftest-master-linux-amd64.tar.gz.sha256
```
### iii Verify GPG signature
All ForgeFlux binaries are signed with [our GPG
key](http://keyserver.ubuntu.com/pks/lookup?search=56861597C15E54520A36983A6828E4A2E5B91DB9&fingerprint=on&op=index).
Please verify signatures to verify authenticity.
```bash
gpg --keyserver keyserver.ubuntu.com --recv 56861597C15E54520A36983A6828E4A2E5B91DB9
gpg --verify ftest-master-linux-amd64.tar.gz.asc
```
### iv. Install binary
```bash
tar -xvzf ftest-master-linux-amd64.tar.gz && sudo cp ftest-master-linux-amd64/ftest /usr/local/bin
```
## 3. Run
The [control repository](@/ftest/terminology.md#control-repository) has
a few pre-configured targets. We recommend starting from there. Please
see [here](@/ftest/tutorial-new-specimen.md) to configure ftest for new [specimens](@/ftest/terminology.md#specimen).
```bash
git clone https://git.batsense.net/ForgeFlux/ftest-control
cd ftest-control/targets/forgejo
ftest test .
```
The results will be available in JSON format and HTML format (like this
one [here](/example/ftest/results/targets/forgejo/results)) in the same
directory.

View file

@ -1,53 +0,0 @@
+++
title = "ftest.toml"
insert_anchor_links = "right"
weight = 5
+++
## `fest.toml` or Job Manifest
Job manifest is defined in `ftest.toml` file in the specimen's
subdirectory.
## ftest.toml contents:
It can contain information on:
### 1. Initialization code
The code that needs to be run to prepare the test environment. ftest
runs Docker containers to initialize test environments.
#### Example
[forgejo-init-script](https://git.batsense.net/ForgeFlux/forgejo-init-script) performs the following operations in a sequence:
1. Install Forgejo (the binary starts with a web installer that accepts
configuration parameters for database, mailer, etc.)
2. Create accounts
3. Create repositories
4. Create issues
5. Create access tokens
NOTE: Some of these operations are irrelevant, as I (@realaravinth) had nicked them from
another project of mine and was too lazy to modify ;)
### 2. Test Suite
A test suite is a collection of tests. For instance, ActivityPub is a
test suite that could include tests for the WebFinger protocol and the
Nodeinfo protocol.
### 3. Tests
A test is a docker container that tests the
[specimen](@/ftest/terminology.md#specimen) for a specific protocol or
feature.
#### Example
[Nodeinfo test](https://git.batsense.net/nodeinfo-test) is the simplest
test available within ftest at the moment. It tests the specimen's
Nodeinfo implementation against the [Nodeinfo specification](https://nodeinfo.diaspora.software/protocol.html).
Please see [here](/ftest/tests.md) for developing new tests.

View file

@ -1,40 +0,0 @@
+++
title = "Introducing ftest"
insert_anchor_links = "right"
weight = 1
+++
- [Source code](https://git.batsense.net/ForgeFlux/ftest)
- Status: Usable
- Description: Compliance checker/test runner for [ActivityPub](https://activitypub.rocks) and by
extension, [ForgeFed](https://forgefed.org)
`ftest` is a compliance checking tool that is similar to
[matrix-org/sytest](https://github.com/matrix-org/sytest) but for ActivityPub and ForgeFed.
An instance (will be) is hosted by ForgeFlux, that is run on renewable
energy.
## Mechanism
1. New jobs are fetched from the [control repository](@/ftest/terminology.md#control-repository). At any given time, ftest will run only one job. Therefore, each commit on the control repository must modify one [specimen](@/ftest/terminology.md#specimen) only.
2. TODO: create `ftest` Docker network (right now, this is done by hand)
3. The specimen test environment is deployed using `docker-compose.yml`
available in the test network. The specimen might have dependency
services (like a database or a chase), but the specimen service
should be added to the `ftest` network.
4. Get a list of initialization workflows from `ftest.toml` and run them
sequentially.
5. Run test suites sequentially. A test suite might contain more than
one tests, all of them are launched in parallel. They are added to
the `ftest` Docker net by the `ftest` server.
6. Wait for tests from previous test to run to completion, collect logs
and delete containers. And run next test suite.
7. Aggregate logs and write to [result repository](@/ftest/terminology.md#result-repository).
8. Push result repository.
9. Wait for next test job.
## Quick links
- [Add new specimen to ftest](@/ftest/tutorial-new-specimen.md)
- [Terminology](@/ftest/terminology.md)

View file

@ -1,28 +0,0 @@
+++
title = "Quick Links"
insert_anchor_links = "right"
weight = 4
+++
# Quick Links
## Repositories
- [Source code](https://git.batsense.net/ForgeFlux/ftest)
- [Control repository](https://git.batsense.net/ForgeFlux/ftest-control)
- [Results repository](https://git.batsense.net/ForgeFlux/ftest-results)
- [Forgejo-init-script (Initialization code)](https://git.batsense.net/ForgeFlux/forgejo-init-script)
## Test suites
- [WebFinger](https://git.batsense.net/ForgeFlux/webfinger-test)
- [Nodeinfo](https://git.batsense.net/ForgeFlux/nodeinfo-test)
- [ActivityPub (WIP)](https://git.batsense.net/ForgeFlux/nodeinfo-test)
- [Host Meta (RFC6415)](https://git.batsense.net/ForgeFlux/host-meta-test)
## Container Images
- [WebFinger](https://hub.docker.com/r/forgeflux/webfinger-test/)
- [Nodeinfo](https://hub.docker.com/r/forgeflux/nodeinfo-test/)
- [ActivityPub](https://hub.docker.com/r/forgeflux/ap-test/)
- [Host Meta (RFC6415)](https://hub.docker.com/r/forgeflux/host-meta-test/)

View file

@ -1,58 +0,0 @@
+++
title = "Terminology"
insert_anchor_links = "right"
weight = 3
+++
## Specimen
The target of a ftest test job. These are the ActityPub or ForgeFlux
implementations that must be tested for compliance.
## Job Manifest
or `ftest.toml`
Contains information on the test environment, initialization code and
the test suites that has to be run on the [specimen](/ftest/terminology.md#specimen)
## Control Repository
- Flagship instance: [git.batsense.net/ForgeFlux/ftest-control](https://forgeflux.org/ForgeFlux/ftest-control)
A Repository that houses [job manifests](@/ftest/terminology.md#job-manifest), and Infrastructure-as-Code
(docker-compose, currently) to spin up a test environment containing the
[specimen](@/ftest/terminology.md#specimen).
### Directory structure
Each specimen has it's own directory in the control repository:
```bash
23:50 atm@lab ftest-control ±|gotosocial ✗|→ tree
└── targets
├── forgejo
│   ├── conf
│   │   └── app.ini
│   ├── docker-compose.yml
│   └── ftest.toml
└── gotosocial
├── data
│   └── config
│   └── config.yaml
├── docker-compose.yaml
└── Dockerfile
```
### Specimen docker-compose.yml
The control repository _MUST_ contain a `docker-compose.yml` to spin up
the specimen. It may include configuration files in the same directory,
which to docker-compose file can rely on using bind mounts within the container.
## Result Repository
Result repository contains the results of all the targets' jobs in JSON
format.

View file

@ -1,50 +0,0 @@
+++
title = "Tests"
insert_anchor_links = "right"
weight = 6
+++
Tests are Docker containers that test
[specimens](@/ftest/terminology.md#specimen) a very specific protocol
or a feature. They integrate with ftest by accepting configuration
parameters through environment variables and uploading results through a
REST API.
## Configuration (Environment Variables)
### Auto-generated
Some environment variables are automatically generated by ftest
| Name | Purpose |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `FTEST_AUTH` | Authentication token that should be used when uploading results to ftest server. It is ephemeral, and randomly generated for each test. |
| `FTEST_HOST` | The hostname of the ftest server. Results must be uploaded to here. Will be in format http://ftest:9000 |
| `FTEST_TARGET_HOST` | The hostname of the specimen server. Tests must be run against this hostname. Will be in format http://specimen:8080 |
### User provided
There's option to fetch custom environment variables also. Please
specify them in your test's documentation clearly. The README file of
the test is recommended.
## Results API:
A formal OpenAPI specification for the ftest server is yet to be
created. For now, this command should upload test results to the ftest
server:
```python
def upload_logs_to_ftest(auth, success: bool, logs: str):
ftest = f"http://ftest.example.org/api/v1/{auth}/results"
payload = {"success": success, "logs": logs}
res = requests.post(
ftest, json=payload, headers={"Origin": "http://example.org"}
)
if res.status_code == 200:
logger.info("Upload successful")
else:
print(res)
upload_logs_to_ftest("supersecretauthtoekn_provided_by_ftest", True, "")
```

View file

@ -1,40 +0,0 @@
+++
title = "[Tutorial] Add new specimen"
insert_anchor_links = "right"
weight = 7
+++
## How to add new specimen
### 1. Fork the [control repository](@/ftest/terminology.md#control-repository).
```
git clone https://git.batsense.net/ForgeFlux/ftest-control
```
### 2. Create specimen subdirectory
If [specimen](@/ftest/terminology.md#specimen) doesn't exist within `targets/` directory, then create subdirectory for it:
```bash
mkdir targets/<insert-specimen-name>
cd targets/<insert-specimen-name>
```
### 3. Create docker-compose.yml:
```bash
touch docker-compose.yml
```
Populate docker-compose.yml with instructions to spin up a test
environment for the specimen. The specimen's upstream sources
will include a reference docker-compose file should be fine in most cases.
### 4. Create job manifest
Job manifest is defined in `ftest.toml` file in the specimen's
subdirectory. It can contain information on:
#### Initialization code
needs to be run to prepare the test environment.

View file

@ -1,5 +0,0 @@
+++
title = "Updates"
weight = 90
sort_by = "weight"
+++

View file

@ -1,34 +0,0 @@
+++
title = "December 2020"
weight = 40
+++
# December 2020
## Northstar
As the development on [Northstar](@/Northstar/_index.md) nears the completion phase,
updates on it have slowed down, and the only updates that were made during this
stage mostly comprises of configuration updates.
These updates were mostly related to bootstrapping [DynaConf](https://www.dynaconf.com/),
as we embraced 12-factor app configuration recommendations, allowing for better
configuration management.
## Interface
Realising the need for validation of a request to an actor, an authentication
mechanism was developed to implement Matrix's [signed JSON](https://github.com/matrix-org/python-signedjson)
feature, but, was later replaced in favor of [HTTP Signatures](https://tools.ietf.org/html/draft-cavage-http-signatures).
Interface underwent major refactoring to improve test-ability and reliability in addition
to implementing authentication by a [signed JSON](https://github.com/matrix-org/python-signedjson)
mechanism implemented by the Matrix project. Taking note of rate-limits imposed by some forges,
we figured we'd have to cache responses and so data persistence was implemented by way of
storing in a database.
## References
These are a list of the Pull Requests where the following updates took place for the
organization.
- Forking Implementation :: [#34](https://github.com/forgeflux-org/interface/commit/5c9f61d60ce069963da7abc761b9ba3d81c8883a)
- Authentication :: [#36](https://github.com/forgeflux-org/interface/commit/5cc206cbe5be83cedac14949a537baad4c6351e3)
- DB Refactor :: [#39](https://github.com/forgeflux-org/interface/commit/57c9a085b38f8c3bab7975e18d21e4455ad3cac9), [#40](https://github.com/forgeflux-org/interface/commit/d9d785ca116e9a2bb9a40cf3eaa16a8b275d1593)

View file

@ -1,28 +0,0 @@
+++
title = "November 2020"
weight = 40
+++
# November 2020
Errors were modularized at the back of [Northstar](https://github.com/forgeflux-org/northstar/),
and A Docker CI was set up for the Northstar builds.
A [GitHub organization](https://github.com/forgeflux-org) was created for ForgeFedv2,
and the repositories for the projects were transferred over to it.
A Notification-Event Translation Mechanism was set up.
1. Northstar functionality was integrated into Interface, and tests were set up to ensure that it could be contacted through Interface's methods.
2. A locking mechanism was set up for concurrent operations on Git utilizing [Sled](https://sled.rs/).
3. Implementations of a basic job runner was set up to mimic retrieving requests from Forges, through periodically retrieving notifications.
4. The endpoints for notifications was subsequently set up, and responses to these Notifications were termed as events.
5. The endpoints for processing these events were then created.
Shifted over the configuration management to [Dynaconf](https://www.dynaconf.com/).
## References
- Integration with Northstar :: [Info](https://github.com/forgeflux-org/interface/commit/0c9d8bdff05e668d77a85fdfc89b37abe1ac86cb)
- Locking Mechanism with Sled :: [Info](https://github.com/forgeflux-org/interface/commit/d3e7c81c95d87b612ebb9562cac31d371fe8629e)
- Defining Events :: [Info](https://github.com/forgeflux-org/interface/commit/30547b783578a7a9548aca55b3b7c932ed8130e6)

View file

@ -1,35 +0,0 @@
+++
title = "October 2020"
weight = 40
+++
# October 2020
In the month of October, there were significant changes to the development
in ForgeFedv2, with the addition of the [OpenAPI Specification](https://forgeflux-org.github.io/northstar/)
for Northstar.
## Northstar
A database model was created to store the details of the various forge interfaces,
having these details would be a prerequisite to looking up a server.
Endpoints were subsequently created, following the defined OpenAPI specification.
While the Lookup service was in the process of development, terminologies and the
concept for Forge Federation was also being [discussed](https://github.com/forgeflux-org/spec/tree/master/rfc).
Docker support as part of the CI process was added into the mix, while
keeping in mind, that the test suite was the method to work with the application for
the time being.
An initial working model for the lookup service was established.
## Interface
Development of the `libgit` library had begun at this point.
[libgit] is a library that processes the contributor's changes, and generates a patch.
Details regarding the implementation and feature set of libgit will be covered in another section.
## References
- Database Initialization :: [database init](https://github.com/forgeflux-org/northstar/commit/6a82a1bc83d4733a5a077e33ad0c222aed496145)

View file

@ -1,16 +0,0 @@
+++
title = "September 2020"
weight = 40
+++
# September 2020
In the month of September, project "ForgeFedv2" started off by
initializing the lookup service, [Northstar](https://github.com/forgeflux-org/northstar/).
The initialization mostly comprised of setting up the CI environment,
and focused more on defining the structure of the project, and how
we were to be going about it.
A discussion on the terminology and the primitive method of the
project's functionality were discussed.

10
elasticlunr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
fabric-icons-inline.css Normal file
View file

@ -0,0 +1 @@
@font-face{font-family:'FabricMDL2Icons';src:url("data:application/octet-stream;base64,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") format("truetype")}.ms-Icon{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-family:'FabricMDL2Icons';font-style:normal;font-weight:normal;speak:none}.ms-Icon--ChevronRightSmall:before{content:"\E970"}.ms-Icon--ChromeClose:before{content:"\E8BB"}.ms-Icon--Copy:before{content:"\E8C8"}.ms-Icon--GlobalNavButton:before{content:"\E700"}.ms-Icon--MiniLink:before{content:"\E732"}.ms-Icon--Page:before{content:"\E7C3"}.ms-Icon--ProductRelease:before{content:"\EE2E"}.ms-Icon--Save:before{content:"\E74E"}.ms-Icon--Search:before{content:"\E721"}

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

388
ftest/cli/index.html Normal file
View file

@ -0,0 +1,388 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | Using ftest CLI </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<ul id="toc">
<li><a href="https://docs.forgeflux.org/ftest/cli/#0-install-runtime-dependencies">0. Install Runtime Dependencies</a>
</li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#1-setup-networking">1. Setup networking</a>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/cli/#i-create-docker-network-ftest">i. Create Docker network ftest</a></li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#ii-allow-traffic-from-ftest-net-to-host-machine-on-port-29130">ii. Allow traffic from ftest net to host machine on port 29130</a></li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#2-optional-install-from-source">2. [Optional] Install from source</a></li>
</ul>
</li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#2-install-from-binary">2. Install from binary</a>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/cli/#i-download-assets">i. Download assets</a></li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#ii-verify-checksum">ii Verify checksum</a></li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#iii-verify-gpg-signature">iii Verify GPG signature</a></li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#iv-install-binary">iv. Install binary</a></li>
</ul>
</li>
<li><a href="https://docs.forgeflux.org/ftest/cli/#3-run">3. Run</a>
</li>
</ul>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<p>The ftest binary can run in the following modes:</p>
<ol>
<li>
<p>Daemon: will act as a job server, listening for webhook events to
schedule new jobs. This mode is to be used on servers.</p>
</li>
<li>
<p>CLI: Useful for running compliance tests locally on one's own
computer.</p>
</li>
</ol>
<h2 id="0-install-runtime-dependencies">0. Install Runtime Dependencies&nbsp;<a class="anchor" href="#0-install-runtime-dependencies">&#xE732;</a></h2>
<p>ftest invokes a few binaries that are listed bellow:</p>
<ol>
<li><a href="https://packages.debian.org/bookworm/iproute2">iproute2</a></li>
<li>Docker</li>
<li>docker-compose</li>
<li>git</li>
</ol>
<p><em>NOTE: The user running ftest binary must be part of the <code>docker</code> UNIX
group</em></p>
<h2 id="1-setup-networking">1. Setup networking&nbsp;<a class="anchor" href="#1-setup-networking">&#xE732;</a></h2>
<p>ftest spawns a HTTP server to collect results from test suites. Right
now, it is hard-coded to listen on port <code>29130</code>. And, since test jobs
are run in containers and the ftest binary is going to be run on host
machine, we have to setup Docker and host machine's firewall to allow
traffic. We use an <a href="https://git.batsense.net/ForgeFlux/ftest-nginx-proxy">nginx
container</a> to
achieve this.</p>
<p>This guide has instructions for <code>ufw</code>, please adopt the same for your
setup.</p>
<h3 id="i-create-docker-network-ftest">i. Create Docker network <code>ftest</code>&nbsp;<a class="anchor" href="#i-create-docker-network-ftest">&#xE732;</a></h3>
<pre style="background-color:#eff1f5;color:#4f5b66;"><code><span>docker network create --attachable -d bridge --subnet 192.168.32.0/20 ftest
</span></code></pre>
<p><em>NOTE: if choosing custom subnet, adjust instructions in the section to match it</em></p>
<h3 id="ii-allow-traffic-from-ftest-net-to-host-machine-on-port-29130">ii. Allow traffic from <code>ftest</code> net to host machine on port <code>29130</code>&nbsp;<a class="anchor" href="#ii-allow-traffic-from-ftest-net-to-host-machine-on-port-29130">&#xE732;</a></h3>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">sudo</span><span> ufw allow from 192.168.32.0/20 proto tcp to any port 29130
</span></code></pre>
<h3 id="2-optional-install-from-source">2. [Optional] Install from source&nbsp;<a class="anchor" href="#2-optional-install-from-source">&#xE732;</a></h3>
<p>Requires cargo, the Rust build tool. Please see
<a href="https://rustup.rs/">here</a> for installation instructions.</p>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">git</span><span> clone https://git.batsense.net/ForgeFlux/ftest
</span><span style="color:#96b5b4;">cd</span><span> ftest
</span><span style="color:#bf616a;">cargo</span><span> build</span><span style="color:#bf616a;"> --release
</span><span style="color:#bf616a;">sudo</span><span> cp target/release/ftest /usr/local/bin
</span></code></pre>
<h2 id="2-install-from-binary">2. Install from binary&nbsp;<a class="anchor" href="#2-install-from-binary">&#xE732;</a></h2>
<h3 id="i-download-assets">i. Download assets&nbsp;<a class="anchor" href="#i-download-assets">&#xE732;</a></h3>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">wget</span><span> https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz.asc
</span><span style="color:#bf616a;">wget</span><span> https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz.sha256
</span><span style="color:#bf616a;">wget</span><span> https://dl.forgeflux.org/forgeflux/ftest/master/ftest-master-linux-amd64.tar.gz
</span></code></pre>
<h3 id="ii-verify-checksum">ii Verify checksum&nbsp;<a class="anchor" href="#ii-verify-checksum">&#xE732;</a></h3>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">sha256sum -c</span><span> ftest-master-linux-amd64.tar.gz.sha256
</span></code></pre>
<h3 id="iii-verify-gpg-signature">iii Verify GPG signature&nbsp;<a class="anchor" href="#iii-verify-gpg-signature">&#xE732;</a></h3>
<p>All ForgeFlux binaries are signed with <a href="http://keyserver.ubuntu.com/pks/lookup?search=56861597C15E54520A36983A6828E4A2E5B91DB9&amp;fingerprint=on&amp;op=index">our GPG
key</a>.
Please verify signatures to verify authenticity.</p>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">gpg --keyserver</span><span> keyserver.ubuntu.com</span><span style="color:#bf616a;"> --recv</span><span> 56861597C15E54520A36983A6828E4A2E5B91DB9
</span><span style="color:#bf616a;">gpg --verify</span><span> ftest-master-linux-amd64.tar.gz.asc
</span></code></pre>
<h3 id="iv-install-binary">iv. Install binary&nbsp;<a class="anchor" href="#iv-install-binary">&#xE732;</a></h3>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">tar -xvzf</span><span> ftest-master-linux-amd64.tar.gz &amp;&amp; </span><span style="color:#bf616a;">sudo</span><span> cp ftest-master-linux-amd64/ftest /usr/local/bin
</span></code></pre>
<h2 id="3-run">3. Run&nbsp;<a class="anchor" href="#3-run">&#xE732;</a></h2>
<p>The <a href="https://docs.forgeflux.org/ftest/terminology/#control-repository">control repository</a> has
a few pre-configured targets. We recommend starting from there. Please
see <a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">here</a> to configure ftest for new <a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimens</a>.</p>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">git</span><span> clone https://git.batsense.net/ForgeFlux/ftest-control
</span><span style="color:#96b5b4;">cd</span><span> ftest-control/targets/forgejo
</span><span style="color:#bf616a;">ftest</span><span> test .
</span></code></pre>
<p>The results will be available in JSON format and HTML format (like this
one <a href="/example/ftest/results/targets/forgejo/results">here</a>) in the same
directory.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

311
ftest/ftest-toml/index.html Normal file
View file

@ -0,0 +1,311 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | ftest.toml </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<ul id="toc">
<li><a href="https://docs.forgeflux.org/ftest/ftest-toml/#fest-toml-or-job-manifest">fest.toml or Job Manifest</a>
</li>
<li><a href="https://docs.forgeflux.org/ftest/ftest-toml/#ftest-toml-contents">ftest.toml contents:</a>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/ftest-toml/#1-initialization-code">1. Initialization code</a></li>
<li><a href="https://docs.forgeflux.org/ftest/ftest-toml/#2-test-suite">2. Test Suite</a></li>
<li><a href="https://docs.forgeflux.org/ftest/ftest-toml/#3-tests">3. Tests</a></li>
</ul>
</li>
</ul>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h2 id="fest-toml-or-job-manifest"><code>fest.toml</code> or Job Manifest&nbsp;<a class="anchor" href="#fest-toml-or-job-manifest">&#xE732;</a></h2>
<p>Job manifest is defined in <code>ftest.toml</code> file in the specimen's
subdirectory.</p>
<h2 id="ftest-toml-contents">ftest.toml contents:&nbsp;<a class="anchor" href="#ftest-toml-contents">&#xE732;</a></h2>
<p>It can contain information on:</p>
<h3 id="1-initialization-code">1. Initialization code&nbsp;<a class="anchor" href="#1-initialization-code">&#xE732;</a></h3>
<p>The code that needs to be run to prepare the test environment. ftest
runs Docker containers to initialize test environments.</p>
<h4 id="example">Example&nbsp;<a class="anchor" href="#example">&#xE732;</a></h4>
<p><a href="https://git.batsense.net/ForgeFlux/forgejo-init-script">forgejo-init-script</a> performs the following operations in a sequence:</p>
<ol>
<li>Install Forgejo (the binary starts with a web installer that accepts
configuration parameters for database, mailer, etc.)</li>
<li>Create accounts</li>
<li>Create repositories</li>
<li>Create issues</li>
<li>Create access tokens</li>
</ol>
<p>NOTE: Some of these operations are irrelevant, as I (@realaravinth) had nicked them from
another project of mine and was too lazy to modify ;)</p>
<h3 id="2-test-suite">2. Test Suite&nbsp;<a class="anchor" href="#2-test-suite">&#xE732;</a></h3>
<p>A test suite is a collection of tests. For instance, ActivityPub is a
test suite that could include tests for the WebFinger protocol and the
Nodeinfo protocol.</p>
<h3 id="3-tests">3. Tests&nbsp;<a class="anchor" href="#3-tests">&#xE732;</a></h3>
<p>A test is a docker container that tests the
<a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimen</a> for a specific protocol or
feature.</p>
<h4 id="example-1">Example&nbsp;<a class="anchor" href="#example-1">&#xE732;</a></h4>
<p><a href="https://git.batsense.net/nodeinfo-test">Nodeinfo test</a> is the simplest
test available within ftest at the moment. It tests the specimen's
Nodeinfo implementation against the <a href="https://nodeinfo.diaspora.software/protocol.html">Nodeinfo specification</a>.</p>
<p>Please see <a href="/ftest/tests.md">here</a> for developing new tests.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

6
ftest/index.html Normal file
View file

@ -0,0 +1,6 @@
<!doctype html>
<meta charset="utf-8">
<link rel="canonical" href="https://docs.forgeflux.org/ftest/introduction/">
<meta http-equiv="refresh" content="0; url=https://docs.forgeflux.org/ftest/introduction/">
<title>Redirect</title>
<p><a href="https://docs.forgeflux.org/ftest/introduction/">Click here</a> to be redirected.</p>

View file

@ -0,0 +1,277 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | Introducing ftest </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li class="active">
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<ul>
<li><a href="https://git.batsense.net/ForgeFlux/ftest">Source code</a></li>
<li>Status: Usable</li>
<li>Description: Compliance checker/test runner for <a href="https://activitypub.rocks">ActivityPub</a> and by
extension, <a href="https://forgefed.org">ForgeFed</a></li>
</ul>
<p><code>ftest</code> is a compliance checking tool that is similar to
<a href="https://github.com/matrix-org/sytest">matrix-org/sytest</a> but for ActivityPub and ForgeFed.</p>
<p>An instance (will be) is hosted by ForgeFlux, that is run on renewable
energy.</p>
<h2 id="mechanism">Mechanism&nbsp;<a class="anchor" href="#mechanism">&#xE732;</a></h2>
<ol>
<li>New jobs are fetched from the <a href="https://docs.forgeflux.org/ftest/terminology/#control-repository">control repository</a>. At any given time, ftest will run only one job. Therefore, each commit on the control repository must modify one <a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimen</a> only.</li>
<li>TODO: create <code>ftest</code> Docker network (right now, this is done by hand)</li>
<li>The specimen test environment is deployed using <code>docker-compose.yml</code>
available in the test network. The specimen might have dependency
services (like a database or a chase), but the specimen service
should be added to the <code>ftest</code> network.</li>
<li>Get a list of initialization workflows from <code>ftest.toml</code> and run them
sequentially.</li>
<li>Run test suites sequentially. A test suite might contain more than
one tests, all of them are launched in parallel. They are added to
the <code>ftest</code> Docker net by the <code>ftest</code> server.</li>
<li>Wait for tests from previous test to run to completion, collect logs
and delete containers. And run next test suite.</li>
<li>Aggregate logs and write to <a href="https://docs.forgeflux.org/ftest/terminology/#result-repository">result repository</a>.</li>
<li>Push result repository.</li>
<li>Wait for next test job.</li>
</ol>
<h2 id="quick-links">Quick links&nbsp;<a class="anchor" href="#quick-links">&#xE732;</a></h2>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">Add new specimen to ftest</a></li>
<li><a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a></li>
</ul>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

@ -0,0 +1,271 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | Quick Links </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="quick-links">Quick Links&nbsp;<a class="anchor" href="#quick-links">&#xE732;</a></h1>
<h2 id="repositories">Repositories&nbsp;<a class="anchor" href="#repositories">&#xE732;</a></h2>
<ul>
<li><a href="https://git.batsense.net/ForgeFlux/ftest">Source code</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/ftest-control">Control repository</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/ftest-results">Results repository</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/forgejo-init-script">Forgejo-init-script (Initialization code)</a></li>
</ul>
<h2 id="test-suites">Test suites&nbsp;<a class="anchor" href="#test-suites">&#xE732;</a></h2>
<ul>
<li><a href="https://git.batsense.net/ForgeFlux/webfinger-test">WebFinger</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/nodeinfo-test">Nodeinfo</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/nodeinfo-test">ActivityPub (WIP)</a></li>
<li><a href="https://git.batsense.net/ForgeFlux/host-meta-test">Host Meta (RFC6415)</a></li>
</ul>
<h2 id="container-images">Container Images&nbsp;<a class="anchor" href="#container-images">&#xE732;</a></h2>
<ul>
<li><a href="https://hub.docker.com/r/forgeflux/webfinger-test/">WebFinger</a></li>
<li><a href="https://hub.docker.com/r/forgeflux/nodeinfo-test/">Nodeinfo</a></li>
<li><a href="https://hub.docker.com/r/forgeflux/ap-test/">ActivityPub</a></li>
<li><a href="https://hub.docker.com/r/forgeflux/host-meta-test/">Host Meta (RFC6415)</a></li>
</ul>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

@ -0,0 +1,321 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | Terminology </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<ul id="toc">
<li><a href="https://docs.forgeflux.org/ftest/terminology/#specimen">Specimen</a>
</li>
<li><a href="https://docs.forgeflux.org/ftest/terminology/#job-manifest">Job Manifest</a>
</li>
<li><a href="https://docs.forgeflux.org/ftest/terminology/#control-repository">Control Repository</a>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/terminology/#directory-structure">Directory structure</a></li>
<li><a href="https://docs.forgeflux.org/ftest/terminology/#specimen-docker-compose-yml">Specimen docker-compose.yml</a></li>
</ul>
</li>
<li><a href="https://docs.forgeflux.org/ftest/terminology/#result-repository">Result Repository</a>
</li>
</ul>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h2 id="specimen">Specimen&nbsp;<a class="anchor" href="#specimen">&#xE732;</a></h2>
<p>The target of a ftest test job. These are the ActityPub or ForgeFlux
implementations that must be tested for compliance.</p>
<h2 id="job-manifest">Job Manifest&nbsp;<a class="anchor" href="#job-manifest">&#xE732;</a></h2>
<p>or <code>ftest.toml</code></p>
<p>Contains information on the test environment, initialization code and
the test suites that has to be run on the <a href="/ftest/terminology.md#specimen">specimen</a></p>
<h2 id="control-repository">Control Repository&nbsp;<a class="anchor" href="#control-repository">&#xE732;</a></h2>
<ul>
<li>Flagship instance: <a href="https://forgeflux.org/ForgeFlux/ftest-control">git.batsense.net/ForgeFlux/ftest-control</a></li>
</ul>
<p>A Repository that houses <a href="https://docs.forgeflux.org/ftest/terminology/#job-manifest">job manifests</a>, and Infrastructure-as-Code
(docker-compose, currently) to spin up a test environment containing the
<a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimen</a>.</p>
<h3 id="directory-structure">Directory structure&nbsp;<a class="anchor" href="#directory-structure">&#xE732;</a></h3>
<p>Each specimen has it's own directory in the control repository:</p>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">23:50</span><span> atm@lab ftest-control ±|</span><span style="color:#bf616a;">gotosocial</span><span> ✗|</span><span style="color:#bf616a;"></span><span> tree
</span><span>
</span><span style="color:#bf616a;">└──</span><span> targets
</span><span> </span><span style="color:#bf616a;">├──</span><span> forgejo
</span><span> </span><span style="color:#bf616a;"></span><span>   ├── conf
</span><span> </span><span style="color:#bf616a;"></span><span>   │   └── app.ini
</span><span> </span><span style="color:#bf616a;"></span><span>   ├── docker-compose.yml
</span><span> </span><span style="color:#bf616a;"></span><span>   └── ftest.toml
</span><span> </span><span style="color:#bf616a;">└──</span><span> gotosocial
</span><span> </span><span style="color:#bf616a;">├──</span><span> data
</span><span> </span><span style="color:#bf616a;"></span><span>   └── config
</span><span> </span><span style="color:#bf616a;"></span><span>   └── config.yaml
</span><span> </span><span style="color:#bf616a;">├──</span><span> docker-compose.yaml
</span><span> </span><span style="color:#bf616a;">└──</span><span> Dockerfile
</span></code></pre>
<h3 id="specimen-docker-compose-yml">Specimen docker-compose.yml&nbsp;<a class="anchor" href="#specimen-docker-compose-yml">&#xE732;</a></h3>
<p>The control repository <em>MUST</em> contain a <code>docker-compose.yml</code> to spin up
the specimen. It may include configuration files in the same directory,
which to docker-compose file can rely on using bind mounts within the container.</p>
<h2 id="result-repository">Result Repository&nbsp;<a class="anchor" href="#result-repository">&#xE732;</a></h2>
<p>Result repository contains the results of all the targets' jobs in JSON
format.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

283
ftest/tests/index.html Normal file
View file

@ -0,0 +1,283 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | Tests </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<p>Tests are Docker containers that test
<a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimens</a> a very specific protocol
or a feature. They integrate with ftest by accepting configuration
parameters through environment variables and uploading results through a
REST API.</p>
<h2 id="configuration-environment-variables">Configuration (Environment Variables)&nbsp;<a class="anchor" href="#configuration-environment-variables">&#xE732;</a></h2>
<h3 id="auto-generated">Auto-generated&nbsp;<a class="anchor" href="#auto-generated">&#xE732;</a></h3>
<p>Some environment variables are automatically generated by ftest</p>
<table><thead><tr><th>Name</th><th>Purpose</th></tr></thead><tbody>
<tr><td><code>FTEST_AUTH</code></td><td>Authentication token that should be used when uploading results to ftest server. It is ephemeral, and randomly generated for each test.</td></tr>
<tr><td><code>FTEST_HOST</code></td><td>The hostname of the ftest server. Results must be uploaded to here. Will be in format http://ftest:9000</td></tr>
<tr><td><code>FTEST_TARGET_HOST</code></td><td>The hostname of the specimen server. Tests must be run against this hostname. Will be in format http://specimen:8080</td></tr>
</tbody></table>
<h3 id="user-provided">User provided&nbsp;<a class="anchor" href="#user-provided">&#xE732;</a></h3>
<p>There's option to fetch custom environment variables also. Please
specify them in your test's documentation clearly. The README file of
the test is recommended.</p>
<h2 id="results-api">Results API:&nbsp;<a class="anchor" href="#results-api">&#xE732;</a></h2>
<p>A formal OpenAPI specification for the ftest server is yet to be
created. For now, this command should upload test results to the ftest
server:</p>
<pre data-lang="python" style="background-color:#eff1f5;color:#4f5b66;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">upload_logs_to_ftest</span><span>(</span><span style="color:#bf616a;">auth</span><span>, </span><span style="color:#bf616a;">success</span><span>: bool, </span><span style="color:#bf616a;">logs</span><span>: str):
</span><span> ftest = </span><span style="color:#b48ead;">f</span><span>&quot;</span><span style="color:#a3be8c;">http://ftest.example.org/api/v1/</span><span>{auth}</span><span style="color:#a3be8c;">/results</span><span>&quot;
</span><span> payload = {&quot;</span><span style="color:#a3be8c;">success</span><span>&quot;: success, &quot;</span><span style="color:#a3be8c;">logs</span><span>&quot;: logs}
</span><span> res = requests.</span><span style="color:#bf616a;">post</span><span>(
</span><span> ftest, </span><span style="color:#bf616a;">json</span><span>=payload, </span><span style="color:#bf616a;">headers</span><span>={&quot;</span><span style="color:#a3be8c;">Origin</span><span>&quot;: &quot;</span><span style="color:#a3be8c;">http://example.org</span><span>&quot;}
</span><span> )
</span><span> </span><span style="color:#b48ead;">if </span><span>res.status_code == </span><span style="color:#d08770;">200</span><span>:
</span><span> logger.</span><span style="color:#bf616a;">info</span><span>(&quot;</span><span style="color:#a3be8c;">Upload successful</span><span>&quot;)
</span><span> </span><span style="color:#b48ead;">else</span><span>:
</span><span> </span><span style="color:#96b5b4;">print</span><span>(res)
</span><span>
</span><span style="color:#bf616a;">upload_logs_to_ftest</span><span>(&quot;</span><span style="color:#a3be8c;">supersecretauthtoekn_provided_by_ftest</span><span>&quot;, </span><span style="color:#d08770;">True</span><span>, &quot;&quot;)
</span></code></pre>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

@ -0,0 +1,294 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | [Tutorial] Add new specimen </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
checked />
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
<ul id="toc">
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/#how-to-add-new-specimen">How to add new specimen</a>
<ul>
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/#1-fork-the-control-repository">1. Fork the control repository.</a></li>
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/#2-create-specimen-subdirectory">2. Create specimen subdirectory</a></li>
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/#3-create-docker-compose-yml">3. Create docker-compose.yml:</a></li>
<li><a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/#4-create-job-manifest">4. Create job manifest</a></li>
</ul>
</li>
</ul>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h2 id="how-to-add-new-specimen">How to add new specimen&nbsp;<a class="anchor" href="#how-to-add-new-specimen">&#xE732;</a></h2>
<h3 id="1-fork-the-control-repository">1. Fork the <a href="https://docs.forgeflux.org/ftest/terminology/#control-repository">control repository</a>.&nbsp;<a class="anchor" href="#1-fork-the-control-repository">&#xE732;</a></h3>
<pre style="background-color:#eff1f5;color:#4f5b66;"><code><span>git clone https://git.batsense.net/ForgeFlux/ftest-control
</span></code></pre>
<h3 id="2-create-specimen-subdirectory">2. Create specimen subdirectory&nbsp;<a class="anchor" href="#2-create-specimen-subdirectory">&#xE732;</a></h3>
<p>If <a href="https://docs.forgeflux.org/ftest/terminology/#specimen">specimen</a> doesn't exist within <code>targets/</code> directory, then create subdirectory for it:</p>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">mkdir</span><span> targets/&lt;insert-specimen-name&gt;
</span><span style="color:#96b5b4;">cd</span><span> targets/&lt;insert-specimen-name&gt;
</span></code></pre>
<h3 id="3-create-docker-compose-yml">3. Create docker-compose.yml:&nbsp;<a class="anchor" href="#3-create-docker-compose-yml">&#xE732;</a></h3>
<pre data-lang="bash" style="background-color:#eff1f5;color:#4f5b66;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">touch</span><span> docker-compose.yml
</span></code></pre>
<p>Populate docker-compose.yml with instructions to spin up a test
environment for the specimen. The specimen's upstream sources
will include a reference docker-compose file should be fine in most cases.</p>
<h3 id="4-create-job-manifest">4. Create job manifest&nbsp;<a class="anchor" href="#4-create-job-manifest">&#xE732;</a></h3>
<p>Job manifest is defined in <code>ftest.toml</code> file in the specimen's
subdirectory. It can contain information on:</p>
<h4 id="initialization-code">Initialization code&nbsp;<a class="anchor" href="#initialization-code">&#xE732;</a></h4>
<p>needs to be run to prepare the test environment.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

308
index.html Normal file
View file

@ -0,0 +1,308 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>Docs</title>
</head>
<body>
<main>
<nav>
<img src="/logo.svg" alt="" />
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
/>
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h2 id="status">Status&nbsp;<a class="anchor" href="#status">&#xE732;</a></h2>
<p>This site is Work-in-Progress, and as such, everything is in an
incomplete-state.</p>
<h2 id="source-code">Source code&nbsp;<a class="anchor" href="#source-code">&#xE732;</a></h2>
<p>Split between two forges, slowly migrating to self-hosted
<a href="https://forgejo.org">Forgejo</a> instance at
<a href="https://git.batsense.net">git.batsense.net</a></p>
<ol>
<li><a href="https://git.batsense.net/ForgeFlux">git.batsense.net</a></li>
<li><a href="https://github.com/forgeflux-org">GitHub</a></li>
</ol>
<h2 id="projects-overview">Projects Overview&nbsp;<a class="anchor" href="#projects-overview">&#xE732;</a></h2>
<h3 id="project-status-what-does-it-mean">Project Status: what does it mean?&nbsp;<a class="anchor" href="#project-status-what-does-it-mean">&#xE732;</a></h3>
<ol>
<li>WIP: Code isn't usable.</li>
<li>Usable: Code works, but user experience isn't polished. Can be used
with a bit of patience ;)</li>
<li>Production: Ready for use</li>
</ol>
<h3 id="1-interface">1. Interface&nbsp;<a class="anchor" href="#1-interface">&#xE732;</a></h3>
<ul>
<li><a href="https://github.com/forgeflux-org/interface">Source code</a></li>
<li>Status: WIP</li>
<li>Description: API-space software forge federation implementation.</li>
</ul>
<p>Federation will take time to implement in most, popular software forge
implementations. Interface aims to use the forge's REST API or similar
and create a federation layer on top of it.</p>
<p>Currently, implementation has minimal support for Forgejo and Gitea. A
Forgejo user can be exposed to Fediverse through WebFinger using
Interface.</p>
<h3 id="2-northstar">2. Northstar&nbsp;<a class="anchor" href="#2-northstar">&#xE732;</a></h3>
<ul>
<li><a href="https://github.com/forgeflux-org/northstar">Source code</a></li>
<li>Status: Production</li>
<li>Description: A lookup service for federating software forges</li>
<li>Flagship instance: <a href="https://northstar.forgeflux.org">northstar.forgeflux.org</a></li>
</ul>
<p>Interface's API-based, external, third-party approach introduces a
unique problem: how to locate the internet address (hostname) of the
Interface that services a forgege? Enter Northstar. It is a simple
Key-Value search server that maps forges and internfaces</p>
<h3 id="3-starchart">3. Starchart&nbsp;<a class="anchor" href="#3-starchart">&#xE732;</a></h3>
<ul>
<li><a href="https://github.com/forgeflux-org/starchart">Source code</a></li>
<li>Status: Usable</li>
<li>Description: Spider and search engine for federating forges</li>
<li>Flagship instance:
<a href="https://starchart.forgeflux.org">starchart.forgeflux.org</a></li>
</ul>
<p>Projects on centralized forges like GitHub and GitLab enjoy good
visibility through network effect, good search engine indexing and
through third-party tools like
<a href="https://awesomeopensource.com/">awesomeopensource.com/</a>.</p>
<p>Starchart aims to provide high-visibility for projects on independently
hosted forges by indexing them and exposing the index with a searchable
index. The index is designed to be replicated, so that new Starchart
instances can be bootstrapped from an existing Starchart instance's
data.</p>
<h3 id="4-f3-rs">4. f3-rs&nbsp;<a class="anchor" href="#4-f3-rs">&#xE732;</a></h3>
<ul>
<li><a href="https://git.batsense.net/ForgeFlux/f3-rs">Source code</a></li>
<li>Status: WIP</li>
<li>Description: Rust port of the <a href="https://f3.forgefriends.org/">Friendly Forge Format</a> library</li>
<li>Documentation link: <a href="https://forgeflux.org">f3.forgeflux.org</a></li>
</ul>
<h3 id="4-ftest">4. ftest&nbsp;<a class="anchor" href="#4-ftest">&#xE732;</a></h3>
<ul>
<li><a href="https://git.batsense.net/ForgeFlux/ftest">Source code</a></li>
<li>Status: Usable</li>
<li>Description: Compliance checker/test runner for <a href="https://activitypub.rocks">ActivityPub</a> and by
extension, <a href="https://forgefed.org">ForgeFed</a></li>
</ul>
<p>The idea is to create something similar to
<a href="https://github.com/matrix-org/sytest">matrix-org/sytest</a>, but for
ActivityPub and ForgeFed. This way, we'll be able to measure how
compliant an implementation is to the specifications, which we hope will
improve interoperability between instances.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

View file

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

1
main.css Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,21 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
":dependencyDashboard"
],
"labels": [
"renovate-bot"
],
"prHourlyLimit": 0,
"timezone": "Asia/kolkata",
"prCreation": "immediate",
"vulnerabilityAlerts": {
"enabled": true,
"labels": [
"renovate-bot",
"renovate-security",
"security"
]
}
}

3
robots.txt Normal file
View file

@ -0,0 +1,3 @@
User-agent: *
Allow: /
Sitemap: https://docs.forgeflux.org/sitemap.xml

View file

@ -1,61 +0,0 @@
.search-container {
display: none;
&--is-visible {
display: block;
width: 100%;
}
#search {
width: 100%;
display: block;
border:none;
border-left: 1px solid $color;
padding:1px 0;
text-align: left;
line-height: $baseline;
font-size: $font-size;
font-family:$font-family;
color:$color;
background:transparent;
}
#search:focus {
outline:none;
border:none;
}
.search-results {
&__header {
font-weight: bold;
padding: 1rem 0rem;
}
&__items {
margin: 0 2vw;
padding: 0;
list-style: circle;
}
&__item {
margin-bottom: 1rem;
}
&__teaser {
}
}
}
#on_right {
display: block;
text-align: right;
margin-bottom: $baseline;
}
#search-ico {
font-family: 'FabricMDL2Icons';
cursor: pointer;
font-size: $baseline;
line-height: 1;
}

View file

@ -1,13 +0,0 @@
$baseline: 1.5rem;
$background:#f9f9f9;
$color:#222;
$links: #00f;
$hover-links:#c00;
$visited-links:#009;
$font-size: 1.125rem;
$font-family: Segoe UI,system-ui,-apple-system,sans-serif;
$line-height: 1.75;
$code_font: 400 1.125rem/1.75 SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;

View file

@ -1,40 +0,0 @@
/*
Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license
*/
@font-face {
font-family: 'FabricMDL2Icons';
src: url('data:application/octet-stream;base64,d09GRgABAAAAAAusAA4AAAAAFLgABDXDAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMUZ1H2NtYXAAAAGMAAAAWgAAAYKg2Y81Y3Z0IAAAAegAAAAgAAAAKgnZCa9mcGdtAAACCAAAAPAAAAFZ/J7mjmdhc3AAAAL4AAAADAAAAAwACAAbZ2x5ZgAAAwQAAANyAAAEuLnx29VoZWFkAAAGeAAAADIAAAA2A3zu4GhoZWEAAAasAAAAFQAAACQQAQgDaG10eAAABsQAAAAYAAAAGA+HAaZsb2NhAAAG3AAAABYAAAAWBoYE+m1heHAAAAb0AAAAHQAAACAAJAHEbmFtZQAABxQAAAP3AAAJ+o6N8lFwb3N0AAALDAAAABQAAAAg/1EAgXByZXAAAAsgAAAAiQAAANN4vfIOeJxjYGHfzjiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs8Z3ulxgPkQkgGsjgXCU2BgAADc3QgGeJxjYGBgZoBgGQZGBhCoAfIYwXwWhgQgLcIgABRhec7wXPG50XO/54df7H5x4mXBO73//xkYsIlKMko8lLgqsVXCUdxL3E5shuBtqMkYgJENu/hIAgCdyyInAAB4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icXVNNaBtXEJ55b1dPsl0165UqUOJ1dze7mx+quFrJilwQwgQ3P8UpOGCKUhNfSnrqJb/Q4BcoGAr9CfSUGHpyLr2VJCT0klsv7SVXQ29uySmJCbQr7646byWnpjvsm583b+bNN/OAwX0A7Sv9GnAQAC3DNjzbsO/zP+JH7FFyFvRr/a9/0BaBPg6AMg85OgAFKMJR+CWzctCOPwY48ATegtzrJzAGnNZ8Juskz7yPdtMuG2+WPPwD//26lDIGKRmurQFTifJE4EKL8tUtrVwqaq7jB5ijtdloYQ2bjY5m1jus2agx1ymycslienf1wcbti/X6xdsbD1ZvbV+KX5jVqm/yA+cvDG3Xn230ehvPro94Hobm4bEL5+OXpl+tmty4tH1raNuFfe4Zp8olSEFE9U9CFYLsjozqCoxGh4VI4NEfEtnoEpquUSHRsAUcrLmlaHu75NYOIsWJCbeESkfJQO6CvPsZJ1lItR/JP/W7yj8BJndlKhEGhHtCR/r37jFIYdgPCdS0vOqHIOwBVSLTLmTcEBBJreehl26hTCGW+lbfy9NZ9KKeTkhHFAPf4D0OUEBRwKCArQJWtDv8izsxEfFsIZUuvV+NlQtAhgkImgwKMw4GVEY3IQRCMww8ewSKQoEqTYH3UEpvczOWzBtAQppGNSZSA21r10OZIy2Vm1sIfckIlL5Us6fCMwnvwTn4fIR6qchc26mxwC7yTGiqHti0VbE7PEQakVY2NLMfYE15DEeFPEazoywirL9TLuWOo8XD3NP5K8thuHxlfgDty0tzE+nribmly+0BzF9drteXr87j0I4TmT2WVnvm8NjDqu9XH44dnmlbAziy0LCsxsIRXe5JA/i/F5Mqh4rpn1o5eXLllK9iq9x7egqTzokpGkh/6oQzqaLsRVN8/x4gfgoi96GI1NMsMNVAtsijWLziIo5eCZJiscMFFzv0HiWwPIhf4W0wqVM+1FW3iAQaNDg50VS8hUYL9SHGOYG6iR2szDYbvuuQKlqcusXenU7WeJd3F+YSme6w038n371MHqd/6c+PnZmdtg4lYbq+wn6fOt0rH50uVseSj5x1HLBPsBt/n75Yw672Mf6YrqY7485P6dM00JbSn7/EdvLtDVz8JpVW88yx4CxFWcGb7LepQ1HZmg4KFGXdgX8Bg/8uhAAAeJxjYGRgYGAxPVwnx6UQz2/zlYGbgwEE9v892ACi78Sumg+iORjA4pwMTCAKAB/CCRAAAHicY2BkYOBgAAE4yciACpgAAsoAHQAAAAUqAKYIAAAAAAAAgACAAAAAgAAAAV0AgAAAABYASACYAN4BAAEiAVQB4gH4AlwAAHicY2BkYGDgYshiYGUAAUYwyQXCjJEgJgAOogDqAAAAeJy1VE+LGzcUf1472S1plhIo5KhDKZvFjLNuIDQ5LUlzyl42YSGXgjySZ0TGIyFpMkzpoccc+jF6CfRTlBZ67LmfoOeeeux7bzReb+yGbaEeRvPT0/v7e08GgLujz2EE/e8LfHs8gju46/Ee7MNXCY9R/jzhCeKvE74BH4NL+CZ8At8mvA9fwvcJH8Cn8EvCt+AYfk/49ujn0SThQzje+xWjjCYf4U7t/ZnwCD4bXyS8B4fjbxIeo/xtwhPEPyZ8A+6Of0v4JojxHwnvg58cJHwAx5PBzy14Ofkh4dvjt5O/Ej6Elwff/fROzO+fPBRnJvc22GUUT6x31stobJ2J06oS56YoYxDnOmj/RqvsmVx4k4uzp8/n4jQEHcO5LppK+u2DbcmF9gE9iwfZ/KQ/pcP+7IUurBYmCCmil0qvpH8t7FLEUm/kV3jbOBLnduVkbXTIdiZfxugezWZt22ar4TxDm1nsnC28dGU3W9o6htmleWicq4xWgg4y8co2YiU70QSNSWBiJBbRitxrGfVUKBNcJbupkLUSzhs8zVFF41cG4bRfmRjR3aLjIiqT65p84UEQ1g9gSRGm26U6b1WTx6kg5tF2SjZDAFOLtjR5uZFZi0FNnVeNwjats7d11Ykjc0/o1QJzuVRHDx/KltWVqQvhdYjYKWL1MgCZr309ZgaODEaJekUt8AajKtvWlZXqKnuyp0p7KsdiKFyb6JoolKYySafUlbvKKA5j3SV1agg6RH5KszCYc3b9bsM7EDCH+3ACDxGdgYEcPFgI+C4houwJIo93nlaJEoOohgxPTqHCR8A5ygoo8SzwTuNXo/YbXBVqPkO7Be7JN8V4iv8sc7YPrEl2ZFVAg/4kal7H4jo6F5xHSDkLeIDZzLHWTdvBctPuBWdjcRWoQ1VJfCMzoFC64ixfo4xYopOSdXfxV/C+QQYH7Ry/K9xLzMkwW9m/YJ54jih9BDN8Wn4y9Pe+fZbizBB37KVgPw49dChdsjeqdrYzeuCcHXbEcB/F2oJ6/4prEsxEh9+GueuZ6BkbtElmuWqPGlSHhinuFes57njHEuKD4jjuTG+bJy867SX7dtxXqjnyGVktOI+hExVXRFZDXr1F4C74LclyXcP0Wl11vFdok+N+ynz1M9/Hna7jvF+B4Ulsmacc192ctalS0s6xmobnTu3knmwqRkeofw+/NKGLxMsu730O/5XbS++KPRUo8zzHMd2pYVZ3VTBE387r8cYMUCV9LZHjDbeA/Pe1KpS0XLnlW/mh2ZNXpkpzX2xa+6p63PDNatiSsh26OfghzYpv8j/PaP/PWKfOXHofbohJLNP8UL4LZrrv7f9wt/8GD0U4iAB4nGNgZgCD/34M5QyYgAsAKTQB0nic28CgzbCJkZNJm3ETF4jcztWaG2qrysChvZ07NdhBTwbE4onwsNCQBLF4nc215YVBLD4dFRkRHhCLX05CmI8DxBLg4+FkZwGxBMEAxBLaMKEgwADIYtjOCDeaCW40M9xoFrjRrHCj2eQkoUazw43mgBvNCTd6kzAju/YGBgXX2kwJFwDEASgaAAAA') format('truetype');
}
.ms-Icon {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-family: 'FabricMDL2Icons';
font-style: normal;
font-weight: normal;
speak: none;
}
// Mixins
@mixin ms-Icon--ChevronRightSmall { content: "\E970"; }
@mixin ms-Icon--ChromeClose { content: "\E8BB"; }
@mixin ms-Icon--Copy { content: "\E8C8"; }
@mixin ms-Icon--GlobalNavButton { content: "\E700"; }
@mixin ms-Icon--MiniLink { content: "\E732"; }
@mixin ms-Icon--Page { content: "\E7C3"; }
@mixin ms-Icon--ProductRelease { content: "\EE2E"; }
@mixin ms-Icon--Save { content: "\E74E"; }
@mixin ms-Icon--Search { content: "\E721"; }
// Classes
.ms-Icon--ChevronRightSmall:before { @include ms-Icon--ChevronRightSmall }
.ms-Icon--ChromeClose:before { @include ms-Icon--ChromeClose }
.ms-Icon--Copy:before { @include ms-Icon--Copy }
.ms-Icon--GlobalNavButton:before { @include ms-Icon--GlobalNavButton }
.ms-Icon--MiniLink:before { @include ms-Icon--MiniLink }
.ms-Icon--Page:before { @include ms-Icon--Page }
.ms-Icon--ProductRelease:before { @include ms-Icon--ProductRelease }
.ms-Icon--Save:before { @include ms-Icon--Save }
.ms-Icon--Search:before { @include ms-Icon--Search }

View file

@ -1,342 +0,0 @@
@import "variables";
html {
font-kerning: normal;
text-rendering: optimizeLegibility;
scroll-behavior: smooth;
}
body {
margin:$baseline 0;
font-size:$font-size;
font-family:$font-family;
line-height: $line-height;
background:$background;
color:$color;
}
@keyframes fade-in {
0% {
opacity: 0;
}
50% {
opacity: 0.8;
}
100% {
opacity: 1;
}
}
a {
&:link {
color:$links;
text-decoration: none;
}
&:hover {
color:$hover-links;
}
&:visited {
color:$visited-links;
}
}
h2,
h3,
h4 {
.anchor {
visibility: hidden;
text-decoration: none;
cursor: pointer;
line-height: 1;
color:$color;
}
&:hover {
.anchor {
visibility: visible;
animation: fade-in 0.3s ease-in-out;
font-family: 'FabricMDL2Icons';
}
}
}
pre {
margin:$baseline 0;
border-radius: 4px;
padding:$baseline;
overflow: auto;
position: relative;
code {
background:transparent;
&::after {
content: attr(data-lang);
font-style: italic;
line-height: 1;
opacity:0.3;
position:absolute;
bottom:$baseline;
right:$baseline;
z-index:1;
}
}
}
code {
font: $code_font;
}
.copy-code-button {
font-family: 'FabricMDL2Icons';
display:none;
background:$background;
border-radius: 4px;
border:none;
cursor: pointer;
animation: fade-in 0.3s ease-in-out;
font-size: $baseline;
color:$color;
z-index: 10;
position:absolute;
top:$baseline;
right:$baseline;
}
pre:hover .copy-code-button {
display: block;
}
nav {
position: sticky;
height: 92vh;
top:$baseline;
left:$baseline;
bottom: $baseline;
padding-right: $baseline;
width: 20rem;
img {
width:128px;
}
h1 {
margin:0;
line-height: 1;
}
}
#toc {
margin-left:calc(#{$baseline} + #{$font-size});
padding:0;
margin:0 0 0 $baseline;
font-size: 80%;
li {
color:$color;
margin-left: $font-size;
&::before {
display: inline-block;
content:"";
}
ul {
padding:0;
}
}
}
main {
display: flex;
flex-flow: row nowrap;
animation: fade-in 0.4s ease-in-out;
}
#release {
text-align: left;
margin:$baseline 0;
&::before {
display: inline-block;
content: "\EE2E";
font-family: 'FabricMDL2Icons';
margin-right:calc(#{$baseline} / 8);
}
}
@keyframes slideIn {
0% {
max-height:0;
opacity:0
}
100% {
max-height:999px;
opacity:1
}
}
@keyframes slideOut {
0% {
height:auto;
opacity:1
}
100% {
height:0;
opacity:0
}
}
nav label {
display:block;
}
#trees {
overflow-y: auto;
height: 80%;
}
.subtree {
overflow:hidden;
margin:calc(#{$baseline} / 8) 0;
transition: overflow 0.2s ease-in-out;
padding: 0;
}
.tree-toggle-label {
user-select:none;
cursor:pointer;
}
.tree-toggle-label::before {
display:inline-block;
content:"\E970";
font-family:'FabricMDL2Icons';
font-size:.75rem;
transform:rotate(0deg);
transform-origin:50% 50% 0px;
transition:transform 0.1s linear 0s;
margin-right: 2px;
}
.tree-toggle {
position:absolute;
opacity:0;
z-index:-1;
}
.tree-toggle:checked+.tree-toggle-label::before {
content:"\E970";
font-family:'FabricMDL2Icons';
font-size:.75rem;
transform:rotate(90deg);
transform-origin:50% 50% 0px;
transition:transform 0.1s linear 0s;
margin-right: 2px;
}
.tree-toggle:checked+.tree-toggle-label {
font-weight:bold;
}
.tree-toggle+.tree-toggle-label+.subtree {
animation-name:slideOut;
animation-duration:0.25s;
animation-fill-mode:both;
}
.tree-toggle:checked+.tree-toggle-label+.subtree {
animation-name:slideIn;
animation-duration:0.25s;
animation-fill-mode:both;
}
.subtree li {
list-style-type: none;
margin-left: $baseline;
a {
color:$color;
}
&::before {
content: "\E7C3";
font-family:'FabricMDL2Icons';
font-size:0.75rem;
}
}
.active a {
font-weight: bold;
}
article {
width: calc(100% - (#{$baseline} * 4 + 20rem));
margin-left:calc(#{$baseline} * 2);
img {
max-width:100%;
}
}
#mobile {
display: none;
}
@media screen and (max-width: 1023px) {
main {
flex-flow: column nowrap;
width: 100%;
}
nav {
position: inherit;
height:auto;
margin:$baseline $baseline 0 $baseline;
}
article {
width: calc(100% - (#{$baseline} * 2));
margin:0 $baseline;
z-index:1;
}
#mobile {
font-family: 'FabricMDL2Icons';
cursor: pointer;
font-size: $baseline;
margin:0 $baseline 0 0;
display: block;
color:$color;
}
#trees {
display: none;
position:absolute;
background: $background;
height:auto;
width:100vw;
z-index:10;
box-shadow: 0 2px 0 rgba(0,0,0,.1);
}
#on_right {
margin-top:$baseline;
}
}
@import "fabric-icons-inline";
@import "search";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

View file

@ -1,120 +0,0 @@
#!/bin/bash
# ci.sh: Helper script to automate deployment operations on CI/CD
# Copyright © 2022 Aravinth Manivannan <realaravinth@batsense.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -xEeuo pipefail
#source $(pwd)/scripts/lib.sh
readonly SSH_ID_FILE=/tmp/ci-ssh-id
readonly SSH_REMOTE_NAME=origin-ssh
match_arg() {
if [ $1 == $2 ] || [ $1 == $3 ]
then
return 0
else
return 1
fi
}
help() {
cat << EOF
USAGE: ci.sh [SUBCOMMAND]
Helper script to automate deployment operations on CI/CD
Subcommands
-c --clean cleanup secrets, SSH key and other runtime data
-i --init <SSH_PRIVATE_KEY> initialize environment, write SSH private to file
-d --deploy <PAGES-SECRET> <TARGET BRANCH> push branch to Gitea and call Pages server
-h --help print this help menu
EOF
}
# $1: SSH private key
write_ssh(){
truncate --size 0 $SSH_ID_FILE
echo "$1" > $SSH_ID_FILE
chmod 600 $SSH_ID_FILE
}
set_ssh_remote() {
http_remote_url=$(git remote get-url origin)
remote_hostname=$(echo $http_remote_url | cut -d '/' -f 3)
repository_owner=$(echo $http_remote_url | cut -d '/' -f 4)
repository_name=$(echo $http_remote_url | cut -d '/' -f 5)
ssh_remote="git@$remote_hostname:$repository_owner/$repository_name"
ssh_remote="git@git.batsense.net:ForgeFlux/docs.git"
git remote add $SSH_REMOTE_NAME $ssh_remote
}
clean() {
if [ -f $SSH_ID_FILE ]
then
shred $SSH_ID_FILE
rm $SSH_ID_FILE
fi
}
# $1: Pages API secret
# $2: Deployment target branch
deploy() {
if (( "$#" < 2 ))
then
help
else
git -c core.sshCommand="/usr/bin/ssh -oStrictHostKeyChecking=no -i $SSH_ID_FILE"\
push --force $SSH_REMOTE_NAME $2
curl -vv --location --request \
POST "https://deploy.batsense.net/api/v1/update"\
--header 'Content-Type: application/json' \
--data-raw "{ \"secret\": \"$1\", \"branch\": \"$2\" }"
fi
}
if (( "$#" < 1 ))
then
help
exit -1
fi
if match_arg $1 '-i' '--init'
then
if (( "$#" < 2 ))
then
help
exit -1
fi
set_ssh_remote
write_ssh "$2"
elif match_arg $1 '-c' '--clean'
then
clean
elif match_arg $1 '-d' '--deploy'
then
if (( "$#" < 3 ))
then
help
exit -1
fi
deploy $2 $3
elif match_arg $1 '-h' '--help'
then
help
else
help
fi

View file

@ -1,32 +0,0 @@
#!/bin/bash
# Copyright © 2021 Aravinth Manivannan <realaravinth@batsense.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
check_arg(){
if [ -z $1 ]
then
help
exit 1
fi
}
match_arg() {
if [ $1 == $2 ] || [ $1 == $3 ]
then
return 0
else
return 1
fi
}

View file

@ -1,98 +0,0 @@
#!/bin/bash
# Used in CI workflow: install and check for spelling errors
# Copyright © 2021 Aravinth Manivannan <realaravinth@batsense.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
readonly MISSPELL_DOWNLOAD="https://github.com/client9/misspell/releases/download/v0.3.4/misspell_0.3.4_linux_64bit.tar.gz"
readonly TMP_DIR=$(pwd)/tmp
readonly PROJECT_ROOT=$(pwd)
readonly MISSPELL_TARBALL="$TMP_DIR/misspell.tar.bz2"
readonly MISSPELL="$TMP_DIR/misspell"
set -Eeuo pipefail
source $(pwd)/scripts/lib.sh
FLAGS=""
help() {
cat << EOF
spellcheck.sh: Check for spelling errors
USAGE:
spellcheck.sh <options>
OPTIONS:
c --check check for spelling erros
h --help print this help menu
w --write check and fix spelling errors
EOF
}
download() {
if [ ! -e $MISSPELL ];
then
echo "[*] Downloading misspell"
wget --quiet --output-doc=$MISSPELL_TARBALL $MISSPELL_DOWNLOAD;
cd $TMP_DIR
tar -xf $MISSPELL_TARBALL;
cd $PROJECT_ROOT
pip install codespell
else
echo "[*] Found misspell"
fi
}
spell_check_codespell() {
_check(){
codespell $FLAGS $PROJECT_ROOT/$1 #|| true
}
_check README.md
_check contents
}
spell_check_misspell() {
mkdir $TMP_DIR || true
download
_check(){
$MISSPELL $FLAGS $PROJECT_ROOT/$1
}
_check contents
_check README.md
}
check_arg $1
if match_arg $1 'w' '--write'
then
echo "[*] checking and correcting spellings"
FLAGS="-w"
spell_check_misspell
spell_check_codespell
elif match_arg $1 'c' '--check'
then
echo "[*] checking spellings"
spell_check_misspell
spell_check_codespell
elif match_arg $1 'h' '--help'
then
help
else
echo "undefined option"
help
exit 1
fi

View file

@ -1,158 +0,0 @@
#!/bin/bash
# Used in CI workflow: install Zola binary from GitHub
# Copyright © 2021 Aravinth Manivannan <realaravinth@batsense.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -euo pipefail
readonly PROJECT_ROOT=$(pwd)
readonly TARBALL=zola.tar.gz
readonly SOURCE="https://github.com/getzola/zola/releases/download/v0.15.3/zola-v0.15.3-x86_64-unknown-linux-gnu.tar.gz"
readonly BIN_PATH=tmp/bin
readonly BIN=$BIN_PATH/zola
readonly DIST=public
source $(pwd)/scripts/lib.sh
help() {
cat << EOF
zola.sh: Zola build script
USAGE:
zola.sh <options>
OPTIONS:
b build build website
c clean clean dependencies and build artifacts
d deploy deploy build to branch
h help print this help menu
i install install build dependencies
u url make urls relative
z zola invoke zola
EOF
}
download() {
if [ ! -e $BIN_PATH ];
then
mkdir -p $BIN_PATH
cd $BIN_PATH
echo "[*] Downloading Zola"
wget --quiet --output-document=$TARBALL $SOURCE
tar -xvzf $TARBALL > /dev/null
rm $TARBALL
echo "[*] Downloaded zola into $BIN"
cd $PROJECT_ROOT
fi
}
init() {
if [ ! -d $BIN_PATH ]
then
mkdir $BIN_PATH
fi
if [ ! -f $BIN ]
then
cd $BIN_PATH
download
fi
}
run() {
$BIN "${@:1}"
}
build() {
run build
}
no_absolute_url() {
sed -i 's/https:\/\/hostea.org//g' $(find public -type f | grep html)
}
clean() {
rm -rf $BIN_PATH || true
rm -rf $DIST || true
echo "[*] Workspace cleaned"
}
# $1: branch name
# $2: directory containing build assets
# $3: Author in <author-name author@example.com> format
deploy() {
cd $PROJECT_ROOT
original_branch=$(git branch --show-current)
tmp_dir=$(mktemp -d)
cp -r $2/* $tmp_dir
if [[ -z $(git ls-remote --heads origin ${1}) ]]
then
echo "[*] Creating deployment branch $1"
git checkout --orphan $1
else
echo "[*] Deployment branch $1 exists, pulling changes from remote"
git fetch origin $1
git switch $1
fi
git rm -rf .
/bin/rm -rf *
cp -r $tmp_dir/* .
git add --all
if [ $(git status --porcelain | xargs | sed '/^$/d' | wc -l) -gt 0 ];
then
echo "[*] Repository has changed, committing changes"
git commit \
--author="$3" \
--message="new deploy: $(date --iso-8601=seconds)"
fi
git checkout $original_branch
}
check_arg $1
download
if match_arg $1 'i' 'install'
then
init
elif match_arg $1 'c' 'clean'
then
clean
elif match_arg $1 'd' 'deploy'
then
check_arg $2
check_arg $3
check_arg $4
deploy $2 $3 $4
elif match_arg $1 'b' 'build'
then
build
elif match_arg $1 'h' 'help'
then
help
elif match_arg $1 'u' 'url'
then
no_absolute_url
elif match_arg $1 'z' 'zola'
then
$BIN "${@:3}"
else
echo "Error: $1 is not an option"
help
exit 1
fi
exit 0

1
search_index.en.js Normal file

File diff suppressed because one or more lines are too long

57
sitemap.xml Normal file
View file

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://docs.forgeflux.org/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/Interface/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/Interface/about/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/Northstar/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/Northstar/about/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/cli/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/ftest-toml/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/introduction/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/quick-links/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/terminology/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/tests/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/ftest/tutorial-new-specimen/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/updates/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/updates/december2020/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/updates/november2020/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/updates/october2020/</loc>
</url>
<url>
<loc>https://docs.forgeflux.org/updates/september2020/</loc>
</url>
</urlset>

View file

@ -1 +0,0 @@
&nbsp;<a class="anchor" href="#{{ id }}">&#xE732;</a>

View file

@ -1,137 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{{ get_url(path="main.css") | safe }}">
{% if config.extra.favicon %}
<link rel="icon" href="{{ config.extra.favicon | safe }}">
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>{% block title %}{{ config.title }}{% endblock title %}</title>
</head>
<body>
{% if config.extra.release %}
<script>
fetch('{{ config.extra.release | safe }}')
.then((response) => {
return response.json();
})
.then((data) => {
let release_name = data.name;
let html_url = data.html_url;
release.innerHTML = `<a href='${html_url}'>${release_name}</a>`;
});
</script>
{% endif %}
<main>
{% block nav %}
<nav>
{% if config.extra.logo %}
{% if current_path == "/" %}
<img src="{{ config.extra.logo | safe }}" alt="" />
{% else %}<a href="{{ config.base_url }}">
<img src="{{ config.extra.logo | safe }}" alt="" />
</a>
{% endif %}
{% else %}
<h1><a href="{{ config.base_url }}">{{ config.title }}</a></h1>
{% endif %}
{% if config.extra.release %}
<div id="release"></div>
{% endif %}
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
{% set section = get_section(path="_index.md") %}
{% for p in section.subsections %}
{% set subsection = get_section(path=p) %}
<input class="tree-toggle" type="checkbox" id="{{ subsection.title | slugify }}"
{% if current_path is starting_with(subsection.path) %}checked{% endif %} />
<label class="tree-toggle-label" for="{{ subsection.title | slugify }}">{{ subsection.title }}</label>
<ul class="subtree">
{% for page in subsection.pages %}
<li {% if current_path == page.path %}class="active"{% endif %}>
<a href="{{page.permalink | safe }}">{{page.title}}</a>
</li>
{% if page.toc %}
{% if current_path == page.path %}
{% set_global header_count = 0 %}
{% for h2 in page.toc %}
{% set_global header_count = header_count + 1 %}
{% for h3 in h2.children %}
{% set_global header_count = header_count + 1 %}
{% for h4 in h3.children %}
{% set_global header_count = header_count + 1 %}
{% endfor %}
{% endfor %}
{% endfor %}
{% if header_count > 4 %}
<ul id="toc">
{% for h2 in page.toc %}
<li><a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
{% if h2.children %}
<ul>
{% for h3 in h2.children %}
<li><a href="{{ h3.permalink | safe }}">{{ h3.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</ul>
{% endfor %}
</div>
</nav>
{% endblock nav %}
<article>
{% if config.build_search_index %}
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
{% endif %}
<div id="wrap">
{% block content %}
{{ section.content | safe }}
{% endblock content %}
</div>
</article>
</main>
{% if config.build_search_index %}
<script type="text/javascript" src="{{ get_url(path="elasticlunr.min.js") | safe }}" defer></script>
<script type="text/javascript" src="{{ get_url(path="search_index.en.js") | safe }}" defer></script>
<script type="text/javascript" src="{{ get_url(path="js.js") | safe }}" defer></script>
{% endif %}
</body>
</html>

View file

@ -1,5 +0,0 @@
{% extends "index.html" %}
{% block title %} {{ config.title }} | {{ page.title }} {% endblock title %}
{% block content %}
{{ page.content | safe }}
{% endblock content %}

View file

@ -1,10 +0,0 @@
name = "EasyDocs"
description = "An easy way to create docs for your project"
license = "MIT"
homepage = "https://github.com/codeandmedia/zola_easydocs_theme"
min_version = "0.13.0"
demo = "https://easydocs.codeandmedia.com"
[author]
name = "Roman Soldatenkov"
homepage = "https://codeandmedia.com"

View file

@ -0,0 +1,274 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | December 2020 </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
checked />
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li class="active">
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="december-2020">December 2020</h1>
<h2 id="northstar">Northstar</h2>
<p>As the development on <a href="https://docs.forgeflux.org/Northstar/">Northstar</a> nears the completion phase,
updates on it have slowed down, and the only updates that were made during this
stage mostly comprises of configuration updates.
These updates were mostly related to bootstrapping <a href="https://www.dynaconf.com/">DynaConf</a>,
as we embraced 12-factor app configuration recommendations, allowing for better
configuration management.</p>
<h2 id="interface">Interface</h2>
<p>Realising the need for validation of a request to an actor, an authentication
mechanism was developed to implement Matrix's <a href="https://github.com/matrix-org/python-signedjson">signed JSON</a>
feature, but, was later replaced in favor of <a href="https://tools.ietf.org/html/draft-cavage-http-signatures">HTTP Signatures</a>.</p>
<p>Interface underwent major refactoring to improve test-ability and reliability in addition
to implementing authentication by a <a href="https://github.com/matrix-org/python-signedjson">signed JSON</a>
mechanism implemented by the Matrix project. Taking note of rate-limits imposed by some forges,
we figured we'd have to cache responses and so data persistence was implemented by way of
storing in a database.</p>
<h2 id="references">References</h2>
<p>These are a list of the Pull Requests where the following updates took place for the
organization.</p>
<ul>
<li>Forking Implementation :: <a href="https://github.com/forgeflux-org/interface/commit/5c9f61d60ce069963da7abc761b9ba3d81c8883a">#34</a></li>
<li>Authentication :: <a href="https://github.com/forgeflux-org/interface/commit/5cc206cbe5be83cedac14949a537baad4c6351e3">#36</a></li>
<li>DB Refactor :: <a href="https://github.com/forgeflux-org/interface/commit/57c9a085b38f8c3bab7975e18d21e4455ad3cac9">#39</a>, <a href="https://github.com/forgeflux-org/interface/commit/d9d785ca116e9a2bb9a40cf3eaa16a8b275d1593">#40</a></li>
</ul>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

43
updates/index.html Normal file
View file

@ -0,0 +1,43 @@
<html>
<head>
<title>Zola</title>
</head>
<body>
<div class="container">
<h1>Welcome to Zola!</h1>
<p>
You're seeing this page because we couldn't find a template to render.
</p>
<p>
To modify this page, create a <b>section.html</b> file in the templates directory or
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>.
<br>
You can find what variables are available in this template in the <a href="https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;templates&#x2F;pages-sections&#x2F;#section-variables" target="_blank">documentation</a>.
</p>
</div>
<footer>
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a>
</footer>
<style>
html {
line-height: 1.5;
}
h1 {
margin-bottom: 2rem;
}
.container {
font-family: "sans-serif";
text-align: center;
margin-top: 20vh;
padding: 2rem;
background: #e9e9e9;
}
footer {
position: fixed;
width: 100%;
bottom: 1rem;
text-align: center;
}
</style>
</body>
</html>

View file

@ -0,0 +1,263 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | November 2020 </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
checked />
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="november-2020">November 2020</h1>
<p>Errors were modularized at the back of <a href="https://github.com/forgeflux-org/northstar/">Northstar</a>,
and A Docker CI was set up for the Northstar builds.</p>
<p>A <a href="https://github.com/forgeflux-org">GitHub organization</a> was created for ForgeFedv2,
and the repositories for the projects were transferred over to it.</p>
<p>A Notification-Event Translation Mechanism was set up.</p>
<ol>
<li>Northstar functionality was integrated into Interface, and tests were set up to ensure that it could be contacted through Interface's methods.</li>
<li>A locking mechanism was set up for concurrent operations on Git utilizing <a href="https://sled.rs/">Sled</a>.</li>
<li>Implementations of a basic job runner was set up to mimic retrieving requests from Forges, through periodically retrieving notifications.</li>
<li>The endpoints for notifications was subsequently set up, and responses to these Notifications were termed as events.</li>
<li>The endpoints for processing these events were then created.</li>
</ol>
<p>Shifted over the configuration management to <a href="https://www.dynaconf.com/">Dynaconf</a>.</p>
<h2 id="references">References</h2>
<ul>
<li>Integration with Northstar :: <a href="https://github.com/forgeflux-org/interface/commit/0c9d8bdff05e668d77a85fdfc89b37abe1ac86cb">Info</a></li>
<li>Locking Mechanism with Sled :: <a href="https://github.com/forgeflux-org/interface/commit/d3e7c81c95d87b612ebb9562cac31d371fe8629e">Info</a></li>
<li>Defining Events :: <a href="https://github.com/forgeflux-org/interface/commit/30547b783578a7a9548aca55b3b7c932ed8130e6">Info</a></li>
</ul>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

@ -0,0 +1,271 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | October 2020 </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
checked />
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="october-2020">October 2020</h1>
<p>In the month of October, there were significant changes to the development
in ForgeFedv2, with the addition of the <a href="https://forgeflux-org.github.io/northstar/">OpenAPI Specification</a>
for Northstar.</p>
<h2 id="northstar">Northstar</h2>
<p>A database model was created to store the details of the various forge interfaces,
having these details would be a prerequisite to looking up a server.</p>
<p>Endpoints were subsequently created, following the defined OpenAPI specification.
While the Lookup service was in the process of development, terminologies and the
concept for Forge Federation was also being <a href="https://github.com/forgeflux-org/spec/tree/master/rfc">discussed</a>.</p>
<p>Docker support as part of the CI process was added into the mix, while
keeping in mind, that the test suite was the method to work with the application for
the time being.
An initial working model for the lookup service was established.</p>
<h2 id="interface">Interface</h2>
<p>Development of the <code>libgit</code> library had begun at this point.</p>
<p>[libgit] is a library that processes the contributor's changes, and generates a patch.
Details regarding the implementation and feature set of libgit will be covered in another section.</p>
<h2 id="references">References</h2>
<ul>
<li>Database Initialization :: <a href="https://github.com/forgeflux-org/northstar/commit/6a82a1bc83d4733a5a077e33ad0c222aed496145">database init</a></li>
</ul>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>

View file

@ -0,0 +1,248 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://docs.forgeflux.org/main.css">
<link rel="icon" href="https://forgeflux.org/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title> Docs | September 2020 </title>
</head>
<body>
<main>
<nav>
<a href="https:&#x2F;&#x2F;docs.forgeflux.org">
<img src="/logo.svg" alt="" />
</a>
<a href="javascript:void(0);" onclick="burger()" id="mobile" class="ms-Icon--GlobalNavButton"></a>
<div id="trees">
<input class="tree-toggle" type="checkbox" id="ftest"
/>
<label class="tree-toggle-label" for="ftest">ftest</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/ftest/introduction/">Introducing ftest</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/cli/">Using ftest CLI</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/terminology/">Terminology</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/quick-links/">Quick Links</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/ftest-toml/">ftest.toml</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tests/">Tests</a>
</li>
<li >
<a href="https://docs.forgeflux.org/ftest/tutorial-new-specimen/">[Tutorial] Add new specimen</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="interface"
/>
<label class="tree-toggle-label" for="interface">Interface</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Interface/about/">About Interface</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="northstar"
/>
<label class="tree-toggle-label" for="northstar">Northstar</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/Northstar/about/">About Northstar</a>
</li>
</ul>
<input class="tree-toggle" type="checkbox" id="updates"
checked />
<label class="tree-toggle-label" for="updates">Updates</label>
<ul class="subtree">
<li >
<a href="https://docs.forgeflux.org/updates/december2020/">December 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/november2020/">November 2020</a>
</li>
<li >
<a href="https://docs.forgeflux.org/updates/october2020/">October 2020</a>
</li>
<li class="active">
<a href="https://docs.forgeflux.org/updates/september2020/">September 2020</a>
</li>
</ul>
</div>
</nav>
<article>
<div id="on_right">
<span id="search-ico" class="ms-Icon--Search"></span>
</div>
<div class="search-container">
<input id="search" type="search" placeholder="Search as you type...">
<div class="search-results">
<div class="search-results__header"></div>
<ul class="search-results__items"></ul>
</div>
</div>
<div id="wrap">
<h1 id="september-2020">September 2020</h1>
<p>In the month of September, project &quot;ForgeFedv2&quot; started off by
initializing the lookup service, <a href="https://github.com/forgeflux-org/northstar/">Northstar</a>.</p>
<p>The initialization mostly comprised of setting up the CI environment,
and focused more on defining the structure of the project, and how
we were to be going about it.</p>
<p>A discussion on the terminology and the primitive method of the
project's functionality were discussed.</p>
</div>
</article>
</main>
<script type="text/javascript" src="https://docs.forgeflux.org/elasticlunr.min.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/search_index.en.js" defer></script>
<script type="text/javascript" src="https://docs.forgeflux.org/js.js" defer></script>
</body>
</html>