Initial Commit
Ansible Linter / ansible-lint (push) Successful in 29s
Lint Markdown files / markdown-lint (push) Successful in 5s
Release Ansible Role / Release Ansible Role (push) Successful in 1m30s

This commit is contained in:
2026-06-10 21:48:09 +02:00
commit 271361ee5e
20 changed files with 623 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
---
exclude_paths:
- .gitea/
+12
View File
@@ -0,0 +1,12 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = false
+19
View File
@@ -0,0 +1,19 @@
name: Ansible Linter
on:
pull_request:
types: [ "opened", "reopened", "synchronize" ]
push:
branches: [ '**' ]
tags-ignore: [ '**' ]
jobs:
ansible-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.1
- name: Run ansible-lint
uses: ansible/ansible-lint@v25.12.2
with:
args: "--config-file .ansible-lint"
setup_python: "true"
+18
View File
@@ -0,0 +1,18 @@
name: Lint Markdown files
on:
pull_request:
types: [ "opened", "reopened", "synchronize" ]
push:
branches: [ '**' ]
tags-ignore: [ '**' ]
jobs:
markdown-lint:
runs-on:
- ubuntu-latest
steps:
- uses: actions/checkout@v6.0.1
- uses: DavidAnson/markdownlint-cli2-action@v21.0.0
with:
globs: '**/*.md'
+22
View File
@@ -0,0 +1,22 @@
name: Release Ansible Role
on:
push:
tags:
- '**'
workflow_dispatch: {}
jobs:
release:
name: Release Ansible Role
runs-on: ubuntu-latest
steps:
- name: Install Ansible Galaxy
run: |
apt update --yes
apt install --yes ansible
- env:
ANSIBLE_GALAXY_TOKEN: ${{ secrets.ANSIBLE_GALAXY_TOKEN }}
name: Update Ansible Role in Ansible Galaxy
run: |
ansible-galaxy role import --token=${ANSIBLE_GALAXY_TOKEN} volker-raschek ${GITHUB_REPOSITORY#*/}
+3
View File
@@ -0,0 +1,3 @@
.ansible
.kiro
node_modules
+136
View File
@@ -0,0 +1,136 @@
# markdownlint YAML configuration
# https://github.com/DavidAnson/markdownlint/blob/main/schema/.markdownlint.yaml
# Default state for all rules
default: true
# Path to configuration file to extend
extends: null
# MD003/heading-style/header-style - Heading style
MD003:
# Heading style
style: "atx"
# MD004/ul-style - Unordered list style
MD004:
style: "dash"
# MD007/ul-indent - Unordered list indentation
MD007:
# Spaces for indent
indent: 2
# Whether to indent the first level of the list
start_indented: false
# MD009/no-trailing-spaces - Trailing spaces
MD009:
# Spaces for line break
br_spaces: 2
# Allow spaces for empty lines in list items
list_item_empty_lines: false
# Include unnecessary breaks
strict: false
# MD010/no-hard-tabs - Hard tabs
MD010:
# Include code blocks
code_blocks: true
# MD012/no-multiple-blanks - Multiple consecutive blank lines
MD012:
# Consecutive blank lines
maximum: 1
# MD013/line-length - Line length
MD013:
# Number of characters
line_length: 120
# Number of characters for headings
heading_line_length: 120
# Number of characters for code blocks
code_block_line_length: 120
# Include code blocks
code_blocks: false
# Include tables
tables: false
# Include headings
headings: true
# Strict length checking
strict: false
# Stern length checking
stern: false
# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines
MD022:
# Blank lines above heading
lines_above: 1
# Blank lines below heading
lines_below: 1
# MD025/single-title/single-h1 - Multiple top-level headings in the same document
MD025:
# Heading level
level: 1
# RegExp for matching title in front matter
front_matter_title: "^\\s*title\\s*[:=]"
# MD026/no-trailing-punctuation - Trailing punctuation in heading
MD026:
# Punctuation characters
punctuation: ".,;:!。,;:!"
# MD029/ol-prefix - Ordered list item prefix
MD029:
# List style
style: "one_or_ordered"
# MD030/list-marker-space - Spaces after list markers
MD030:
# Spaces for single-line unordered list items
ul_single: 1
# Spaces for single-line ordered list items
ol_single: 1
# Spaces for multi-line unordered list items
ul_multi: 1
# Spaces for multi-line ordered list items
ol_multi: 1
# MD033/no-inline-html - Inline HTML
MD033:
# Allowed elements
allowed_elements: []
# MD035/hr-style - Horizontal rule style
MD035:
# Horizontal rule style
style: "---"
# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading
MD036:
# Punctuation characters
punctuation: ".,;:!?。,;:!?"
# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
MD041:
# Heading level
level: 1
# RegExp for matching title in front matter
front_matter_title: "^\\s*title\\s*[:=]"
# MD044/proper-names - Proper names should have the correct capitalization
MD044:
# List of proper names
names: []
# Include code blocks
code_blocks: false
# MD046/code-block-style - Code block style
MD046:
# Block style
style: "fenced"
# MD048/code-fence-style - Code fence style
MD048:
# Code fence syle
style: "backtick"
+14
View File
@@ -0,0 +1,14 @@
{
"ansible.python.interpreterPath": "/bin/python",
"files.associations": {
"**/.gitea/**/*.yml": "yaml",
"**/.gitea/**/*.yaml": "yaml",
"docker-compose*.yml": "dockercompose",
"*.yml": "ansible",
"*.yaml": "ansible",
".yamllint": "yaml",
".yamllint.yml": "yaml",
".yamllint.yaml": "yaml"
},
"rewrap.wrappingColumn": 120
}
+19
View File
@@ -0,0 +1,19 @@
---
#
# Documentation:
# https://yamllint.readthedocs.io/en/stable/
#
rules:
brackets:
forbid: false
min-spaces-inside: 0
max-spaces-inside: 2
min-spaces-inside-empty: 0
max-spaces-inside-empty: 0
indentation:
spaces: 2
indent-sequences: false
line-length:
max: 360
+20
View File
@@ -0,0 +1,20 @@
Copyright (c) 2025 Markus Pesch
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.
+105
View File
@@ -0,0 +1,105 @@
# gitea_runner
This Ansible role installs and configures a gitea Act Runner for executing GitHub Actions-compatible workflows.
## Installation
```bash
ansible-galaxy install volker-raschek.gitea_runner
```
## Usage
### Simple Playbook
```yaml
- hosts: runners
become: yes
roles:
- role: volker-raschek.gitea_runner
vars:
gitea_runner_gitea_url: "https://your-gitea-instance.com"
gitea_runner_token: "your-registration-token"
```
### Advanced Configuration
```yaml
- hosts: runners
become: yes
roles:
- role: volker-raschek.gitea_runner
vars:
gitea_runner_gitea_url: "https://your-gitea-instance.com"
gitea_runner_token: "your-registration-token"
gitea_runner_config:
runner:
capacity: 2
labels:
- "ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
- "custom-label:docker://custom-image:latest"
container:
privileged: true
```
## Further ansible roles
This ansible role is used in combination with other ansible roles of `volker-raschek`. You can search for the other
ansible roles via the following command.
```bash
$ ansible-galaxy role search --author "volker-raschek"
Found roles matching your search:
Name Description
---- -----------
volker-raschek.bind9 Role to install and configure bind9 on different distributions
volker-raschek.dhcpd Role to install and configure dhcpd on different distributions
volker-raschek.renovate Role to configure renovate as container image
...
```
## Parameters
### Act Runner
| Name | Description | Value |
| ---------------------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `gitea_runner_config_file` | Path to the gitea_runner configuration file | `/etc/gitea_runner/config.yaml` |
| `gitea_runner_config.log.level` | The level of logging, can be trace, debug, info, warn, error, fatal | `info` |
| `gitea_runner_config.runner.file` | Where to store the registration result | `.runner` |
| `gitea_runner_config.runner.capacity` | Execute how many tasks concurrently at the same time | `1` |
| `gitea_runner_config.runner.envs` | Extra environment variables to run jobs | `{}` |
| `gitea_runner_config.runner.env_file` | Extra environment variables to run jobs from a file | `.env` |
| `gitea_runner_config.runner.timeout` | The timeout for a job to be finished | `3h` |
| `gitea_runner_config.runner.shutdown_timeout` | The timeout for the runner to wait for running jobs to finish when shutting down | `0s` |
| `gitea_runner_config.runner.insecure` | Whether skip verifying the TLS certificate of the Gitea instance | `false` |
| `gitea_runner_config.runner.fetch_timeout` | The timeout for fetching the job from the Gitea instance | `5s` |
| `gitea_runner_config.runner.fetch_interval` | The interval for fetching the job from the Gitea instance | `2s` |
| `gitea_runner_config.runner.github_mirror` | The mirror address of the github that pulls the action repository | `""` |
| `gitea_runner_config.runner.labels` | The labels of a runner are used to determine which jobs the runner can run | `["ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest","ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04","ubuntu-20.04:docker://docker.gitea.com/runner-images:ubuntu-20.04"]` |
| `gitea_runner_config.cache.enabled` | Enable cache server to use actions/cache | `true` |
| `gitea_runner_config.cache.dir` | The directory to store the cache data | `""` |
| `gitea_runner_config.cache.host` | The host of the cache server | `""` |
| `gitea_runner_config.cache.port` | The port of the cache server | `0` |
| `gitea_runner_config.cache.external_server` | The external cache server URL | `""` |
| `gitea_runner_config.container.network` | Specifies the network to which the container will connect | `""` |
| `gitea_runner_config.container.privileged` | Whether to use privileged mode when launching task containers | `false` |
| `gitea_runner_config.container.options` | Other options to be used when the container is started | `nil` |
| `gitea_runner_config.container.workdir_parent` | The parent directory of a job's working directory | `nil` |
| `gitea_runner_config.container.valid_volumes` | Volumes that can be mounted to containers | `[]` |
| `gitea_runner_config.container.docker_host` | Overrides the docker client host with the specified one | `""` |
| `gitea_runner_config.container.force_pull` | Pull docker image(s) even if already present | `true` |
| `gitea_runner_config.container.force_rebuild` | Rebuild docker image(s) even if already present | `false` |
| `gitea_runner_config.container.require_docker` | Always require a reachable docker daemon | `false` |
| `gitea_runner_config.container.docker_timeout` | Timeout to wait for the docker daemon to be reachable | `0s` |
| `gitea_runner_config.host.workdir_parent` | The parent directory of a job's working directory | `nil` |
| `gitea_runner_gitea_url` | The URL of the Gitea instance | `""` |
| `gitea_runner_token` | The registration token for the gitea_runner | `""` |
### Package Management
| Name | Description | Value |
| --------------------------- | ---------------------------------------------------------- | ------ |
| `gitea_runner_update_cache` | Whether to update package cache before installing packages | `true` |
+87
View File
@@ -0,0 +1,87 @@
## @section Act Runner
## @param gitea_runner_config_file Path to the gitea_runner configuration file
gitea_runner_config_file: /etc/gitea_runner/config.yaml
gitea_runner_config:
log:
## @param gitea_runner_config.log.level The level of logging, can be trace, debug, info, warn, error, fatal
level: info
runner:
## @param gitea_runner_config.runner.file Where to store the registration result
file: .runner
## @param gitea_runner_config.runner.capacity Execute how many tasks concurrently at the same time
capacity: 1
## @param gitea_runner_config.runner.envs Extra environment variables to run jobs
envs: {}
# A_TEST_ENV_NAME_1: a_test_env_value_1
# A_TEST_ENV_NAME_2: a_test_env_value_2
## @param gitea_runner_config.runner.env_file Extra environment variables to run jobs from a file
env_file: .env
## @param gitea_runner_config.runner.timeout The timeout for a job to be finished
timeout: 3h
## @param gitea_runner_config.runner.shutdown_timeout The timeout for the runner to wait for running jobs to finish when shutting down
shutdown_timeout: 0s
## @param gitea_runner_config.runner.insecure Whether skip verifying the TLS certificate of the Gitea instance
insecure: false
## @param gitea_runner_config.runner.fetch_timeout The timeout for fetching the job from the Gitea instance
fetch_timeout: 5s
## @param gitea_runner_config.runner.fetch_interval The interval for fetching the job from the Gitea instance
fetch_interval: 2s
## @param gitea_runner_config.runner.github_mirror The mirror address of the github that pulls the action repository
github_mirror: ''
## @param gitea_runner_config.runner.labels The labels of a runner are used to determine which jobs the runner can run
labels:
- "ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
- "ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
- "ubuntu-20.04:docker://docker.gitea.com/runner-images:ubuntu-20.04"
cache:
## @param gitea_runner_config.cache.enabled Enable cache server to use actions/cache
enabled: true
## @param gitea_runner_config.cache.dir The directory to store the cache data
dir: ""
## @param gitea_runner_config.cache.host The host of the cache server
host: ""
## @param gitea_runner_config.cache.port The port of the cache server
port: 0
## @param gitea_runner_config.cache.external_server The external cache server URL
external_server: ""
container:
## @param gitea_runner_config.container.network Specifies the network to which the container will connect
network: ""
## @param gitea_runner_config.container.privileged Whether to use privileged mode when launching task containers
privileged: false
## @param gitea_runner_config.container.options Other options to be used when the container is started
options:
## @param gitea_runner_config.container.workdir_parent The parent directory of a job's working directory
workdir_parent:
## @param gitea_runner_config.container.valid_volumes Volumes that can be mounted to containers
valid_volumes: []
## @param gitea_runner_config.container.docker_host Overrides the docker client host with the specified one
docker_host: ""
## @param gitea_runner_config.container.force_pull Pull docker image(s) even if already present
force_pull: true
## @param gitea_runner_config.container.force_rebuild Rebuild docker image(s) even if already present
force_rebuild: false
## @param gitea_runner_config.container.require_docker Always require a reachable docker daemon
require_docker: false
## @param gitea_runner_config.container.docker_timeout Timeout to wait for the docker daemon to be reachable
docker_timeout: 0s
host:
## @param gitea_runner_config.host.workdir_parent The parent directory of a job's working directory
workdir_parent:
## @param gitea_runner_gitea_url The URL of the Gitea instance
gitea_runner_gitea_url: ""
## @param gitea_runner_token The registration token for the gitea_runner
gitea_runner_token: ""
## @section Package Management
## @param gitea_runner_update_cache Whether to update package cache before installing packages
gitea_runner_update_cache: true
+7
View File
@@ -0,0 +1,7 @@
---
- name: Restart gitea_runner
ansible.builtin.systemd:
name: "{{ gitea_runner_service_name }}"
state: restarted
daemon_reload: true
+20
View File
@@ -0,0 +1,20 @@
dependencies: []
galaxy_info:
author: "Markus Pesch"
company: "Cryptic Systems"
description: "Ansible role to install and configure gitea Act Runner for executing GitHub Actions-compatible workflows"
galaxy_tags:
- gitea
- runner
- actions
- ci
- cd
- automation
license: "MIT"
min_ansible_version: "2.9"
namespace: volker-raschek
platforms:
- name: ArchLinux
versions:
- all
role_name: "gitea_runner"
+19
View File
@@ -0,0 +1,19 @@
{
"name": "act-runner-ansible-role",
"homepage": "https://git.cryptic.systems/volker.raschek/act-runner-ansible-role.git",
"license": "MIT",
"private": true,
"engineStrict": true,
"engines": {
"node": ">=16.0.0",
"npm": ">=8.0.0"
},
"scripts": {
"readme:lint": "markdownlint *.md -f",
"readme:parameters": "readme-generator -v defaults/main.yaml -r README.md"
},
"devDependencies": {
"@bitnami/readme-generator-for-helm": "^2.5.0",
"markdownlint-cli": "^0.45.0"
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>volker.raschek/renovate-config:default#master",
"local>volker.raschek/renovate-config:container#master",
"local>volker.raschek/renovate-config:actions#master",
"local>volker.raschek/renovate-config:regexp#master"
]
}
+83
View File
@@ -0,0 +1,83 @@
---
- name: Include OS-specific variables
ansible.builtin.include_vars: "{{ lookup('first_found', params) }}"
vars:
params:
files:
- "{{ ansible_facts['distribution'] }}_{{ ansible_facts['architecture'] }}.yaml"
- "{{ ansible_facts['distribution'] }}.yaml"
- "{{ ansible_facts['os_family'] }}_{{ ansible_facts['architecture'] }}.yaml"
- "{{ ansible_facts['os_family'] }}.yaml"
- main.yaml
paths:
- vars
- name: Verify required variables
ansible.builtin.include_tasks: verify_vars.yaml
- name: Check Gitea instance availability
ansible.builtin.uri:
url: "{{ gitea_runner_gitea_url }}"
method: GET
validate_certs: false
timeout: 10
register: _gitea_check
failed_when: _gitea_check.status is not defined or _gitea_check.status >= 400
- name: Install gitea_runner and dependencies
when:
- ansible_facts['distribution'] == 'Archlinux'
block:
- name: Update package cache
community.general.pacman:
update_cache: "{{ gitea_runner_update_cache }}"
- name: Install packages
ansible.builtin.package:
name: "{{ item }}"
state: present
with_items: "{{ gitea_runner_package_names }}"
- name: Create gitea_runner config directory
ansible.builtin.file:
path: "{{ gitea_runner_config_file | dirname }}"
state: directory
mode: "0755"
- name: Template gitea_runner config file
ansible.builtin.template:
src: etc/gitea_runner/config.yaml.j2
dest: "{{ gitea_runner_config_file }}"
owner: "{{ gitea_runner_unix_user }}"
group: "{{ gitea_runner_unix_group }}"
mode: "0644"
notify: Restart gitea_runner
- name: Create gitea_runner lib directory
ansible.builtin.file:
path: "{{ gitea_runner_lib_dir }}"
owner: "{{ gitea_runner_unix_user }}"
group: "{{ gitea_runner_unix_group }}"
mode: "0755"
state: directory
- name: Check if gitea_runner is already registered
ansible.builtin.stat:
path: "{{ gitea_runner_lib_dir }}/.runner"
register: _gitea_runner_registration_file
- name: Register gitea_runner
ansible.builtin.command:
cmd: "gitea_runner --config {{ gitea_runner_config_file }} register --instance {{ gitea_runner_gitea_url }} --no-interactive --token={{ gitea_runner_token }}"
chdir: "{{ gitea_runner_lib_dir }}"
no_log: true
register: _gitea_runner_register_cmd
failed_when: _gitea_runner_register_cmd.rc > 0
changed_when: _gitea_runner_register_cmd.rc == 0
when: not _gitea_runner_registration_file.stat.exists
- name: Start and enable gitea_runner service
ansible.builtin.service:
name: "{{ gitea_runner_service_name }}"
state: started
enabled: true
+11
View File
@@ -0,0 +1,11 @@
---
- name: Verify required variables are defined
ansible.builtin.assert:
that:
- lookup('vars', item) is defined
- lookup('vars', item) | length > 0
fail_msg: "Required variable '{{ item }}' is not defined or empty."
loop:
- gitea_runner_gitea_url
- gitea_runner_token
+4
View File
@@ -0,0 +1,4 @@
#
# {{ ansible_managed }}
#
{{ gitea_runner_config | to_nice_yaml }}
+11
View File
@@ -0,0 +1,11 @@
---
gitea_runner_package_names:
- gitea_runner
gitea_runner_service_name: gitea_runner
gitea_runner_unix_user: gitea_runner
gitea_runner_unix_group: gitea_runner
gitea_runner_lib_dir: /var/lib/gitea_runner