Skip to content

Commit

Permalink
chore: Upgrade Go version + Update code tree
Browse files Browse the repository at this point in the history
  • Loading branch information
achetronic committed Nov 16, 2024
1 parent c604309 commit d21c24b
Show file tree
Hide file tree
Showing 13 changed files with 420 additions and 974 deletions.
97 changes: 97 additions & 0 deletions .github/workflows/release-binaries.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
name: Compile into binaries

on:
release:
types: [created]

workflow_dispatch:
inputs:
release:
description: 'Release tag where to create the binaries (as SemVer vX.X.X)'
required: true
default: v0.1.0

permissions:
contents: write
packages: write

jobs:
releases-matrix:
name: Release Go Binary
runs-on: ubuntu-latest
strategy:
matrix:
# build and publish in parallel:
# linux/386, linux/amd64, linux/arm64, darwin/amd64, darwin/arm64
goos: [linux, darwin]
goarch: ["386", amd64, arm64]
exclude:
- goos: darwin
goarch: "386"

steps:
- id: read_tag
name: "Read release tag name (mostly vx.x.x)"
run: |
if [ "${{ github.event_name }}" = "release" ]; then
export TAG="${{ github.ref_name }}"
elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
export TAG="${{ inputs.release }}"
fi
echo "release_tag=${TAG}" >> "$GITHUB_OUTPUT"
- uses: actions/checkout@v3
with:
ref: ${{ steps.read_tag.outputs.release_tag }}

- name: "Read Go version from go.mod"
id: read_go_version
run: |
go_version_raw=$(grep "^go " go.mod | awk '{print $2}')
echo "go_version=${go_version_raw}" >> "$GITHUB_OUTPUT"
- uses: actions/setup-go@v5
with:
go-version: '${{ steps.read_go_version.outputs.go_version }}'

- name: "Build binary"
id: build_binary
run: |
printf "GOOS: %s, GOARCH: %s\n" "${{ matrix.goos }}" "${{ matrix.goarch }}"
export GOOS=${{ matrix.goos }}
export GOARCH=${{ matrix.goarch }}
export CGO_ENABLED=0
make build
- name: "Craft package and its signature"
id: build_package
run: |
export GOOS=${{ matrix.goos }}
export GOARCH=${{ matrix.goarch }}
export PACKAGE_NAME=nsmurder-${{ steps.read_tag.outputs.release_tag }}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
make package
make package-signature
echo "package_name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT"
- name: "Upload package to release"
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: dist/${{ steps.build_package.outputs.package_name }}
asset_name: ${{ steps.build_package.outputs.package_name }}
tag: ${{ steps.read_tag.outputs.release_tag }}
overwrite: true

- name: "Upload package signature to release"
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: dist/${{ steps.build_package.outputs.package_name }}.md5
asset_name: ${{ steps.build_package.outputs.package_name }}.md5
tag: ${{ steps.read_tag.outputs.release_tag }}
overwrite: true
30 changes: 0 additions & 30 deletions .github/workflows/release.yaml

This file was deleted.

27 changes: 27 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/*
dist/*
Dockerfile.cross

# Test binary, build with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Kubernetes Generated files - skip generated files, except for vendored files

!vendor/**/zz_generated.*

# editor and IDE paraphernalia
.idea
.vscode
*.swp
*.swo
*~
107 changes: 107 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@

# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
else
GOBIN=$(shell go env GOBIN)
endif

OS=$(shell uname | tr '[:upper:]' '[:lower:]')

# Setting SHELL to bash allows bash commands to be executed by recipes.
# Options are set to exit when a recipe line exits non-zero or a piped command fails.
SHELL = /usr/bin/env bash -o pipefail
.SHELLFLAGS = -ec

.PHONY: all
all: build

##@ General

# The help target prints out all targets with their descriptions organized
# beneath their categories. The categories are represented by '##@' and the
# target descriptions by '##'. The awk command is responsible for reading the
# entire set of makefiles included in this invocation, looking for lines of the
# file as xyz: ## something, and then pretty-format the target and help. Then,
# if there's a line with ##@ something, that gets pretty-printed as a category.
# More info on the usage of ANSI control characters for terminal formatting:
# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters
# More info on the awk command:
# http://linuxcommand.org/lc3_adv_awk.php

.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

##@ Development

.PHONY: fmt
fmt: ## Run go fmt against code.
go fmt ./...

.PHONY: vet
vet: ## Run go vet against code.
go vet ./...

GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
GOLANGCI_LINT_VERSION ?= v1.54.2
golangci-lint:
@[ -f $(GOLANGCI_LINT) ] || { \
set -e ;\
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell dirname $(GOLANGCI_LINT)) $(GOLANGCI_LINT_VERSION) ;\
}

.PHONY: lint
lint: golangci-lint ## Run golangci-lint linter & yamllint
$(GOLANGCI_LINT) run

.PHONY: lint-fix
lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes
$(GOLANGCI_LINT) run --fix

##@ Build

.PHONY: check-go-target
check-go-target: ## Check presence of GOOS and GOARCH vars.
@if [ -z "$(GOOS)" ]; then \
echo "GOOS is not defined. Define GOOS y try again."; \
exit 1; \
fi
@if [ -z "$(GOARCH)" ]; then \
echo "GOARCH is not defined. Define GOARCH y try again."; \
exit 1; \
fi

check-cgo-switch: ## Check presence of CGO_ENABLED var.
@if [ -z "$(CGO_ENABLED)" ]; then \
echo "CGO_ENABLED is not defined. Define CGO_ENABLED y try again."; \
exit 1; \
fi

.PHONY: build
build: fmt vet check-go-target check-cgo-switch ## Build CLI binary.
go build -o bin/nsmurder-$(GOOS)-$(GOARCH) cmd/main.go

.PHONY: run
run: fmt vet ## Run a CLI from your host.
go run ./cmd/main.go

PACKAGE_NAME ?= package.tar.gz
.PHONY: package
package: check-go-target ## Package binary.
@printf "\nCreating package at dist/$(PACKAGE_NAME) \n"
@mkdir -p dist

@if [ "$(OS)" = "linux" ]; then \
tar --transform="s/nsmurder-$(GOOS)-$(GOARCH)/nsmurder/" -cvzf dist/$(PACKAGE_NAME) -C bin nsmurder-$(GOOS)-$(GOARCH) -C ../ LICENSE README.md; \
elif [ "$(OS)" = "darwin" ]; then \
tar -cvzf dist/$(PACKAGE_NAME) -s '/nsmurder-$(GOOS)-$(GOARCH)/nsmurder/' -C bin nsmurder-$(GOOS)-$(GOARCH) -C ../ LICENSE README.md; \
else \
echo "Unsupported OS: $(GOOS)"; \
exit 1; \
fi

.PHONY: package-signature
package-signature: ## Create a signature for the package.
@printf "\nCreating package signature at dist/$(PACKAGE_NAME).md5 \n"
md5sum dist/$(PACKAGE_NAME) | awk '{ print $$1 }' > dist/$(PACKAGE_NAME).md5
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Nsmurder

![GitHub go.mod Go version (subdirectory of monorepo)](https://img.shields.io/github/go-mod/go-version/achetronic/nsmurder)
![GitHub](https://img.shields.io/github/license/achetronic/nsmurder)

![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCeSb3yfsPNNVr13YsYNvCAw?label=achetronic&link=http%3A%2F%2Fyoutube.com%2Fachetronic)
![GitHub followers](https://img.shields.io/github/followers/achetronic?label=achetronic&link=http%3A%2F%2Fgithub.com%2Fachetronic)
![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/achetronic?style=flat&logo=twitter&link=https%3A%2F%2Ftwitter.com%2Fachetronic)

## Description

A CLI to assassinate Kubernetes namespaces following different strategies without mercy
Expand Down Expand Up @@ -27,11 +34,11 @@ The process followed to assassinate namespaces is described in the following ste

> There is a time between steps that can be configured using the flag `--duration-between-strategies`
1. Schedule namespace deletion for all the namespaces introduced by using the flags.
1. Schedule namespace deletion for all the namespaces introduced by using the flags.
This step is intended to identify which ones are stuck in `Terminating` state later.

2. Get a list with every resource type that can be created into a namespace.
Then loop over namespaces which are in `Terminating` status.
Then loop over namespaces which are in `Terminating` status.
For each namespace, delete all resources inside to clean it.

3. Loop over namespaces which are still in `Terminating` state and remove their finalizers
Expand Down
15 changes: 7 additions & 8 deletions main.go → cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import (
"log"
"time"

"nsmurder/flags" // Configuration flags for the CLI
"nsmurder/kubernetes" // Requests against Kubernetes API
"nsmurder/manager" // Requests against Kubernetes API
"nsmurder/internal/flags" // Configuration flags for the CLI
"nsmurder/internal/kubernetes" // Requests against Kubernetes API
"nsmurder/internal/manager" // Requests against Kubernetes API
)

const (
Expand All @@ -30,7 +30,6 @@ const (

var inputFlags flags.FlagsSpec

//
func main() {
ctx := context.Background()

Expand All @@ -56,15 +55,15 @@ func main() {

err := client.SetClients()
if err != nil {
log.Printf(KubernetesGetClientErrorMessage, err)
log.Printf(KubernetesGetClientErrorMessage, err.Error())
return
}

// 3. Schedule namespaces deletion
log.Print(ScheduleNamespaceDeletionMessage)
err = nsManager.ScheduleNamespaceDeletion(ctx, client)
if err != nil {
log.Printf(ScheduleNamespaceDeletionErrorMessage, err)
log.Printf(ScheduleNamespaceDeletionErrorMessage, err.Error())
return
}

Expand All @@ -76,7 +75,7 @@ func main() {
log.Print(DeleteOrphanApisMessage)
err = kubernetes.DeleteOrphanApiServices(ctx, client.Dynamic)
if err != nil {
log.Printf(DeleteOrphanApisErrorMessage, err)
log.Printf(DeleteOrphanApisErrorMessage, err.Error())
return
}

Expand All @@ -88,7 +87,7 @@ func main() {
log.Print(CleanResourcesMessage)
err = manager.CleanStuckNamespaces(ctx, client)
if err != nil {
log.Printf(CleanResourcesErrorMessage, err)
log.Printf(CleanResourcesErrorMessage, err.Error())
return
}

Expand Down
Loading

0 comments on commit d21c24b

Please sign in to comment.