diff --git a/.drone.yml b/.drone.yml index a649e65..946e9c1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,7 +8,7 @@ steps: - name: dockersock path: /var/run environment: - #DOCKER_BUILDKIT: 1 + DOCKER_BUILDKIT: 1 DOCKER_PASSWORD: from_secret: docker_password DOCKER_USERNAME: diff --git a/.gitignore b/.gitignore index 0fdad12..f872648 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .shuttle/ +.env diff --git a/shuttletask/ci.go b/shuttletask/ci.go new file mode 100644 index 0000000..37289a4 --- /dev/null +++ b/shuttletask/ci.go @@ -0,0 +1,91 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "path" + + "dagger.io/dagger" + "github.com/joho/godotenv" + "golang.org/x/sync/errgroup" +) + +func Ci(ctx context.Context) error { + _ = godotenv.Load() + + client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stdout)) + if err != nil { + return err + } + defer client.Close() + + drone := client. + Container(dagger.ContainerOpts{Platform: "linux/amd64"}). + From("debian"). + WithExec([]string{ + "apt", "update", + }). + WithExec([]string{ + "apt", "install", "-y", "wget", "tar", + }). + WithExec([]string{ + "wget", "https://github.com/harness/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz", + }). + WithExec([]string{ + "tar", "-xvf", "drone_linux_amd64.tar.gz", + }). + WithExec([]string{ + "mv", "drone", "/usr/local/bin", + }). + WithExec([]string{ + "drone", "--version", + }) + + _, err = drone.ExitCode(ctx) + if err != nil { + return err + } + + templates := client.Host().Directory("templates") + droneTemplates := drone. + WithEnvVariable("DRONE_SERVER", "https://ci.i.kjuulh.io"). + WithEnvVariable("DRONE_TOKEN", os.Getenv("DRONE_TOKEN")). + WithExec([]string{"drone", "info"}). + WithMountedDirectory("/mnt/templates", templates). + WithWorkdir("/mnt/templates") + + entries, err := templates.Entries(ctx) + if err != nil { + return err + } + + egrp, _ := errgroup.WithContext(ctx) + for _, entry := range entries { + entry := entry + egrp.Go(func() error { + name := path.Base(entry) + namespace := "kjuulh" + + log.Printf("running for: %s", entry) + + _, err := droneTemplates. + WithExec([]string{ + "drone", "template", "add", "--namespace", namespace, "--name", name, "--data", fmt.Sprintf("@%s", name), + }). + WithExec([]string{ + "drone", "template", "update", "--namespace", namespace, "--name", name, "--data", fmt.Sprintf("@%s", name), + }). + ExitCode(ctx) + + return err + }) + } + + if err := egrp.Wait(); err != nil { + return err + } + + return nil +} diff --git a/shuttletask/go.mod b/shuttletask/go.mod index 9f1951e..01c4b98 100644 --- a/shuttletask/go.mod +++ b/shuttletask/go.mod @@ -17,6 +17,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/iancoleman/strcase v0.2.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/shuttletask/go.sum b/shuttletask/go.sum index 7578de9..6c85582 100644 --- a/shuttletask/go.sum +++ b/shuttletask/go.sum @@ -33,6 +33,8 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= diff --git a/templates/shuttle-template.yaml b/templates/shuttle-template.yaml index 4cfdbdd..615e075 100644 --- a/templates/shuttle-template.yaml +++ b/templates/shuttle-template.yaml @@ -1,16 +1,45 @@ type: docker kind: pipeline -name: "drone-dagger-test" +name: "shuttle-drone-templates" steps: - - name: "build" - image: docker.io/kjuulh/shuttle-drone + - name: "wait for dind" + image: docker:dind volumes: - name: dockersock path: /var/run environment: DOCKER_BUILDKIT: 1 + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USERNAME: + from_secret: docker_username commands: - - sleep 5 + - ls /var/run + - set -eu + - sleep 10 + - echo "$${DOCKER_PASSWORD}" | docker login --password-stdin --username="$${DOCKER_USERNAME}" "$${DOCKER_HOST}" + - name: "build" + image: docker.io/kasperhermansen/shuttle-drone:1680894029336 + volumes: + - name: dockersock + path: /var/run + environment: + DOCKER_BUILDKIT: 1 + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USERNAME: + from_secret: docker_username + DRONE_TOKEN: + from_secret: drone_token + SSH_KEY: + from_secret: gitea_id_ed25519 + commands: + - set -eu + - eval `ssh-agent` + - mkdir -p ~/.ssh + - echo "$SSH_KEY" | base64 -d > ~/.ssh/id_ed25519 + - chmod -R 600 ~/.ssh + - ssh-add - echo "$${DOCKER_PASSWORD}" | docker login --password-stdin --username="$${DOCKER_USERNAME}" "$${DOCKER_HOST}" - shuttle run build services: