forked from vieter-v/vieter
Merge pull request 'cli tool to manage git repos' (#103) from repos-api into dev
Reviewed-on: Chewing_Bever/vieter#103cron
commit
d94b797556
|
@ -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