mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-11 19:16:32 +00:00
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package build
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/sha1"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// createUID is a helper function that will
|
|
// create a random, unique identifier.
|
|
func createUID() string {
|
|
c := sha1.New()
|
|
r := createRandom()
|
|
io.WriteString(c, string(r))
|
|
s := fmt.Sprintf("%x", c.Sum(nil))
|
|
return "drone-" + s[0:10]
|
|
}
|
|
|
|
// createRandom creates a random block of bytes
|
|
// that we can use to generate unique identifiers.
|
|
func createRandom() []byte {
|
|
k := make([]byte, sha1.BlockSize)
|
|
if _, err := io.ReadFull(rand.Reader, k); err != nil {
|
|
return nil
|
|
}
|
|
return k
|
|
}
|
|
|
|
// list of service aliases and their full, canonical names
|
|
var defaultServices = map[string]string{
|
|
"cassandra": "relateiq/cassandra:latest",
|
|
"couchdb": "bradrydzewski/couchdb:1.5",
|
|
"elasticsearch": "bradrydzewski/elasticsearch:0.90",
|
|
"memcached": "bradrydzewski/memcached",
|
|
"mongodb": "bradrydzewski/mongodb:2.4",
|
|
"mysql": "bradrydzewski/mysql:5.5",
|
|
"neo4j": "bradrydzewski/neo4j:1.9",
|
|
"postgres": "bradrydzewski/postgres:9.1",
|
|
"redis": "bradrydzewski/redis:2.8",
|
|
"rabbitmq": "bradrydzewski/rabbitmq:3.2",
|
|
"riak": "guillermo/riak:latest",
|
|
"zookeeper": "jplock/zookeeper:3.4.5",
|
|
}
|
|
|
|
// parseImageName parses a Docker image name, in the format owner/name:tag,
|
|
// and returns each segment.
|
|
//
|
|
// If the owner is blank, it is assumed to be an official drone image,
|
|
// and will be prefixed with the appropriate owner name.
|
|
//
|
|
// If the tag is empty, it is assumed to be the latest version.
|
|
func parseImageName(image string) (owner, name, tag string) {
|
|
owner = "bradrydzewski" // this will eventually change to drone
|
|
name = image
|
|
tag = "latest"
|
|
|
|
// first we check to see if the image name is an alias
|
|
// for a known service.
|
|
//
|
|
// TODO I'm not a huge fan of this code here. Maybe it
|
|
// should get handled when the yaml is parsed, and
|
|
// convert the image and service names in the yaml
|
|
// to fully qualified names?
|
|
if cname, ok := defaultServices[image]; ok {
|
|
name = cname
|
|
}
|
|
|
|
parts := strings.Split(name, "/")
|
|
if len := len(parts); len == 3 {
|
|
owner = fmt.Sprintf("%s/%s", parts[0], parts[1])
|
|
name = parts[2]
|
|
} else if len == 2 {
|
|
owner = parts[0]
|
|
name = parts[1]
|
|
}
|
|
|
|
parts = strings.Split(name, ":")
|
|
if len(parts) == 2 {
|
|
name = parts[0]
|
|
tag = parts[1]
|
|
}
|
|
|
|
return
|
|
}
|