CORScapade; the story why cty doesn't support git flow on web

CORScapade; the story why cty doesn’t support git flow on web Recently, I implemented git based discovery for cty. It means, that the user can provide a git repo URL and cty will clone the content and look for any valid CRDs and discover them. I wanted ot provide this through the front-end as well. However, I ran into some issues… CORS Plain HTTP requests are working fine only if raw.githubusercontent.com is being used. That service doesn’t have CORS. ...

January 7, 2025 · 3 min · hannibal

Using ORAS as a library to interact with OCI repositories

Introducing ORAS into a Library This post talks about using ORAS as a library to interact with OCI repositories. First and foremost I like to keep things simple. I was seeing basic usages around the project I’m working in and some common behaviour that started to emerge. Looking at that behaviour I drawn a preliminary interface. This interface is also something similar that docker remote implementation has in containerd. Looks something like this: ...

January 6, 2025 · 10 min · hannibal

Write something every day

This year I want to do somerhinf different. For the whole year I’ll attempt to write a blogpost everyday. I might miss a day during holiday or being sick or something but the point is that by the end of the year I should have at least 365 blog posts. I also want them to be somewhat meaningful so be about some kind of technology or discovery or whatever. So posts like ‘This is a post’ are not valid. ...

January 5, 2025 · 1 min · hannibal

Add Suggest Edit to Posts

Added Suggest Edit to Post link to all my posts I added “Suggest edit” to all my posts in a way to open my blob to the community. I accept all kinds of contriubtions be they simple grammar fixes or more accurate descriptions of something. Feel free to suggest changes. I’m also toying with the idea of accepting completely new content but that remains to be seen. Thank you, and have a happy new year! ...

January 2, 2025 · 1 min · hannibal

Quickly delete all packages from GitHub registry using a blob

Script to remove GitHub registry images Hey, though I quickly just share a script to get rid of packages you don’t want anymore from your GitHub registry. #!/bin/bash set -e # Variables OWNER=$1 # Replace with your GitHub username or organization name PACKAGE_GLOB=$2 # Glob pattern for package names passed as an argument (e.g., "package*" to match all) # makes sure that important packages are not removed by accident contains() { found=1 array=(place-very-important-packages-here-to-make-sure-they-are-not-deleted) for v in "${array[@]}" do if [[ "$1" == "$v" ]]; then echo "$v found not deleting" found=0 break fi done } # Function to delete a package version delete_package_version() { contains "$1" # echo "found: $found" if [[ $found -eq 1 ]]; then name=${1//\//%2F} echo "deleting package with name: $name" gh api -X DELETE "/user/packages/container/$name" --silent fi } # Fetch the list of all available packages for the user/organization echo "Fetching packages matching the glob pattern '$PACKAGE_GLOB'..." # Fetch all package names and filter with globbing # Change `/users/` to `organization` if you are looking at organization packages. ALL_PACKAGES=$(gh api "/users/$OWNER/packages?package_type=container" --jq '.[].name' --paginate) MATCHED_PACKAGES=$(echo "$ALL_PACKAGES" | grep "$PACKAGE_GLOB") if [[ -z "$MATCHED_PACKAGES" ]]; then echo "No packages found matching the pattern '$PACKAGE_GLOB'." exit 1 fi # echo "Deleting the following packages: ${MATCHED_PACKAGES}" # Loop through matched packages and delete them SAVEIFS=$IFS # Save current IFS (Internal Field Separator) IFS=$'\n' # Change IFS to newline char packages=($MATCHED_PACKAGES) # split the `names` string into an array by the same name IFS=$SAVEIFS # Restore original IFS for (( i=0; i<${#packages[@]}; i++ )) do delete_package_version "${packages[$i]}" done echo "All matching packages deleted!" That is all. ...

December 10, 2024 · 2 min · hannibal

Test Post - Please ignore

Hello This is just a test post to see if I did my hugo build correctly.

November 14, 2024 · 1 min · hannibal

How I track tasks with Obsidian

How I track tasks with Obsidian Hello. This will be a run-down on how I track tasks and projects and long-term things, like reading a book, tracking a project or traveling using the PARA method. Let’s get to it! Task tracking queue The way I track tasks is through a queuing system. To not get overloaded by tasks, I just simply put the next task into the queue and take out the top recent if I’m done. Unless something really urgent comes along I don’t disrupt this flow. Meaning, once I have a task out and #active that’s the task I’m going to be working on! ...

September 17, 2024 · 6 min · hannibal

Update your CRDs with confidence

Update your CRDs with confidence Hello. I would like to write about a release for crd-to-sample-yaml1. It’s the release version v0.8.02. This version brings with it a feature to test the validity of your CRD changes. It means that if you change your CRD it will test if the changes do not break working samples of that version. This is achieved by a helm unittest type of YAML based test scenarios and snapshot generation. ...

August 21, 2024 · 2 min · hannibal

Using cert-manager as a subchart for your own Helm Chart

Using cert-manager as a subchart Hello. In today’s post, I would like to show how to set up cert-manager as a subchart. Not only that, but also, how to add a Job to make sure that cert-manager is installed and its webhook is up and running so it can process any Issuers that are going to be applied with your own chart. Let’s get to it. Defining a subchart To define a subchart, simply add it as a dependency in your Charts.yaml like this: ...

July 2, 2024 · 4 min · hannibal

Discoverable functional options pattern

Hello. Today’s will be a quick post. Everyone knows and loves/hates functional options1 in Go. The biggest gripe people get with it is, that the options aren’t discoverable and that there is no IDE support for nicely auto-completing options. My thought about this was that, what if we would just hang it on a struct? Let’s see how that looks. Consider this normal server builder with options: type Server struct { Name string Address string Port int } func WithName(name string) ServerOptFn { return func(s *Server) { s.Name = name } } func WithAddress(address string) ServerOptFn { return func(s *Server) { s.Address = address } } func WithPort(port int) ServerOptFn { return func(s *Server) { s.Port = port } } type ServerOptFn func(*Server) func NewServer(opts ...ServerOptFn) *Server { s := &Server{} for _, o := range opts { o(s) } return s } Now, what if you would like to retain the niceness of the clean options pattern where you don’t have to specify and empty struct but still could use a struct to gather the options together? ...

July 1, 2024 · 2 min · hannibal