#!/bin/sh stage() { STAGE="$1" echo echo starting stage: $STAGE } end_stage() { if [ $? -ne 0 ]; then >&2 echo error at \'$STAGE\' exit 1 fi echo finished stage: $STAGE ✓ echo } module() { mkdir -p /caddy cd /caddy # build dir cat > go.mod < main.go < 0 { rule.Path = args[0] } for i := 1; i < len(args); i++ { if !anyOrigins { rule.Conf.AllowedOrigins = nil } rule.Conf.AllowedOrigins = append(rule.Conf.AllowedOrigins, strings.Split(args[i], ",")...) anyOrigins = true } for c.NextBlock() { switch c.Val() { case "origin": if !anyOrigins { rule.Conf.AllowedOrigins = nil } args := c.RemainingArgs() for _, domain := range args { rule.Conf.AllowedOrigins = append(rule.Conf.AllowedOrigins, strings.Split(domain, ",")...) } anyOrigins = true case "origin_regexp": if arg, err := singleArg(c, "origin_regexp"); err != nil { return nil, err } else { r, err := regexp.Compile(arg) if err != nil { return nil, c.Errf("could no compile regexp: %s", err) } if !anyOrigins { rule.Conf.AllowedOrigins = nil anyOrigins = true } rule.Conf.OriginRegexps = append(rule.Conf.OriginRegexps, r) } case "methods": if arg, err := singleArg(c, "methods"); err != nil { return nil, err } else { rule.Conf.AllowedMethods = arg } case "allow_credentials": if arg, err := singleArg(c, "allow_credentials"); err != nil { return nil, err } else { var b bool if arg == "true" { b = true } else if arg != "false" { return nil, c.Errf("allow_credentials must be true or false.") } rule.Conf.AllowCredentials = &b } case "max_age": if arg, err := singleArg(c, "max_age"); err != nil { return nil, err } else { i, err := strconv.Atoi(arg) if err != nil { return nil, c.Err("max_age must be valid int") } rule.Conf.MaxAge = i } case "allowed_headers": if arg, err := singleArg(c, "allowed_headers"); err != nil { return nil, err } else { rule.Conf.AllowedHeaders = arg } case "exposed_headers": if arg, err := singleArg(c, "exposed_headers"); err != nil { return nil, err } else { rule.Conf.ExposedHeaders = arg } default: return nil, c.Errf("Unknown cors config item: %s", c.Val()) } } rules = append(rules, rule) } return rules, nil } func singleArg(c *caddy.Controller, desc string) (string, error) { args := c.RemainingArgs() if len(args) != 1 { return "", c.Errf("%s expects exactly one argument", desc) } return args[0], nil } EOF # setup module # go mod init caddy go get github.com/caddyserver/caddy } # check for modules support # export GO111MODULE=on # add plugins and telemetry stage "customising plugins and telemetry" module end_stage # build stage "building caddy" go build -o caddy end_stage # copy binary stage "copying binary" mkdir -p /install \ && mv caddy /install \ && /install/caddy -version end_stage echo "installed caddy version at /install/caddy"