Initial commit
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					/acid
 | 
				
			||||||
 | 
					/acid.1
 | 
				
			||||||
							
								
								
									
										12
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					Copyright (c) 2024, Přemysl Eric Janouch <p@janouch.name>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission to use, copy, modify, and/or distribute this software for any
 | 
				
			||||||
 | 
					purpose with or without fee is hereby granted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
				
			||||||
 | 
					WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
				
			||||||
 | 
					MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
				
			||||||
 | 
					WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 | 
				
			||||||
 | 
					OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 | 
				
			||||||
 | 
					CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
							
								
								
									
										13
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					.POSIX:
 | 
				
			||||||
 | 
					.SUFFIXES:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					version = dev
 | 
				
			||||||
 | 
					outputs = acid acid.1
 | 
				
			||||||
 | 
					all: $(outputs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					acid: acid.go
 | 
				
			||||||
 | 
						go build -ldflags "-X 'main.projectVersion=$(version)'" -o $@
 | 
				
			||||||
 | 
					acid.1: acid.adoc
 | 
				
			||||||
 | 
						asciidoctor -b manpage -a release-version=$(version) -o $@ acid.adoc
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -f $(outputs)
 | 
				
			||||||
							
								
								
									
										27
									
								
								README.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								README.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					acid
 | 
				
			||||||
 | 
					====
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'acid' is A Continuous Integration Daemon.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The aim of this project is to provide a trivial CI daemon for Gitea.
 | 
				
			||||||
 | 
					I find most alternatives way too complex to set up and run in a local setting,
 | 
				
			||||||
 | 
					while the gist of it is actually very simple--run some stuff on new git commits.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'acid' provides a simple web frontend, as well as a webhook endpoint
 | 
				
			||||||
 | 
					for notifications about new commits.  The daemon is supposed to be "firewalled"
 | 
				
			||||||
 | 
					by a normal HTTP server, and it will not provide TLS support to secure
 | 
				
			||||||
 | 
					communications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'acid' runs tasks over SSH, which should be universal enough.
 | 
				
			||||||
 | 
					It can tell you the build results via any method you can put in a shell script.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Getting it to work
 | 
				
			||||||
 | 
					------------------
 | 
				
			||||||
 | 
					 # apt install git golang asciidoctor
 | 
				
			||||||
 | 
					 $ git clone https://git.janouch.name/p/acid.git
 | 
				
			||||||
 | 
					 $ cd acid
 | 
				
			||||||
 | 
					 $ make
 | 
				
			||||||
 | 
					 $ man -l acid.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You will need to write your own runner scripts, which may be nontrivial.
 | 
				
			||||||
 | 
					The author suggests using __cloud-init__-enabled virtual machines with QEMU.
 | 
				
			||||||
							
								
								
									
										80
									
								
								acid.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								acid.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					acid(1)
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					:doctype: manpage
 | 
				
			||||||
 | 
					:manmanual: acid Manual
 | 
				
			||||||
 | 
					:mansource: acid {release-version}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Name
 | 
				
			||||||
 | 
					----
 | 
				
			||||||
 | 
					acid - A Continuous Integration Daemon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Synopsis
 | 
				
			||||||
 | 
					--------
 | 
				
			||||||
 | 
					*acid* [_OPTION_]... acid.yaml [_COMMAND_...]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					-----------
 | 
				
			||||||
 | 
					*acid* run without command arguments will start an HTTP server that creates
 | 
				
			||||||
 | 
					and executes tasks upon receiving push notifications from a Gitea instance,
 | 
				
			||||||
 | 
					according to the passed configuration file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When a command is passed, *acid* will relay it to that running instance
 | 
				
			||||||
 | 
					as an RPC call.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Options
 | 
				
			||||||
 | 
					-------
 | 
				
			||||||
 | 
					*-version*::
 | 
				
			||||||
 | 
						Output version information and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commands
 | 
				
			||||||
 | 
					--------
 | 
				
			||||||
 | 
					*restart* _ID_...::
 | 
				
			||||||
 | 
						Schedule tasks with the given IDs to be rerun.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Configuration
 | 
				
			||||||
 | 
					-------------
 | 
				
			||||||
 | 
					For help with creating the configuration file, consult the _acid.yaml.example_
 | 
				
			||||||
 | 
					file present in the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All paths are currently relative to the directory you launch *acid* from.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The *notify*, *setup*, and *build* scripts are processed using Go's
 | 
				
			||||||
 | 
					_text/template_ package, and take an object describing the task,
 | 
				
			||||||
 | 
					which has the following fields:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*ID*::
 | 
				
			||||||
 | 
						Unique integer ID for each task.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*Owner*::
 | 
				
			||||||
 | 
						Gitea user owning the repository.
 | 
				
			||||||
 | 
					*Repo*::
 | 
				
			||||||
 | 
						Name of the repository.
 | 
				
			||||||
 | 
					*FullName*::
 | 
				
			||||||
 | 
						Full name of the repository, including the owner.
 | 
				
			||||||
 | 
					*Hash*::
 | 
				
			||||||
 | 
						Commit hash pertaining to the task.
 | 
				
			||||||
 | 
					*Runner*::
 | 
				
			||||||
 | 
						Runner ID.
 | 
				
			||||||
 | 
					*RunnerName*::
 | 
				
			||||||
 | 
						Descriptive name of the runner.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*URL*::
 | 
				
			||||||
 | 
						*acid* link to the task, where its log output can be seen.
 | 
				
			||||||
 | 
					*RepoURL*::
 | 
				
			||||||
 | 
						Gitea link to the repository.
 | 
				
			||||||
 | 
					*CommitURL*::
 | 
				
			||||||
 | 
						Gitea link to the commit.
 | 
				
			||||||
 | 
					*CloneURL*::
 | 
				
			||||||
 | 
						Gitea link for cloning the repository over HTTP.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Runners
 | 
				
			||||||
 | 
					-------
 | 
				
			||||||
 | 
					Runners receive the following additional environment variables:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*ACID_ROOT*::   The same as the base directory for configuration.
 | 
				
			||||||
 | 
					*ACID_RUNNER*:: The same as *Runner* in script templates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reporting bugs
 | 
				
			||||||
 | 
					--------------
 | 
				
			||||||
 | 
					Use https://git.janouch.name/p/acid to report bugs, request features,
 | 
				
			||||||
 | 
					or submit pull requests.
 | 
				
			||||||
							
								
								
									
										64
									
								
								acid.yaml.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								acid.yaml.example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					# Path to an SQLite database file, which will be automatically created.
 | 
				
			||||||
 | 
					db: acid.db
 | 
				
			||||||
 | 
					# Address to listen on.
 | 
				
			||||||
 | 
					listen: :http
 | 
				
			||||||
 | 
					# Externally visible base URL that Gitea, its users, and RPC can connect to.
 | 
				
			||||||
 | 
					# The root/push endpoint accepts Gitea push notifications.
 | 
				
			||||||
 | 
					root: http://acid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Arbitrary secret that Gitea and RPC will sign their requests with.
 | 
				
			||||||
 | 
					secret: 0123456789abcde
 | 
				
			||||||
 | 
					# Base URL of the Gitea instance.
 | 
				
			||||||
 | 
					gitea: http://gitea
 | 
				
			||||||
 | 
					# Gitea access token used for writing commit statuses back to repositories.
 | 
				
			||||||
 | 
					token: 0123456789abcdefghijklmnopqrstuvwxyzABCD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Arbitrary sh script to notify about the results of finished tasks.
 | 
				
			||||||
 | 
					notify: |
 | 
				
			||||||
 | 
					  xN irc://acid@/acid?skipjoin&usenotice <<END
 | 
				
			||||||
 | 
					  {{.FullName}} {{.Hash}}: {{.RunnerName}} {{.State}} {{.URL}}
 | 
				
			||||||
 | 
					  END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# List of all available runners for projects, keyed by an ID (.Runner).
 | 
				
			||||||
 | 
					runners:
 | 
				
			||||||
 | 
					  arch:
 | 
				
			||||||
 | 
					    # Descriptive name of the runner (.RunnerName).
 | 
				
			||||||
 | 
					    name: Arch Linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Executable to make the runner present.
 | 
				
			||||||
 | 
					    # It may spawn a container, run a virtual machine, or even just sleep.
 | 
				
			||||||
 | 
					    # If it exits prematurely, the task fails.
 | 
				
			||||||
 | 
					    run: runners/arch.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # SSH configuration for connecting to the runner.
 | 
				
			||||||
 | 
					    ssh:
 | 
				
			||||||
 | 
					      # Username to connect as.
 | 
				
			||||||
 | 
					      user: ci
 | 
				
			||||||
 | 
					      # Adress of the SSH server.
 | 
				
			||||||
 | 
					      address: arch:22
 | 
				
			||||||
 | 
					      # Path to an SSH private key file, which may be used for public key auth.
 | 
				
			||||||
 | 
					      identity: data/id_rsa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Arbitrary shell script to prepare the stage for project scripts.
 | 
				
			||||||
 | 
					    setup: |
 | 
				
			||||||
 | 
					      set -ex
 | 
				
			||||||
 | 
					      sudo pacman -Syu --noconfirm git
 | 
				
			||||||
 | 
					      git clone --recursive '{{.CloneURL}}' '{{.Repo}}'
 | 
				
			||||||
 | 
					      cd '{{.Repo}}'
 | 
				
			||||||
 | 
					      git -c advice.detachedHead=false checkout '{{.Hash}}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Configuration for individual Gitea repositories.
 | 
				
			||||||
 | 
					projects:
 | 
				
			||||||
 | 
					  # Full repository name (.FullName, .Owner/.Repo).
 | 
				
			||||||
 | 
					  owner/repo:
 | 
				
			||||||
 | 
					    runners:
 | 
				
			||||||
 | 
					      arch:
 | 
				
			||||||
 | 
					        # Project setup script, meant to install dependencies.
 | 
				
			||||||
 | 
					        setup: |
 | 
				
			||||||
 | 
					          sudo pacman -S --noconfirm findutils coreutils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Project build script.
 | 
				
			||||||
 | 
					        build: |
 | 
				
			||||||
 | 
					          echo Computing line count...
 | 
				
			||||||
 | 
					          find . -not -path '*/.*' -type f -print0 | xargs -0 cat | wc -l
 | 
				
			||||||
							
								
								
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					module janouch.name/acid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.22.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require (
 | 
				
			||||||
 | 
						github.com/mattn/go-sqlite3 v1.14.22
 | 
				
			||||||
 | 
						golang.org/x/crypto v0.21.0
 | 
				
			||||||
 | 
						gopkg.in/yaml.v3 v3.0.1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require golang.org/x/sys v0.18.0 // indirect
 | 
				
			||||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
 | 
				
			||||||
 | 
					github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
				
			||||||
 | 
					golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
 | 
				
			||||||
 | 
					golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
		Reference in New Issue
	
	Block a user