Skip to content

Instantly share code, notes, and snippets.

@jhinrichsen
Created April 12, 2018 11:27
Show Gist options
  • Save jhinrichsen/68b7bfe4262eb145805e75cfcc8495ac to your computer and use it in GitHub Desktop.
Save jhinrichsen/68b7bfe4262eb145805e75cfcc8495ac to your computer and use it in GitHub Desktop.
Jenkins: find jobs without a corresponding config.xml (can happen if Jenkins gets bent out of shape)
package main
import (
"flag"
"fmt"
"log"
"os"
"path"
)
func main() {
// 'delete' is a builtin
var remove = flag.Bool("remove", false, "Delete broken directories")
flag.Parse()
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s <options> "+
"<Jenkins job directory>\nOptions:\n",
os.Args[0])
flag.PrintDefaults()
}
if flag.NArg() != 1 {
flag.Usage()
os.Exit(1)
}
dir := flag.Arg(0)
log.Printf("checking %s\n", dir)
orphaned := missingConfig(dir)
for _, dir := range orphaned {
fmt.Println(dir)
if *remove {
log.Printf("removing %s\n", dir)
err := os.RemoveAll(dir)
if err != nil {
log.Fatal(err)
}
}
}
}
// check returns list of directory entries w/o a corresponding config.xml
func missingConfig(jobdir string) []string {
// ioutil's ReadDir is a bit useless because it does not carry the
// complete path to the file, only Name()
f, err := os.Open(jobdir)
if err != nil {
log.Fatal(err)
}
names, err := f.Readdirnames(-1)
if err != nil {
log.Fatal(err)
}
var broken []string
for _, file := range names {
p := path.Join(jobdir, file)
if !hasConfig(p) {
broken = append(broken, p)
}
}
return broken
}
func hasConfig(dir string) bool {
var exists bool
config := path.Join(dir, "config.xml")
log.Printf("checking %s\n", config)
_, err := os.Stat(config)
if os.IsNotExist(err) {
exists = false
} else if err != nil {
log.Fatal(err)
} else {
exists = true
}
log.Printf("config %s exists: %v\n", config, exists)
return exists
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment