woodpecker/cncd/pipeline/piped/once.go

98 lines
1.8 KiB
Go

package main
import (
"context"
"encoding/json"
"math"
"net/url"
"time"
"github.com/woodpecker-ci/woodpecker/cncd/pipeline/pipeline/interrupt"
"github.com/woodpecker-ci/woodpecker/cncd/pipeline/pipeline/rpc"
_ "github.com/joho/godotenv/autoload"
"github.com/urfave/cli"
)
var onceCommand = cli.Command{
Name: "once",
Usage: "execute one build",
Hidden: false,
Action: once,
Flags: []cli.Flag{
cli.StringFlag{
Name: "endpoint",
EnvVar: "PIPED_ENDPOINT,PIPED_SERVER",
Value: "ws://localhost:9999",
},
cli.StringFlag{
Name: "token",
EnvVar: "PIPED_TOKEN,PIPED_SECRET",
},
cli.DurationFlag{
Name: "backoff",
EnvVar: "PIPED_BACKOFF",
Value: time.Second * 15,
},
cli.IntFlag{
Name: "retry-limit",
EnvVar: "PIPED_RETRY_LIMIT",
Value: math.MaxInt32,
},
cli.StringFlag{
Name: "platform",
EnvVar: "PIPED_PLATFORM",
Value: "linux/amd64",
},
cli.StringFlag{
Name: "json",
EnvVar: "PIPED_JSON",
},
},
}
func once(c *cli.Context) error {
endpoint, err := url.Parse(
c.String("endpoint"),
)
if err != nil {
return err
}
client, err := rpc.NewClient(
endpoint.String(),
rpc.WithRetryLimit(
c.Int("retry-limit"),
),
rpc.WithBackoff(
c.Duration("backoff"),
),
rpc.WithToken(
c.String("token"),
),
)
if err != nil {
return err
}
defer client.Close()
ctx := context.Background()
ctx = interrupt.WithContextFunc(ctx, func() {
println("ctrl+c received, terminating process")
})
return run(ctx, &onceClient{client, c.String("json")}, rpc.NoFilter)
}
type onceClient struct {
*rpc.Client
json string
}
func (c *onceClient) Next(ctx context.Context, filter rpc.Filter) (*rpc.Pipeline, error) {
in := []byte(c.json)
out := new(rpc.Pipeline)
err := json.Unmarshal(in, out)
return out, err
}