refactor: some small changes before PR
	
		
			
	
		
	
	
		
			
				
	
				ci/woodpecker/pr/docs Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/lint Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/build Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/man Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/docker Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/test Pipeline was successful
				
					Details
				
			
		
	
				
					
				
			
				
	
				ci/woodpecker/pr/docs Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/lint Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/build Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/man Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/docker Pipeline was successful
				
					Details
				
			
		
			
				
	
				ci/woodpecker/pr/test Pipeline was successful
				
					Details
				
			
		
	
							parent
							
								
									b66d1161ed
								
							
						
					
					
						commit
						ab81eebd87
					
				| 
						 | 
					@ -40,8 +40,8 @@ meaning manual requests can cause builds to be skipped.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
curl \
 | 
					curl \
 | 
				
			||||||
  -H 'x-api-key: secret' \
 | 
					  -H 'X-Api-Key: secret' \
 | 
				
			||||||
  'https://example.com/api/v1/jobs/poll?arch=x86_64&max=2'
 | 
					  https://example.com/api/v1/jobs/poll?arch=x86_64&max=2
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> JSON output format
 | 
					> JSON output format
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,7 +59,7 @@ configuration variable required for each command.
 | 
				
			||||||
      ([GitHub](https://github.com/Menci/docker-archlinuxarm)). This is the
 | 
					      ([GitHub](https://github.com/Menci/docker-archlinuxarm)). This is the
 | 
				
			||||||
      image used for the Vieter CI builds.
 | 
					      image used for the Vieter CI builds.
 | 
				
			||||||
* `max_log_age`: maximum age of logs (in days). Logs older than this will get
 | 
					* `max_log_age`: maximum age of logs (in days). Logs older than this will get
 | 
				
			||||||
  cleaned by the log removal daemon . If set to a negative value, no logs are
 | 
					  cleaned by the log removal daemon. If set to a negative value, no logs are
 | 
				
			||||||
  ever removed. The age of logs is determined by the time the build was
 | 
					  ever removed. The age of logs is determined by the time the build was
 | 
				
			||||||
  started.
 | 
					  started.
 | 
				
			||||||
    * Default: `-1`
 | 
					    * Default: `-1`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,15 +5,15 @@ weight: 20
 | 
				
			||||||
# Cleanup
 | 
					# Cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vieter stores the logs of every single package build. While this is great for
 | 
					Vieter stores the logs of every single package build. While this is great for
 | 
				
			||||||
debugging why builds fails, it also causes an active or long-running Vieter
 | 
					debugging why builds fail, it also causes an active or long-running Vieter
 | 
				
			||||||
instance to accumulate thousands of logs.
 | 
					instance to accumulate thousands of logs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To combat this, a log removal daemon can be enabled that periodically removes
 | 
					To combat this, a log removal daemon can be enabled that periodically removes
 | 
				
			||||||
old build logs. By starting your server with the `max_log_age` variable (see
 | 
					old build logs. By starting your server with the `max_log_age` variable (see
 | 
				
			||||||
[Configuration](/configuration#vieter-server) for more info), a daemon will
 | 
					[Configuration](/configuration#vieter-server)), a daemon will get enabled that
 | 
				
			||||||
get enabled that periodically removes logs older than this setting. By default,
 | 
					periodically removes logs older than this setting. By default, this will happen
 | 
				
			||||||
this will happen every day at midnight, but this behavior can be changed using
 | 
					every day at midnight, but this behavior can be changed using the
 | 
				
			||||||
the `log_removal_schedule` variable.
 | 
					`log_removal_schedule` variable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< hint info >}}
 | 
					{{< hint info >}}
 | 
				
			||||||
**Note**  
 | 
					**Note**  
 | 
				
			||||||
| 
						 | 
					@ -21,4 +21,3 @@ The daemon will always run a removal of logs on startup. Therefore, it's
 | 
				
			||||||
possible the daemon will be *very* active when first enabling this setting.
 | 
					possible the daemon will be *very* active when first enabling this setting.
 | 
				
			||||||
After the initial surge of logs to remove, it'll calm down again.
 | 
					After the initial surge of logs to remove, it'll calm down again.
 | 
				
			||||||
{{< /hint >}}
 | 
					{{< /hint >}}
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,8 +43,6 @@ pub fn (c &Client) add_build_log(target_id int, start_time time.Time, end_time t
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// remove_build_log removes the build log with the given id from the server.
 | 
					// remove_build_log removes the build log with the given id from the server.
 | 
				
			||||||
pub fn (c &Client) remove_build_log(id int) !string {
 | 
					pub fn (c &Client) remove_build_log(id int) ! {
 | 
				
			||||||
	data := c.send_request<string>(.delete, '/api/v1/logs/$id', {})!
 | 
						c.send_request<string>(.delete, '/api/v1/logs/$id', {})!
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return data.data
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
module models
 | 
					module models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct BuildLog {
 | 
					pub struct BuildLog {
 | 
				
			||||||
pub mut:
 | 
					pub mut:
 | 
				
			||||||
| 
						 | 
					@ -28,6 +29,13 @@ pub fn (bl &BuildLog) str() string {
 | 
				
			||||||
	return str
 | 
						return str
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// path returns the path to the log file, relative to the logs directory
 | 
				
			||||||
 | 
					pub fn (bl &BuildLog) path() string {
 | 
				
			||||||
 | 
						filename := bl.start_time.custom_format('YYYY-MM-DD_HH-mm-ss')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return os.join_path(bl.target_id.str(), bl.arch, filename)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[params]
 | 
					[params]
 | 
				
			||||||
pub struct BuildLogFilter {
 | 
					pub struct BuildLogFilter {
 | 
				
			||||||
pub mut:
 | 
					pub mut:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ fn (mut app App) v1_post_log() web.Result {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Store log in db
 | 
						// Store log in db
 | 
				
			||||||
	log := BuildLog{
 | 
						mut log := BuildLog{
 | 
				
			||||||
		target_id: target_id
 | 
							target_id: target_id
 | 
				
			||||||
		start_time: start_time
 | 
							start_time: start_time
 | 
				
			||||||
		end_time: end_time
 | 
							end_time: end_time
 | 
				
			||||||
| 
						 | 
					@ -95,25 +95,20 @@ fn (mut app App) v1_post_log() web.Result {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// id of newly created log
 | 
						// id of newly created log
 | 
				
			||||||
	log_id := app.db.add_build_log(log)
 | 
						log.id = app.db.add_build_log(log)
 | 
				
			||||||
 | 
						log_file_path := os.join_path(app.conf.data_dir, logs_dir_name, log.path())
 | 
				
			||||||
	repo_logs_dir := os.join_path(app.conf.data_dir, logs_dir_name, target_id.str(), arch)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create the logs directory of it doesn't exist
 | 
						// Create the logs directory of it doesn't exist
 | 
				
			||||||
	if !os.exists(repo_logs_dir) {
 | 
						if !os.exists(os.dir(log_file_path)) {
 | 
				
			||||||
		os.mkdir_all(repo_logs_dir) or {
 | 
							os.mkdir_all(os.dir(log_file_path)) or {
 | 
				
			||||||
			app.lerror("Couldn't create dir '$repo_logs_dir'.")
 | 
								app.lerror('Error while creating log file: $err.msg()')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return app.status(.internal_server_error)
 | 
								return app.status(.internal_server_error)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Stream log contents to correct file
 | 
					 | 
				
			||||||
	file_name := start_time.custom_format('YYYY-MM-DD_HH-mm-ss')
 | 
					 | 
				
			||||||
	full_path := os.join_path_single(repo_logs_dir, file_name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if length := app.req.header.get(.content_length) {
 | 
						if length := app.req.header.get(.content_length) {
 | 
				
			||||||
		util.reader_to_file(mut app.reader, length.int(), full_path) or {
 | 
							util.reader_to_file(mut app.reader, length.int(), log_file_path) or {
 | 
				
			||||||
			app.lerror('An error occured while receiving logs: $err.msg()')
 | 
								app.lerror('An error occured while receiving logs: $err.msg()')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return app.status(.internal_server_error)
 | 
								return app.status(.internal_server_error)
 | 
				
			||||||
| 
						 | 
					@ -122,16 +117,14 @@ fn (mut app App) v1_post_log() web.Result {
 | 
				
			||||||
		return app.status(.length_required)
 | 
							return app.status(.length_required)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return app.json(.ok, new_data_response(log_id))
 | 
						return app.json(.ok, new_data_response(log.id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// v1_delete_log allows removing a build log from the system.
 | 
					// v1_delete_log allows removing a build log from the system.
 | 
				
			||||||
['/api/v1/logs/:id'; auth; delete]
 | 
					['/api/v1/logs/:id'; auth; delete]
 | 
				
			||||||
fn (mut app App) v1_delete_log(id int) web.Result {
 | 
					fn (mut app App) v1_delete_log(id int) web.Result {
 | 
				
			||||||
	log := app.db.get_build_log(id) or { return app.status(.not_found) }
 | 
						log := app.db.get_build_log(id) or { return app.status(.not_found) }
 | 
				
			||||||
	file_name := log.start_time.custom_format('YYYY-MM-DD_HH-mm-ss')
 | 
						full_path := os.join_path(app.conf.data_dir, logs_dir_name, log.path())
 | 
				
			||||||
	full_path := os.join_path(app.conf.data_dir, logs_dir_name, log.target_id.str(), log.arch,
 | 
					 | 
				
			||||||
		file_name)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	os.rm(full_path) or {
 | 
						os.rm(full_path) or {
 | 
				
			||||||
		app.lerror('Failed to remove log file $full_path: $err.msg()')
 | 
							app.lerror('Failed to remove log file $full_path: $err.msg()')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,11 +28,10 @@ fn (mut app App) log_removal_daemon(schedule CronExpression) {
 | 
				
			||||||
			logs = app.db.get_build_logs(before: too_old_timestamp, offset: offset, limit: 50)
 | 
								logs = app.db.get_build_logs(before: too_old_timestamp, offset: offset, limit: 50)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for log in logs {
 | 
								for log in logs {
 | 
				
			||||||
				file_name := log.start_time.custom_format('YYYY-MM-DD_HH-mm-ss')
 | 
									log_file_path := os.join_path(app.conf.data_dir, logs_dir_name, log.path())
 | 
				
			||||||
				full_path := os.join_path(app.conf.data_dir, logs_dir_name, log.target_id.str(),
 | 
					
 | 
				
			||||||
					log.arch, file_name)
 | 
									os.rm(log_file_path) or {
 | 
				
			||||||
				os.rm(full_path) or {
 | 
										app.lerror('Failed to remove log file $log_file_path: $err.msg()')
 | 
				
			||||||
					app.lerror('Failed to remove log file $full_path: $err.msg()')
 | 
					 | 
				
			||||||
					failed += 1
 | 
										failed += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue