cli tool to manage git repos #103
			
				
			
		
		
		
	| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					platform: linux/amd64
 | 
				
			||||||
 | 
					branches: [dev]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pipeline:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    image: 'archlinux:latest'
 | 
				
			||||||
 | 
					    commands:
 | 
				
			||||||
 | 
					      # Update packages
 | 
				
			||||||
 | 
					      - pacman -Syu --needed --noconfirm base-devel
 | 
				
			||||||
 | 
					      # Create non-root user to perform build & switch to their home
 | 
				
			||||||
 | 
					      - groupadd -g 1000 builder
 | 
				
			||||||
 | 
					      - useradd -mg builder builder
 | 
				
			||||||
 | 
					      - chown -R builder:builder "$PWD"
 | 
				
			||||||
 | 
					      - "echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
 | 
				
			||||||
 | 
					      - su builder
 | 
				
			||||||
 | 
					      # Build the package
 | 
				
			||||||
 | 
					      - makepkg -s --noconfirm --needed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  publish:
 | 
				
			||||||
 | 
					    image: 'archlinux:latest'
 | 
				
			||||||
 | 
					    commands:
 | 
				
			||||||
 | 
					      # Publish the package
 | 
				
			||||||
 | 
					      - 'curl -F "file=@$(ls *.pkg*)" -H "X-API-KEY: $VIETER_API_KEY" https://pkgs.rustybever.be/api/publish'
 | 
				
			||||||
 | 
					    secrets:
 | 
				
			||||||
 | 
					      - vieter_api_key
 | 
				
			||||||
| 
						 | 
					@ -36,18 +36,34 @@ pipeline:
 | 
				
			||||||
    when:
 | 
					    when:
 | 
				
			||||||
      event: push
 | 
					      event: push
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cli:
 | 
				
			||||||
 | 
					    image: 'chewingbever/vlang:latest'
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - LDFLAGS=-static
 | 
				
			||||||
 | 
					    commands:
 | 
				
			||||||
 | 
					      - make cli-prod
 | 
				
			||||||
 | 
					      # Make sure the binary is actually statically built
 | 
				
			||||||
 | 
					      - readelf -d vieterctl
 | 
				
			||||||
 | 
					      - du -h vieterctl
 | 
				
			||||||
 | 
					      - '[ "$(readelf -d vieterctl | grep NEEDED | wc -l)" = 0 ]'
 | 
				
			||||||
 | 
					      # This removes so much, it's amazing
 | 
				
			||||||
 | 
					      - strip -s vieterctl
 | 
				
			||||||
 | 
					      - du -h vieterctl
 | 
				
			||||||
 | 
					    when:
 | 
				
			||||||
 | 
					      event: push
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  upload:
 | 
					  upload:
 | 
				
			||||||
    image: 'chewingbever/vlang:latest'
 | 
					    image: 'chewingbever/vlang:latest'
 | 
				
			||||||
    secrets: [ s3_username, s3_password ]
 | 
					    secrets: [ s3_username, s3_password ]
 | 
				
			||||||
    commands:
 | 
					    commands:
 | 
				
			||||||
      # https://gist.github.com/JustinTimperio/7c7115f87b775618637d67ac911e595f
 | 
					      # https://gist.github.com/JustinTimperio/7c7115f87b775618637d67ac911e595f
 | 
				
			||||||
      - export URL=s3.rustybever.be
 | 
					      - export URL=s3.rustybever.be
 | 
				
			||||||
      - export OBJ_PATH="/vieter/commits/$CI_COMMIT_SHA/vieter-$(echo '${PLATFORM}' | sed 's:/:-:g')"
 | 
					 | 
				
			||||||
      - export DATE="$(date -R --utc)"
 | 
					      - export DATE="$(date -R --utc)"
 | 
				
			||||||
      - export CONTENT_TYPE='application/zstd'
 | 
					      - export CONTENT_TYPE='application/zstd'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - export OBJ_PATH="/vieter/commits/$CI_COMMIT_SHA/vieter-$(echo '${PLATFORM}' | sed 's:/:-:g')"
 | 
				
			||||||
      - export SIG_STRING="PUT\n\n$CONTENT_TYPE\n$DATE\n$OBJ_PATH"
 | 
					      - export SIG_STRING="PUT\n\n$CONTENT_TYPE\n$DATE\n$OBJ_PATH"
 | 
				
			||||||
      - export SIGNATURE=`echo -en $SIG_STRING | openssl sha1 -hmac $S3_PASSWORD -binary | base64`
 | 
					      - export SIGNATURE=`echo -en $SIG_STRING | openssl sha1 -hmac $S3_PASSWORD -binary | base64`
 | 
				
			||||||
 | 
					 | 
				
			||||||
      - >
 | 
					      - >
 | 
				
			||||||
        curl 
 | 
					        curl 
 | 
				
			||||||
        --silent
 | 
					        --silent
 | 
				
			||||||
| 
						 | 
					@ -58,5 +74,20 @@ pipeline:
 | 
				
			||||||
        -H "Content-Type: $CONTENT_TYPE"
 | 
					        -H "Content-Type: $CONTENT_TYPE"
 | 
				
			||||||
        -H "Authorization: AWS $S3_USERNAME:$SIGNATURE"
 | 
					        -H "Authorization: AWS $S3_USERNAME:$SIGNATURE"
 | 
				
			||||||
        https://$URL$OBJ_PATH
 | 
					        https://$URL$OBJ_PATH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Also update the CLI tool
 | 
				
			||||||
 | 
					      - export OBJ_PATH="/vieter/commits/$CI_COMMIT_SHA/vieterctl-$(echo '${PLATFORM}' | sed 's:/:-:g')"
 | 
				
			||||||
 | 
					      - export SIG_STRING="PUT\n\n$CONTENT_TYPE\n$DATE\n$OBJ_PATH"
 | 
				
			||||||
 | 
					      - export SIGNATURE=`echo -en $SIG_STRING | openssl sha1 -hmac $S3_PASSWORD -binary | base64`
 | 
				
			||||||
 | 
					      - >
 | 
				
			||||||
 | 
					        curl 
 | 
				
			||||||
 | 
					        --silent
 | 
				
			||||||
 | 
					        -XPUT
 | 
				
			||||||
 | 
					        -T vieterctl
 | 
				
			||||||
 | 
					        -H "Host: $URL"
 | 
				
			||||||
 | 
					        -H "Date: $DATE"
 | 
				
			||||||
 | 
					        -H "Content-Type: $CONTENT_TYPE"
 | 
				
			||||||
 | 
					        -H "Authorization: AWS $S3_USERNAME:$SIGNATURE"
 | 
				
			||||||
 | 
					        https://$URL$OBJ_PATH
 | 
				
			||||||
    when:
 | 
					    when:
 | 
				
			||||||
      event: push
 | 
					      event: push
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										11
									
								
								CHANGELOG.md
								
								
								
								
							| 
						 | 
					@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [Unreleased](https://git.rustybever.be/Chewing_Bever/vieter)
 | 
					## [Unreleased](https://git.rustybever.be/Chewing_Bever/vieter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Better environment variable support
 | 
				
			||||||
 | 
					    * Each env var can now be provided from a file by appending it with `_FILE`
 | 
				
			||||||
 | 
					      & passing the path to the file as value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Added
 | 
					## Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Very basic build system
 | 
					* Very basic build system
 | 
				
			||||||
| 
						 | 
					@ -15,10 +21,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
				
			||||||
    * Packages are always rebuilt, even if they haven't changed
 | 
					    * Packages are always rebuilt, even if they haven't changed
 | 
				
			||||||
    * Hardcoded planning of builds
 | 
					    * Hardcoded planning of builds
 | 
				
			||||||
    * Builds are sequential
 | 
					    * Builds are sequential
 | 
				
			||||||
* Better environment variable support
 | 
					 | 
				
			||||||
    * Each env var can now be provided from a file by appending it with `_FILE`
 | 
					 | 
				
			||||||
      & passing the path to the file as value
 | 
					 | 
				
			||||||
* API for managing Git repositories to build
 | 
					* API for managing Git repositories to build
 | 
				
			||||||
 | 
					* CLI to list, add & remove Git repos to build
 | 
				
			||||||
 | 
					* Published packages on my Vieter instance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Fixed
 | 
					## Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							| 
						 | 
					@ -46,7 +46,7 @@ c:
 | 
				
			||||||
.PHONY: cli
 | 
					.PHONY: cli
 | 
				
			||||||
cli: dvieterctl
 | 
					cli: dvieterctl
 | 
				
			||||||
dvieterctl: cli.v
 | 
					dvieterctl: cli.v
 | 
				
			||||||
	$(V_PATH) -showcc -o dvieterctl cli.v
 | 
						$(V_PATH) -showcc -g -o dvieterctl cli.v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: cli-prod
 | 
					.PHONY: cli-prod
 | 
				
			||||||
cli-prod: vieterctl
 | 
					cli-prod: vieterctl
 | 
				
			||||||
| 
						 | 
					@ -97,4 +97,4 @@ v/v:
 | 
				
			||||||
	make -C v
 | 
						make -C v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	rm -rf 'data' 'vieter' 'dvieter' 'pvieter' 'vieter.c'
 | 
						rm -rf 'data' 'vieter' 'dvieter' 'pvieter' 'vieter.c' 'dvieterctl' 'vieterctl' 'pkg' 'src/vieter'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					# Maintainer: Jef Roosens
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pkgbase='vieter'
 | 
				
			||||||
 | 
					pkgname=('vieter' 'vieterctl')
 | 
				
			||||||
 | 
					pkgver=0.1.0.rc1.r45.g6d3ff8a
 | 
				
			||||||
 | 
					pkgrel=1
 | 
				
			||||||
 | 
					depends=('glibc' 'openssl' 'libarchive' 'gc')
 | 
				
			||||||
 | 
					arch=('x86_64' 'aarch64' 'armv7')
 | 
				
			||||||
 | 
					url='https://git.rustybever.be/Chewing_Bever/vieter'
 | 
				
			||||||
 | 
					license=('AGPL3')
 | 
				
			||||||
 | 
					source=($pkgname::git+https://git.rustybever.be/Chewing_Bever/vieter#branch=dev)
 | 
				
			||||||
 | 
					md5sums=('SKIP')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pkgver() {
 | 
				
			||||||
 | 
					    cd "$pkgname"
 | 
				
			||||||
 | 
					    git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					build() {
 | 
				
			||||||
 | 
					    cd "$pkgname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Build the compiler
 | 
				
			||||||
 | 
					    CFLAGS= make v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Build the server & the CLI tool
 | 
				
			||||||
 | 
					    make prod
 | 
				
			||||||
 | 
					    make cli-prod
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package_vieter() {
 | 
				
			||||||
 | 
					    install -dm755 "$pkgdir/usr/bin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    install -Dm755 "$pkgbase/pvieter" "$pkgdir/usr/bin/vieter"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package_vieterctl() {
 | 
				
			||||||
 | 
					    install -dm755 "$pkgdir/usr/bin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    install -Dm755 "$pkgbase/vieterctl" "$pkgdir/usr/bin/vieterctl"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import toml
 | 
				
			||||||
 | 
					import net.http
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Config {
 | 
				
			||||||
 | 
						address string [required]
 | 
				
			||||||
 | 
						api_key string [required]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn list(conf Config) ? {
 | 
				
			||||||
 | 
						mut req := http.new_request(http.Method.get, '$conf.address/api/repos', '') ?
 | 
				
			||||||
 | 
						req.add_custom_header('X-API-Key', conf.api_key) ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res := req.do() ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						println(res.text)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn add(conf Config, args []string) ? {
 | 
				
			||||||
 | 
						if args.len < 2 {
 | 
				
			||||||
 | 
							eprintln('Not enough arguments.')
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if args.len > 2 {
 | 
				
			||||||
 | 
							eprintln('Too many arguments.')
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mut req := http.new_request(http.Method.post, '$conf.address/api/repos?url=${args[0]}&branch=${args[1]}', '') ?
 | 
				
			||||||
 | 
						req.add_custom_header('X-API-Key', conf.api_key) ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res := req.do() ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						println(res.text)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn remove(conf Config, args []string) ? {
 | 
				
			||||||
 | 
						if args.len < 2 {
 | 
				
			||||||
 | 
							eprintln('Not enough arguments.')
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if args.len > 2 {
 | 
				
			||||||
 | 
							eprintln('Too many arguments.')
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mut req := http.new_request(http.Method.delete, '$conf.address/api/repos?url=${args[0]}&branch=${args[1]}', '') ?
 | 
				
			||||||
 | 
						req.add_custom_header('X-API-Key', conf.api_key) ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res := req.do() ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						println(res.text)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
						conf_path := os.expand_tilde_to_home('~/.vieterrc')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !os.is_file(conf_path) {
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						conf := toml.parse_file(conf_path) ?.reflect<Config>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := os.args[1..]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if args.len == 0 {
 | 
				
			||||||
 | 
							eprintln('No action provided.')
 | 
				
			||||||
 | 
							exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						action := args[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						match action {
 | 
				
			||||||
 | 
							'list' { list(conf) ? }
 | 
				
			||||||
 | 
							'add' { add(conf, args[1..]) ? }
 | 
				
			||||||
 | 
							'remove' { remove(conf, args[1..]) ? }
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								eprintln("Invalid action '$action'.")
 | 
				
			||||||
 | 
								exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue