forked from vieter-v/vieter
				
			Merge pull request 'Rework of Documentation' (#233) from Chewing_Bever/vieter:docs-rework into dev
Reviewed-on: vieter/vieter#233main
						commit
						440d1753da
					
				
							
								
								
									
										37
									
								
								README.md
								
								
								
								
							
							
						
						
									
										37
									
								
								README.md
								
								
								
								
							| 
						 | 
					@ -22,13 +22,6 @@ a while now. I wanted a fast language that I could code while relaxing, without
 | 
				
			||||||
having to exert too much mental effort & V seemed like the right choice for
 | 
					having to exert too much mental effort & V seemed like the right choice for
 | 
				
			||||||
that.
 | 
					that.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Compiler
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Vieter compiles with the standard Vlang compiler. However, I do maintain a
 | 
					 | 
				
			||||||
[mirror](https://git.rustybever.be/Chewing_Bever/v). This is to ensure my CI
 | 
					 | 
				
			||||||
does not break without reason, as I control when & how frequently the mirror is
 | 
					 | 
				
			||||||
updated to reflect the official repository.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Features
 | 
					## Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Arch repository server
 | 
					* Arch repository server
 | 
				
			||||||
| 
						 | 
					@ -41,20 +34,24 @@ updated to reflect the official repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Building
 | 
					## Building
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In order to build Vieter, you'll need a couple of libraries:
 | 
					Besides a V installer, Vieter also requires the following libraries to work:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* An installation of V
 | 
					 | 
				
			||||||
* gc
 | 
					* gc
 | 
				
			||||||
* libarchive
 | 
					* libarchive
 | 
				
			||||||
* openssl
 | 
					* openssl
 | 
				
			||||||
 | 
					* sqlite3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**NOTE**: if you encounter any issues compiling Vieter using the absolute
 | 
					### Compiler
 | 
				
			||||||
latest version of V, it might be because my mirror is missing a specific commit
 | 
					
 | 
				
			||||||
that causes issues. For this reason, the `make v` command exists which will
 | 
					Vieter compiles with the standard Vlang compiler. However, I do maintain a
 | 
				
			||||||
clone my compiler in the `v` directory & build it. Afterwards, you can use this
 | 
					[mirror](https://git.rustybever.be/vieter/v). This is to ensure my CI does not
 | 
				
			||||||
compiler with make by prepending all make commands with `V_PATH=v/v`. If you do
 | 
					break without reason, as I control when & how frequently the mirror is updated
 | 
				
			||||||
encounter this issue, please let me know so I can update my mirror & the
 | 
					to reflect the official repository.
 | 
				
			||||||
codebase to fix it!
 | 
					
 | 
				
			||||||
 | 
					If you encounter issues using the latest V compiler, try using my mirror
 | 
				
			||||||
 | 
					instead. `make v` will clone the repository & build the mirror. Afterwards,
 | 
				
			||||||
 | 
					prepending any make command with `V_PATH=v/v` tells make to use the locally
 | 
				
			||||||
 | 
					compiled mirror instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +67,7 @@ If you wish to contribute to the project, please take note of the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `docs` directory contains a Hugo site consisting of all user &
 | 
					The `docs` directory contains a Hugo site consisting of all user &
 | 
				
			||||||
administrator documentation. `docs/api` on the other hand is a
 | 
					administrator documentation. `docs/api` on the other hand is a
 | 
				
			||||||
[slate](https://github.com/slatedocs/slate) project describing the HTTP web
 | 
					[Slate](https://github.com/slatedocs/slate) project describing the HTTP web
 | 
				
			||||||
API.
 | 
					API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To modify the Hugo documentation, you'll need to install Hugo. Afterwards, you
 | 
					To modify the Hugo documentation, you'll need to install Hugo. Afterwards, you
 | 
				
			||||||
| 
						 | 
					@ -81,8 +78,8 @@ can use the following commands inside the `docs` directory:
 | 
				
			||||||
hugo
 | 
					hugo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Host an auto-refreshing web server with the documentation. Important to note
 | 
					# Host an auto-refreshing web server with the documentation. Important to note
 | 
				
			||||||
is that the files will be at `http://localhost:1313/docs/vieter` instead of
 | 
					# is that the files will be at `http://localhost:1313/docs/vieter` instead of
 | 
				
			||||||
just `http://localhost:1313/docs/vieter`
 | 
					# just `http://localhost:1313/`
 | 
				
			||||||
hugo server
 | 
					hugo server
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,6 +93,6 @@ docker run \
 | 
				
			||||||
    -v $(pwd)/docs/api/source:/srv/slate/source slatedocs/slate serve
 | 
					    -v $(pwd)/docs/api/source:/srv/slate/source slatedocs/slate serve
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This'll make the slate docs available at http://localhost:4567. Sadly, this
 | 
					This will make the Slate docs available at http://localhost:4567. Sadly, this
 | 
				
			||||||
server doesn't auto-refresh, so you'll have to manually refresh your browser
 | 
					server doesn't auto-refresh, so you'll have to manually refresh your browser
 | 
				
			||||||
every time you make a change.
 | 
					every time you make a change.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@ Parameter | Description
 | 
				
			||||||
url | URL of the Git repository.
 | 
					url | URL of the Git repository.
 | 
				
			||||||
branch | Branch of the Git repository.
 | 
					branch | Branch of the Git repository.
 | 
				
			||||||
repo | Vieter repository to publish built packages to.
 | 
					repo | Vieter repository to publish built packages to.
 | 
				
			||||||
schedule | Cron build schedule
 | 
					schedule | Cron build schedule (syntax explained [here](https://rustybever.be/docs/vieter/usage/builds/schedule/))
 | 
				
			||||||
arch | Comma-separated list of architectures to build package on.
 | 
					arch | Comma-separated list of architectures to build package on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Modify a repo
 | 
					## Modify a repo
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,12 @@
 | 
				
			||||||
# hugo server --minify --themesDir ... --baseURL=http://0.0.0.0:1313/theme/hugo-book/
 | 
					# hugo server --minify --themesDir ... --baseURL=http://0.0.0.0:1313/theme/hugo-book/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
baseURL = 'https://rustybever.be/docs/vieter/'
 | 
					baseURL = 'https://rustybever.be/docs/vieter/'
 | 
				
			||||||
title = 'The Rusty Bever - Docs'
 | 
					title = 'Vieter - Docs'
 | 
				
			||||||
theme = 'hugo-book'
 | 
					theme = 'hugo-book'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Book configuration
 | 
					# Book configuration
 | 
				
			||||||
disablePathToLower = true
 | 
					disablePathToLower = true
 | 
				
			||||||
 | 
					# Doesn't work with docs as subdir
 | 
				
			||||||
enableGitInfo = true
 | 
					enableGitInfo = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Needed for mermaid/katex shortcodes
 | 
					# Needed for mermaid/katex shortcodes
 | 
				
			||||||
| 
						 | 
					@ -28,16 +29,16 @@ enableGitInfo = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[menu]
 | 
					[menu]
 | 
				
			||||||
[[menu.after]]
 | 
					[[menu.after]]
 | 
				
			||||||
  name = "API Documentation"
 | 
					  name = "HTTP API Docs"
 | 
				
			||||||
  url = "https://rustybever.be/docs/vieter/api"
 | 
					  url = "https://rustybever.be/docs/vieter/api/"
 | 
				
			||||||
  weight = 10
 | 
					  weight = 10
 | 
				
			||||||
[[menu.after]]
 | 
					[[menu.after]]
 | 
				
			||||||
  name = "Man Pages"
 | 
					  name = "Man Pages"
 | 
				
			||||||
  url = "https://rustybever.be/man/vieter/vieter.1.html"
 | 
					  url = "https://rustybever.be/man/vieter/vieter.1.html"
 | 
				
			||||||
  weight = 20
 | 
					  weight = 20
 | 
				
			||||||
[[menu.after]]
 | 
					[[menu.after]]
 | 
				
			||||||
  name = "Source"
 | 
					  name = "Vieter"
 | 
				
			||||||
  url = "https://git.rustybever.be/Chewing_Bever/docs"
 | 
					  url = "https://git.rustybever.be/vieter/vieter"
 | 
				
			||||||
  weight = 30
 | 
					  weight = 30
 | 
				
			||||||
[[menu.after]]
 | 
					[[menu.after]]
 | 
				
			||||||
  name = "Hugo Theme"
 | 
					  name = "Hugo Theme"
 | 
				
			||||||
| 
						 | 
					@ -69,14 +70,14 @@ enableGitInfo = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Set source repository location.
 | 
					  # Set source repository location.
 | 
				
			||||||
  # Used for 'Last Modified' and 'Edit this page' links.
 | 
					  # Used for 'Last Modified' and 'Edit this page' links.
 | 
				
			||||||
  BookRepo = 'https://git.rustybever.be/Chewing_Bever/docs'
 | 
					  BookRepo = 'https://git.rustybever.be/vieter/vieter'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # (Optional, default 'commit') Specifies commit portion of the link to the page's last modified
 | 
					  # (Optional, default 'commit') Specifies commit portion of the link to the page's last modified
 | 
				
			||||||
  # commit hash for 'doc' page type.
 | 
					  # commit hash for 'doc' page type.
 | 
				
			||||||
  # Requires 'BookRepo' param.
 | 
					  # Requires 'BookRepo' param.
 | 
				
			||||||
  # Value used to construct a URL consisting of BookRepo/BookCommitPath/<commit-hash>
 | 
					  # Value used to construct a URL consisting of BookRepo/BookCommitPath/<commit-hash>
 | 
				
			||||||
  # Github uses 'commit', Bitbucket uses 'commits'
 | 
					  # Github uses 'commit', Bitbucket uses 'commits'
 | 
				
			||||||
  # BookCommitPath = 'commit'
 | 
					  BookCommitPath = 'src/commit'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Enable "Edit this page" links for 'doc' page type.
 | 
					  # Enable "Edit this page" links for 'doc' page type.
 | 
				
			||||||
  # Disabled by default. Uncomment to enable. Requires 'BookRepo' param.
 | 
					  # Disabled by default. Uncomment to enable. Requires 'BookRepo' param.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +0,0 @@
 | 
				
			||||||
# Vieter CLI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
I provide a simple CLI tool that currently only allows changing the Git
 | 
					 | 
				
			||||||
repository API. Its usage is quite simple.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
First, you need to create a file in your home directory called `.vieterrc` with
 | 
					 | 
				
			||||||
the following content:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```toml
 | 
					 | 
				
			||||||
address = "https://example.com"
 | 
					 | 
				
			||||||
api_key = "your-api-key"
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can also use a different file or use environment variables, as described in
 | 
					 | 
				
			||||||
[Configuration](/configuration).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Now you're ready to use the CLI tool.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Usage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* `vieter repos list` returns all repositories currently stored in the API.
 | 
					 | 
				
			||||||
* `vieter repos add url branch repo arch...` adds the repository with the given
 | 
					 | 
				
			||||||
  URL, branch, repo & arch to the API.
 | 
					 | 
				
			||||||
* `vieter repos remove id` removes the repository with the given ID prefix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can always check `vieter -help` or `vieter repos -help` for more
 | 
					 | 
				
			||||||
information about the commands.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -9,12 +9,9 @@ documentation might not be relevant anymore for the latest release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Overview
 | 
					## Overview
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vieter has a few main features:
 | 
					Vieter consists of two main parts, namely an implementation of an Arch
 | 
				
			||||||
 | 
					repository server & a scheduling system to periodically build Pacman packages &
 | 
				
			||||||
* It's a simple & lightweight implementation of an Arch repository server
 | 
					publish them to a repository.
 | 
				
			||||||
* It allows for uploading of built package archives
 | 
					 | 
				
			||||||
* It supports a basic build system to periodically re-build packages & upload
 | 
					 | 
				
			||||||
  them to the server
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< hint info >}}
 | 
					{{< hint info >}}
 | 
				
			||||||
**Note**  
 | 
					**Note**  
 | 
				
			||||||
| 
						 | 
					@ -26,12 +23,12 @@ well.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Why?
 | 
					### Why?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vieter is my personal solution for a problem I've been facing for months:
 | 
					Vieter is my personal solution to a problem I've been facing for months:
 | 
				
			||||||
extremely long AUR package build times. I run EndeavourOS on both my laptops,
 | 
					extremely long AUR package build times. I run EndeavourOS on both my laptops,
 | 
				
			||||||
one of which being a rather old MacBook Air. I really like being a beta-tester
 | 
					one of which being a rather old MacBook Air. I really like being a beta-tester
 | 
				
			||||||
for projects & run development builds for multiple packages (nheko,
 | 
					for projects & run development builds for multiple packages (nheko,
 | 
				
			||||||
newsflash...). The issue with this is that I have to regularly re-build these
 | 
					newsflash...). Because of this, I have to regularly re-build these packages in
 | 
				
			||||||
packages in order to stay up to date with development & these builds can take a
 | 
					order to stay up to date with development. However, these builds can take a
 | 
				
			||||||
really long time on the old MacBook. This project is a solution to that
 | 
					really long time on the old MacBook. This project is a solution to that
 | 
				
			||||||
problem: instead of building the packages locally, I can build them
 | 
					problem: instead of building the packages locally, I can build them
 | 
				
			||||||
automatically in the cloud & just download them whenever I update my system!
 | 
					automatically in the cloud & just download them whenever I update my system!
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,56 +0,0 @@
 | 
				
			||||||
# Builder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Vieter supports a basic build system that allows you to build the packages
 | 
					 | 
				
			||||||
defined using the Git repositories API by running `vieter build`. For
 | 
					 | 
				
			||||||
configuration, see [here](/configuration#builder).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## How it works
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The build system works in two stages. First it pulls down the
 | 
					 | 
				
			||||||
`archlinux:latest` image from Docker Hub, runs `pacman -Syu` & configures a
 | 
					 | 
				
			||||||
non-root build user. It then creates a new Docker image from this container.
 | 
					 | 
				
			||||||
This is to prevent each build having to fully update the container's
 | 
					 | 
				
			||||||
repositories. After the image has been created, each repository returned by
 | 
					 | 
				
			||||||
`/api/repos` is built sequentially by starting up a new container with the
 | 
					 | 
				
			||||||
previously created image as a base. Each container goes through the following steps:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1. The repository is cloned
 | 
					 | 
				
			||||||
2. `makepkg --nobuild --syncdeps --needed --noconfirm` is ran to update the `pkgver` variable inside
 | 
					 | 
				
			||||||
   the `PKGBUILD` file
 | 
					 | 
				
			||||||
3. A HEAD request is sent to the Vieter server to check whether the specific
 | 
					 | 
				
			||||||
   version of the package is already present. If it is, the container exits.
 | 
					 | 
				
			||||||
4. `makepkg` is ran with `MAKEFLAGS="-j\$(nproc)`
 | 
					 | 
				
			||||||
5. Each produced package archive is uploaded to the Vieter instance's
 | 
					 | 
				
			||||||
   repository, as defined in the API for that specific Git repo.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Cron image
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The Vieter Docker image contains crond & a cron config that runs `vieter build`
 | 
					 | 
				
			||||||
every night at 3AM. This value is currently hardcoded, but I wish to change
 | 
					 | 
				
			||||||
that down the line (work is in progress). There's also some other caveats you
 | 
					 | 
				
			||||||
should be aware of, namely that the image should be run as root & that the
 | 
					 | 
				
			||||||
healthcheck will always fail, so you might have to disable it. This boils down
 | 
					 | 
				
			||||||
to the following docker-compose file:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```yaml
 | 
					 | 
				
			||||||
version: '3'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					 | 
				
			||||||
  cron:
 | 
					 | 
				
			||||||
    image: 'chewingbever/vieter:dev'
 | 
					 | 
				
			||||||
    command: crond -f
 | 
					 | 
				
			||||||
    user: root
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    healthcheck:
 | 
					 | 
				
			||||||
      disable: true
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      - 'VIETER_API_KEY=some-key'
 | 
					 | 
				
			||||||
      - 'VIETER_ADDRESS=https://example.com'
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - '/var/run/docker.sock:/var/run/docker.sock'
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Important to note is that the container also requires the host's Docker socket
 | 
					 | 
				
			||||||
to be mounted as this is how it spawns the necessary containers, as well as a
 | 
					 | 
				
			||||||
change to the container's command.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@ weight: 20
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
# Configuration
 | 
					# Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All vieter operations by default try to read in the TOML file `~/.vieterrc` for
 | 
					By default, all vieter commands try to read in the TOML file `~/.vieterrc` for
 | 
				
			||||||
configuration. The location of this file can be changed by using the `-f` flag.
 | 
					configuration. The location of this file can be changed by using the `-f` flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If the above file doesn't exist or you wish to override some of its settings,
 | 
					If the above file doesn't exist or you wish to override some of its settings,
 | 
				
			||||||
| 
						 | 
					@ -19,53 +19,80 @@ the value in the environment variable is used.
 | 
				
			||||||
{{< hint info >}}
 | 
					{{< hint info >}}
 | 
				
			||||||
**Note**  
 | 
					**Note**  
 | 
				
			||||||
All environment variables can also be provided from a file by appending them
 | 
					All environment variables can also be provided from a file by appending them
 | 
				
			||||||
with `_FILE`. This for example allows you to provide the API key from a docker
 | 
					with `_FILE`. This for example allows you to provide the API key from a Docker
 | 
				
			||||||
secrets file.
 | 
					secrets file.
 | 
				
			||||||
{{< /hint >}}
 | 
					{{< /hint >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Modes
 | 
					## Commands
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The vieter binary can run in several "modes", indicated by the first argument
 | 
					The first argument passed to Vieter determines which command you wish to use.
 | 
				
			||||||
passed to them. Each mode requires a different configuration.
 | 
					Each of these can contain subcommands (e.g. `vieter repos list`), but all
 | 
				
			||||||
 | 
					subcommands will use the same configuration. Below you can find the
 | 
				
			||||||
 | 
					configuration variable required for each command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Server
 | 
					### `vieter server`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `log_level`: defines how much logs to show. Valid values are one of `FATAL`,
 | 
					* `log_level`: log verbosity level. Value should be one of `FATAL`, `ERROR`,
 | 
				
			||||||
  `ERROR`, `WARN`, `INFO` or `DEBUG`. Defaults to `WARN`
 | 
					  `WARN`, `INFO` or `DEBUG`.
 | 
				
			||||||
* `log_file`: log file to write logs to. Defaults to `vieter.log` in the
 | 
					    * Default: `WARN`
 | 
				
			||||||
  current directory.
 | 
					* `log_file`: log file to write logs to.
 | 
				
			||||||
 | 
					    * Default: `vieter.log` (in the current directory)
 | 
				
			||||||
* `pkg_dir`:  where Vieter should store the actual package archives.
 | 
					* `pkg_dir`:  where Vieter should store the actual package archives.
 | 
				
			||||||
* `data_dir`: where Vieter stores the repositories, log file & database.
 | 
					* `data_dir`: where Vieter stores the repositories, log file & database.
 | 
				
			||||||
* `api_key`: the API key to use when authenticating requests.
 | 
					* `api_key`: the API key to use when authenticating requests.
 | 
				
			||||||
* `default_arch`: architecture to always add packages of arch `any` to.
 | 
					* `default_arch`: this setting serves two main purposes:
 | 
				
			||||||
 | 
					    * Packages with architecture `any` are always added to this architecture.
 | 
				
			||||||
 | 
					      This prevents the server from being confused when an `any` package is
 | 
				
			||||||
 | 
					      published as the very first package for a repository.
 | 
				
			||||||
 | 
					    * Git repositories added without an `arch` value use this value instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Builder
 | 
					
 | 
				
			||||||
 | 
					### `vieter cron`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `log_level`: log verbosity level. Value should be one of `FATAL`, `ERROR`,
 | 
				
			||||||
 | 
					  `WARN`, `INFO` or `DEBUG`.
 | 
				
			||||||
 | 
					    * Default: `WARN`
 | 
				
			||||||
 | 
					* `log_file`: log file to write logs to.
 | 
				
			||||||
 | 
					    * Default: `vieter.log` (in `data_dir`)
 | 
				
			||||||
 | 
					* `address`: *public* URL of the Vieter repository server to build for. From
 | 
				
			||||||
 | 
					  this server the list of Git repositories is retrieved. All built packages are
 | 
				
			||||||
 | 
					  published to this server.
 | 
				
			||||||
 | 
					* `api_key`: API key of the above server.
 | 
				
			||||||
 | 
					* `data_dir`: directory to store log file in.
 | 
				
			||||||
 | 
					* `base_image`: Docker image to use when building a package. Any Pacman-based
 | 
				
			||||||
 | 
					  distro image should work, as long as `/etc/pacman.conf` is used &
 | 
				
			||||||
 | 
					  `base-devel` exists in the repositories. Make sure that the image supports
 | 
				
			||||||
 | 
					  the architecture of your cron daemon.
 | 
				
			||||||
 | 
					    * Default: `archlinux:base-devel` (only works on `x86_64`). If you require
 | 
				
			||||||
 | 
					      `aarch64` support, consider using
 | 
				
			||||||
 | 
					      [`menci/archlinuxarm:base-devel`](https://hub.docker.com/r/menci/archlinuxarm)
 | 
				
			||||||
 | 
					      ([GitHub](https://github.com/Menci/docker-archlinuxarm)). This is the image
 | 
				
			||||||
 | 
					      used for the Vieter CI builds.
 | 
				
			||||||
 | 
					* `max_concurrent_builds`: how many builds to run at the same time.
 | 
				
			||||||
 | 
					    * Default: `1`
 | 
				
			||||||
 | 
					* `api_update_frequency`: how frequently (in minutes) to poll the Vieter
 | 
				
			||||||
 | 
					  repository server for a new list of Git repositories to build.
 | 
				
			||||||
 | 
					    * Default: `15`
 | 
				
			||||||
 | 
					* `image_rebuild_frequency`: Vieter periodically builds a builder image using
 | 
				
			||||||
 | 
					  the configured base image. This makes sure build containers do not have to
 | 
				
			||||||
 | 
					  download a lot of packages when updating their system. This setting defines
 | 
				
			||||||
 | 
					  how frequently (in minutes) to rebuild this builder image.
 | 
				
			||||||
 | 
					    * Default: `1440` (every 24 hours)
 | 
				
			||||||
 | 
					* `global_schedule`: build schedule for any Git repository that does not have a
 | 
				
			||||||
 | 
					  schedule defined. For information about this syntax, see
 | 
				
			||||||
 | 
					  [here](/usage/builds/schedule).
 | 
				
			||||||
 | 
					    * Default: `0 3` (3AM every night)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `vieter logs`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `api_key`: the API key to use when authenticating requests.
 | 
					* `api_key`: the API key to use when authenticating requests.
 | 
				
			||||||
* `address`: Base your URL of your Vieter instance, e.g. https://example.com
 | 
					* `address`: Base URL of your Vieter instance, e.g. https://example.com
 | 
				
			||||||
* `base_image`: image to use when building a package. It should be an Archlinux
 | 
					 | 
				
			||||||
  image. The default if not configured is `archlinux:base-devel`, but this
 | 
					 | 
				
			||||||
  image only supports arm64. If you require aarch64 support as well, consider
 | 
					 | 
				
			||||||
  using
 | 
					 | 
				
			||||||
  [`menci/archlinuxarm:base-devel`](https://hub.docker.com/r/menci/archlinuxarm)
 | 
					 | 
				
			||||||
  ([GH](https://github.com/Menci/docker-archlinuxarm))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Repos
 | 
					### `vieter repos`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `api_key`: the API key to use when authenticating requests.
 | 
					* `api_key`: the API key to use when authenticating requests.
 | 
				
			||||||
* `address`: Base your URL of your Vieter instance, e.g. https://example.com
 | 
					* `address`: Base URL of your Vieter instance, e.g. https://example.com
 | 
				
			||||||
 | 
					* `base_image`: image to use when building a package using `vieter repos
 | 
				
			||||||
 | 
					  build`.
 | 
				
			||||||
 | 
					    * Default: `archlinux:base-devel`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Cron
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* `log_level`: defines how much logs to show. Valid values are one of `FATAL`,
 | 
					 | 
				
			||||||
  `ERROR`, `WARN`, `INFO` or `DEBUG`. Defaults to `WARN`
 | 
					 | 
				
			||||||
* `api_key`: the API key to use when authenticating requests.
 | 
					 | 
				
			||||||
* `address`: Base your URL of your Vieter instance, e.g. https://example.com.
 | 
					 | 
				
			||||||
  This *must* be the publicly facing URL of your Vieter instance.
 | 
					 | 
				
			||||||
* `data_dir`: where Vieter stores the log file.
 | 
					 | 
				
			||||||
* `base_image`: Docker image from which to create the builder images.
 | 
					 | 
				
			||||||
* `max_concurrent_builds`: amount of builds to run at once.
 | 
					 | 
				
			||||||
* `api_update_frequency`: how frequenty to check for changes in the repo list.
 | 
					 | 
				
			||||||
* `image_rebuild+frequency`: how frequently to rebuild the builder image
 | 
					 | 
				
			||||||
* `global_schedule`: cron schedule to use for any repo without an individual
 | 
					 | 
				
			||||||
  schedule
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,76 +3,100 @@ weight: 10
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
# Installation
 | 
					# Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vieter consists of a single binary, akin to busybox. The binary's behavior is
 | 
				
			||||||
 | 
					determined by its CLI arguments, e.g. `vieter server` starts the repository
 | 
				
			||||||
 | 
					server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All installation solutions can be configured the same way,
 | 
				
			||||||
 | 
					as described [here](/configuration).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Docker
 | 
					## Docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Docker is the recommended way to install vieter. The images can be pulled from
 | 
					Docker images are published to the
 | 
				
			||||||
[`chewingbever/vieter`](https://hub.docker.com/r/chewingbever/vieter). You can
 | 
					[`chewingbever/vieter`](https://hub.docker.com/r/chewingbever/vieter) Docker
 | 
				
			||||||
either pull a release tag (e.g. `chewingbever/vieter:0.1.0-rc1`), or pull the
 | 
					Hub repository. You can either pull a release tag (e.g.
 | 
				
			||||||
`chewingbever/vieter:dev` tag. The latter is updated every time a new commit is
 | 
					`chewingbever/vieter:0.1.0-rc1`), or pull the `chewingbever/vieter:dev` tag.
 | 
				
			||||||
pushed to the development branch. This branch will be the most up to date, but
 | 
					The latter is updated every time a new commit is pushed to the development
 | 
				
			||||||
does not give any guarantees about stability, so beware!
 | 
					branch. This branch will be the most up to date, but does not give any
 | 
				
			||||||
 | 
					guarantees about stability, so beware!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The simplest way to run the Docker image is using a plain Docker command:
 | 
					Thanks to the single-binary design of Vieter, this image can be used both for
 | 
				
			||||||
 | 
					the repository server & the cron daemon.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```sh
 | 
					Below is an example compose file to set up both the repository server & the
 | 
				
			||||||
docker run \
 | 
					cron daemon:
 | 
				
			||||||
    --rm \
 | 
					
 | 
				
			||||||
    -d \
 | 
					```yaml
 | 
				
			||||||
    -v /path/to/data:/data \
 | 
					version: '3'
 | 
				
			||||||
    -e VIETER_API_KEY=changeme \
 | 
					
 | 
				
			||||||
    -e VIETER_DEFAULT_ARCH=x86_64 \
 | 
					services:
 | 
				
			||||||
    -p 8000:8000 \
 | 
					  server:
 | 
				
			||||||
    chewingbever/vieter:dev
 | 
					    image: 'chewingbever/vieter:dev'
 | 
				
			||||||
 | 
					    restart: 'always'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - 'VIETER_API_KEY=secret'
 | 
				
			||||||
 | 
					      - 'VIETER_DEFAULT_ARCH=x86_64'
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - 'data:/data'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cron:
 | 
				
			||||||
 | 
					    image: 'chewingbever/vieter:dev'
 | 
				
			||||||
 | 
					    restart: 'always'
 | 
				
			||||||
 | 
					    user: root
 | 
				
			||||||
 | 
					    command: 'vieter cron'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - 'VIETER_API_KEY=secret'
 | 
				
			||||||
 | 
					      # MUST be public URL of Vieter repository
 | 
				
			||||||
 | 
					      - 'VIETER_ADDRESS=https://example.com'
 | 
				
			||||||
 | 
					      - 'VIETER_DEFAULT_ARCH=x86_64'
 | 
				
			||||||
 | 
					      - 'VIETER_MAX_CONCURRENT_BUILDS=2'
 | 
				
			||||||
 | 
					      - 'VIETER_GLOBAL_SCHEDULE=0 3'
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - '/var/run/docker.sock:/var/run/docker.sock'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volumes:
 | 
				
			||||||
 | 
					  data:
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Here, you should change `/path/to/data` to the path on your host where you want
 | 
					If you do not require the build system, the repository server can be used
 | 
				
			||||||
vieter to store its files.
 | 
					independently as well.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The default configuration will store everything inside the `/data` directory.
 | 
					{{< hint info >}}
 | 
				
			||||||
 | 
					**Note**  
 | 
				
			||||||
Inside the container, the Vieter server runs on port 8000. This port should be
 | 
					Builds are executed on the cron daemon's system using the host's Docker daemon.
 | 
				
			||||||
exposed to the public accordingely.
 | 
					A cron daemon on a specific architecture will only build packages for that
 | 
				
			||||||
 | 
					specific architecture. Therefore, if you wish to build packages for both
 | 
				
			||||||
For an overview of how to configure vieter & which environment variables can be
 | 
					`x86_64` & `aarch64`, you'll have to deploy two cron daemons, one on each
 | 
				
			||||||
used, see the [Configuration](/configuration) page.
 | 
					architecture. Afterwards, any Git repositories enabled for those two
 | 
				
			||||||
 | 
					architectures will build on both.
 | 
				
			||||||
 | 
					{{< /hint >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Binary
 | 
					## Binary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
On the [releases](https://git.rustybever.be/Chewing_Bever/vieter/releases)
 | 
					On the
 | 
				
			||||||
page, you can find statically compiled binaries for all released versions. You
 | 
					[releases](https://git.rustybever.be/vieter/vieter/releases)
 | 
				
			||||||
can download the binary for your host's architecture & run it that way.
 | 
					page, you can find statically compiled binaries for all
 | 
				
			||||||
 | 
					released versions. This is the same binary as used inside
 | 
				
			||||||
 | 
					the Docker images.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For more information about configuring the binary, check out the
 | 
					## Arch
 | 
				
			||||||
[Configuration](/configuration) page.
 | 
					
 | 
				
			||||||
 | 
					I publish both development & release versions of Vieter to my personal
 | 
				
			||||||
 | 
					repository, https://arch.r8r.be. Packages are available for `x86_64` &
 | 
				
			||||||
 | 
					`aarch64`. To use the repository, add the following to your `pacman.conf`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					[vieter]
 | 
				
			||||||
 | 
					Server = https://arch.r8r.be/$repo/$arch
 | 
				
			||||||
 | 
					SigLevel = Optional
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Afterwards, you can update your system & install the `vieter` package for the
 | 
				
			||||||
 | 
					latest official release or `vieter-git` for the latest development release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Building from source
 | 
					## Building from source
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Because the project is still in heavy development, it might be useful to build
 | 
					The project [README](https://git.rustybever.be/vieter/vieter#building) contains
 | 
				
			||||||
from source instead. Luckily, this process is very easy. You'll need make,
 | 
					instructions for building Vieter from source.
 | 
				
			||||||
libarchive & openssl; all of which should be present on an every-day Arch
 | 
					 | 
				
			||||||
install. Then, after cloning the repository, you can use the following commands:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```sh
 | 
					 | 
				
			||||||
# Builds the compiler; should usually only be ran once. Vieter compiles using
 | 
					 | 
				
			||||||
# the default compiler, but I maintain my own mirror to ensure nothing breaks
 | 
					 | 
				
			||||||
# without me knowing.
 | 
					 | 
				
			||||||
make v
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Build vieter
 | 
					 | 
				
			||||||
# Alternatively, use `make prod` to build the production build.
 | 
					 | 
				
			||||||
make
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
{{< hint info >}}
 | 
					 | 
				
			||||||
**Note**  
 | 
					 | 
				
			||||||
My version of the V compiler is also available on my Vieter instance,
 | 
					 | 
				
			||||||
https://arch.r8r.be. It's in the `vieter` repository, with the package being
 | 
					 | 
				
			||||||
named `vieter-v`. The compiler is available for both x86_64 & aarch64.
 | 
					 | 
				
			||||||
{{< /hint >}}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## My Vieter instance
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Besides uploading development Docker images, my CI also publishes x86_64 &
 | 
					 | 
				
			||||||
aarch64 packages to my personal Vieter instance, https://arch.r8r.be. If you'd
 | 
					 | 
				
			||||||
like, you can use this repository as well by adding it to your Pacman
 | 
					 | 
				
			||||||
configuration as described [here](/usage#configuring-pacman). Both the
 | 
					 | 
				
			||||||
repository & the package are called `vieter`.
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					weight: 100
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,81 @@
 | 
				
			||||||
 | 
					# Builds In-depth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For those interested, this page describes how the build system works
 | 
				
			||||||
 | 
					internally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Builder image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Every cron daemon perodically creates a builder image that is then used as a
 | 
				
			||||||
 | 
					base for all builds. This is done to prevent build containers having to pull
 | 
				
			||||||
 | 
					down a bunch of updates when they update their system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The build container is created by running the following commands inside a
 | 
				
			||||||
 | 
					container started from the image defined in `base_image`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					# Update repos & install required packages
 | 
				
			||||||
 | 
					pacman -Syu --needed --noconfirm base-devel git
 | 
				
			||||||
 | 
					# Add a non-root user to run makepkg
 | 
				
			||||||
 | 
					groupadd -g 1000 builder
 | 
				
			||||||
 | 
					useradd -mg builder builder
 | 
				
			||||||
 | 
					# Make sure they can use sudo without a password
 | 
				
			||||||
 | 
					echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
 | 
				
			||||||
 | 
					# Create the directory for the builds & make it writeable for the
 | 
				
			||||||
 | 
					# build user
 | 
				
			||||||
 | 
					mkdir /build
 | 
				
			||||||
 | 
					chown -R builder:builder /build
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This script updates the packages to their latest versions & creates a non-root
 | 
				
			||||||
 | 
					user to use when running `makepkg`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This script is base64-encoded & passed to the container as an environment
 | 
				
			||||||
 | 
					variable. The container's entrypoint is set to `/bin/sh -c` & its command
 | 
				
			||||||
 | 
					argument to `echo $BUILD_SCRIPT | base64 -d | /bin/sh -e`, with the
 | 
				
			||||||
 | 
					`BUILD_SCRIPT` environment variable containing the base64-encoded script.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once the container exits, a new Docker image is created from it. This image is
 | 
				
			||||||
 | 
					then used as the base for any builds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Running builds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each build has its own Docker container, using the builder image as its base.
 | 
				
			||||||
 | 
					The same base64-based technique as above is used, just with a different script.
 | 
				
			||||||
 | 
					To make the build logs more clear, each command is appended by an echo command
 | 
				
			||||||
 | 
					printing the next command to stdout.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Given the Git repository URL is `https://examplerepo.com` with branch `main`,
 | 
				
			||||||
 | 
					the URL of the Vieter server is `https://example.com` and `vieter` is the
 | 
				
			||||||
 | 
					repository we wish to publish to, we get the following script:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					echo -e '+ echo -e '\''[vieter]\\nServer = https://example.com/$repo/$arch\\nSigLevel = Optional'\'' >> /etc/pacman.conf'
 | 
				
			||||||
 | 
					echo -e '[vieter]\nServer = https://example.com/$repo/$arch\nSigLevel = Optional' >> /etc/pacman.conf
 | 
				
			||||||
 | 
					echo -e '+ pacman -Syu --needed --noconfirm'
 | 
				
			||||||
 | 
					pacman -Syu --needed --noconfirm
 | 
				
			||||||
 | 
					echo -e '+ su builder'
 | 
				
			||||||
 | 
					su builder
 | 
				
			||||||
 | 
					echo -e '+ git clone --single-branch --depth 1 --branch main https://examplerepo.com repo'
 | 
				
			||||||
 | 
					git clone --single-branch --depth 1 --branch main https://examplerepo.com repo
 | 
				
			||||||
 | 
					echo -e '+ cd repo'
 | 
				
			||||||
 | 
					cd repo
 | 
				
			||||||
 | 
					echo -e '+ makepkg --nobuild --syncdeps --needed --noconfirm'
 | 
				
			||||||
 | 
					makepkg --nobuild --syncdeps --needed --noconfirm
 | 
				
			||||||
 | 
					echo -e '+ source PKGBUILD'
 | 
				
			||||||
 | 
					source PKGBUILD
 | 
				
			||||||
 | 
					echo -e '+ curl -s --head --fail https://example.com/vieter/x86_64/$pkgname-$pkgver-$pkgrel && exit 0'
 | 
				
			||||||
 | 
					curl -s --head --fail https://example.com/vieter/x86_64/$pkgname-$pkgver-$pkgrel && exit 0
 | 
				
			||||||
 | 
					echo -e '+ [ "$(id -u)" == 0 ] && exit 0'
 | 
				
			||||||
 | 
					[ "$(id -u)" == 0 ] && exit 0
 | 
				
			||||||
 | 
					echo -e '+ MAKEFLAGS="-j$(nproc)" makepkg -s --noconfirm --needed && for pkg in $(ls -1 *.pkg*); do curl -XPOST -T "$pkg" -H "X-API-KEY: $API_KEY" https://example.com/vieter/publish; done'
 | 
				
			||||||
 | 
					MAKEFLAGS="-j$(nproc)" makepkg -s --noconfirm --needed && for pkg in $(ls -1 *.pkg*); do curl -XPOST -T "$pkg" -H "X-API-KEY: $API_KEY" https://example.com/vieter/publish; done
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This script:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Adds the target repository as a repository in the build container
 | 
				
			||||||
 | 
					2. Updates mirrors & packages
 | 
				
			||||||
 | 
					3. Clones the Git repository
 | 
				
			||||||
 | 
					4. Runs `makepkg` without building to calculate `pkgver`
 | 
				
			||||||
 | 
					5. Checks whether the package version is already present on the server
 | 
				
			||||||
 | 
					6. If not, run `makepkg` & publish any generated package archives to the server
 | 
				
			||||||
| 
						 | 
					@ -1,54 +0,0 @@
 | 
				
			||||||
---
 | 
					 | 
				
			||||||
weight: 30
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
# Usage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Starting the server
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
To start a server, either install it using Docker (see
 | 
					 | 
				
			||||||
[Installation](/installation)) or run it locally by executing `vieter
 | 
					 | 
				
			||||||
server`. See [Configuration](/configuration) for more information about
 | 
					 | 
				
			||||||
configuring the binary.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Multiple repositories
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Vieter works with multiple repositories. This means that a single Vieter server
 | 
					 | 
				
			||||||
can serve multiple repositories in Pacman. It also automatically divides files
 | 
					 | 
				
			||||||
with specific architectures among arch-repos. Arch-repos are the actual
 | 
					 | 
				
			||||||
repositories you add to your `/etc/pacman.conf` file. See [Configuring
 | 
					 | 
				
			||||||
Pacman](/usage#configuring-pacman) below for more info.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Adding packages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Using Vieter is currently very simple. If you wish to add a package to Vieter,
 | 
					 | 
				
			||||||
build it using makepkg & POST that file to the `/<repo>/publish` endpoint of
 | 
					 | 
				
			||||||
your server. This will add the package to the repository. Authentification
 | 
					 | 
				
			||||||
requires you to add the API key as the `X-Api-Key` header.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
All of this can be combined into a simple cURL call:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
curl -XPOST -H "X-API-KEY: your-key" -T some-package.pkg.tar.zst https://example.com/somerepo/publish
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`somerepo` is automatically created if it doesn't exist yet.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Configuring Pacman
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Configuring Pacman to use a Vieter instance is very simple. In your
 | 
					 | 
				
			||||||
`/etc/pacman.conf` file, add the following lines:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
[vieter]
 | 
					 | 
				
			||||||
Server = https://example.com/$repo/$arch
 | 
					 | 
				
			||||||
SigLevel = Optional
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Here, you see two important placeholder variables. `$repo` is replaced by the
 | 
					 | 
				
			||||||
name within the square brackets, which in this case would be `vieter`. `$arch`
 | 
					 | 
				
			||||||
is replaced by the output of `uname -m`. Because Vieter supports multiple
 | 
					 | 
				
			||||||
repositories & architectures per repository, using this notation makes sure you
 | 
					 | 
				
			||||||
always use the correct endpoint for fetching files.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
I recommend placing this below all other repository entries, as the order
 | 
					 | 
				
			||||||
decides which repository should be used if there's ever a naming conflict.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					weight: 30
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					weight: 20
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					# Building packages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The automatic build system is what makes Vieter very useful as a replacement
 | 
				
			||||||
 | 
					for an AUR helper. It can perodically build packages & publish them to your
 | 
				
			||||||
 | 
					personal Vieter repository server, removing the need to build the packages
 | 
				
			||||||
 | 
					locally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Adding builds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Before the cron system can start building your package, you need to add its
 | 
				
			||||||
 | 
					info to the system. The Vieter repository server exposes an HTTP API for this
 | 
				
			||||||
 | 
					(see the [HTTP API Docs](https://rustybever.be/docs/vieter/api/) for more
 | 
				
			||||||
 | 
					info). For ease of use, the Vieter binary contains a CLI interface for
 | 
				
			||||||
 | 
					interacting with this API (see [Configuration](/configuration) for
 | 
				
			||||||
 | 
					configuration details). The [man
 | 
				
			||||||
 | 
					pages](https://rustybever.be/man/vieter/vieter-repos.1.html) describe this in
 | 
				
			||||||
 | 
					greater detail, but the basic usage is as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					vieter repos add some-url some-branch some-repository
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here, `some-url` is the URL of the Git repository containing the PKGBUILD. This
 | 
				
			||||||
 | 
					URL is passed to `git clone`, meaning the repository should be public. Vieter
 | 
				
			||||||
 | 
					expects the same format as an AUR Git repository, so you can directly use AUR
 | 
				
			||||||
 | 
					URLs here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`some-branch` is the branch of the Git repository the build should check out.
 | 
				
			||||||
 | 
					If you're using an AUR package, this should be `master`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Finally, `some-repo` is the repository to which the built package archives
 | 
				
			||||||
 | 
					should be published.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above command intentionally leaves out a few parameters to make the CLI
 | 
				
			||||||
 | 
					more useable. For information on how to modify all parameters using the CLI,
 | 
				
			||||||
 | 
					see
 | 
				
			||||||
 | 
					[vieter-repos-edit(1)](https://rustybever.be/man/vieter/vieter-repos-edit.1.html).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Reading logs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The logs of each build are uploaded to the Vieter repository server, along with
 | 
				
			||||||
 | 
					information about the exit code of the build container, when the build
 | 
				
			||||||
 | 
					started/ended etc. These logs can then be accessed using the [HTTP
 | 
				
			||||||
 | 
					API](https://rustybever.be/docs/vieter/api/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For ease of use, the logs are also available using some CLI commands; see
 | 
				
			||||||
 | 
					[vieter-logs(1)](https://rustybever.be/man/vieter/vieter-logs.1.html) for more
 | 
				
			||||||
 | 
					information.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					# Cron schedule syntax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Vieter cron daemon uses a subset of the cron expression syntax to schedule
 | 
				
			||||||
 | 
					builds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Format
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`a b c d`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `a`: minutes
 | 
				
			||||||
 | 
					* `b`: hours
 | 
				
			||||||
 | 
					* `c`: days
 | 
				
			||||||
 | 
					* `d`: months
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					An expression consists of two to four sections. If less than four sections are
 | 
				
			||||||
 | 
					provided, the parser will append `*` until there are four sections. This means
 | 
				
			||||||
 | 
					that `0 3` is the same as `0 3 * *`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each section consists of one or more parts, separated by a comma. Each of these
 | 
				
			||||||
 | 
					parts, in turn, can be one of the following (any letters are integers):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `*`: allow all possible values.
 | 
				
			||||||
 | 
					* `a`: only this value is allowed.
 | 
				
			||||||
 | 
					* `*/n`: allow every n-th value.
 | 
				
			||||||
 | 
					* `a/n`: allow every n-th value, starting at a in the list.
 | 
				
			||||||
 | 
					* `a-b`: allow every value between a and b, bounds included.
 | 
				
			||||||
 | 
					* `a-b/n`: allow every n-th value inside the list of values between a and b,
 | 
				
			||||||
 | 
					  bounds included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each section can consist of as many of these parts as necessary.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `0 3`: every day at 03:00AM.
 | 
				
			||||||
 | 
					* `0 0 */7`: every 7th day of the month, at midnight.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## CLI tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Vieter binary contains a command that shows you the next matching times for
 | 
				
			||||||
 | 
					a given expression. This can be useful to understand the syntax. For more
 | 
				
			||||||
 | 
					information, see
 | 
				
			||||||
 | 
					[vieter-schedule(1)](https://rustybever.be/man/vieter/vieter-schedule.1.html).
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					weight: 10
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					# Pacman repository
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The part of Vieter that users will interact with the most is the Pacman
 | 
				
			||||||
 | 
					repository aka `vieter server`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Design overview
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A Vieter repository server has support for multiple repositories, with each
 | 
				
			||||||
 | 
					repository containing packages for multiple architectures.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you wish to use these repositories on your system, add the following to
 | 
				
			||||||
 | 
					`/etc/pacman.conf` for each repository you wish to use:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					[repo-name]
 | 
				
			||||||
 | 
					Server = https://example.com/$repo/$arch
 | 
				
			||||||
 | 
					SigLevel = Optional
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here, `$repo` and `$arch` are not variables you have to fill in yourself.
 | 
				
			||||||
 | 
					Rather, Pacman will substitute these when reading the config file. `$repo` is
 | 
				
			||||||
 | 
					replaced by the name between the square brackets (in this case `repo-name`),
 | 
				
			||||||
 | 
					and `$arch` is replaced by your system's architecture, e.g. `x86_64`. Of
 | 
				
			||||||
 | 
					course, you can also fill in these values manually yourself, e.g. if you wish
 | 
				
			||||||
 | 
					to use a different name inside the square brackets.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Important to note is that, when two repositories contain a package with the
 | 
				
			||||||
 | 
					same name, Pacman will choose the one from the repository that's highest up in
 | 
				
			||||||
 | 
					the `pacman.conf` file. Therefore, if you know your repository has packages
 | 
				
			||||||
 | 
					with the same name as ones from the official repositories, it might be better
 | 
				
			||||||
 | 
					to place the repository below the official repositories to avoid overwriting
 | 
				
			||||||
 | 
					official packages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Publishing packages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Packages can be easily published using a single HTTP POST request. Check out
 | 
				
			||||||
 | 
					the [HTTP API docs](https://rustybever.be/docs/vieter/api/) for more info on
 | 
				
			||||||
 | 
					these routes, including example cURL commands.
 | 
				
			||||||
		Loading…
	
		Reference in New Issue