Ai
5 Star 6 Fork 4

zstackio/zstack-vyos

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
package.go 4.19 KB
一键复制 编辑 原始数据 按行查看 历史
shixin.ruan 提交于 2024-07-08 14:31 +08:00 . [root]: use openeuler image for vpc
package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path"
"text/template"
"zstack-vyos/utils"
)
var (
configPath string
config Config
)
type (
ProjectConfig struct {
Dir *string `json:"dir"`
Installer *string `json:"installer"`
Location *string `json:"location"`
Env string `json:"env"`
}
Config struct {
Projects map[string]ProjectConfig `json:"projects"`
}
Project struct {
name string
config ProjectConfig
}
)
func NewProject(name string, config ProjectConfig) *Project {
p := &Project{name: name, config: config}
return p
}
func (project *Project) checkConfig() {
if project.config.Dir == nil {
panic(fmt.Errorf("missing parameter[dir] of the project[%s]", project.name))
}
if project.config.Installer == nil {
panic(fmt.Errorf("missing parameter[installer] of the project[%s]", project.name))
}
if project.config.Location == nil {
panic(fmt.Errorf("missing parameter[location] of the project[%s]", project.name))
}
}
func (project *Project) build() {
project.checkConfig()
script := `#!/bin/bash
set -e
cwd=$(pwd)
tmpdir=$(mktemp -d)
targetdir="$tmpdir/target"
mkdir -p $targetdir
datatar="$targetdir/data.tar.gz"
targettar="$tmpdir/target.tar.gz"
tar czf $datatar -C $cwd/{{.Dir}} .
cp {{.Installer}} $targetdir
tar cf $targettar -C $targetdir/ .
cat >> $tmpdir/setup.sh <<'EOF'
#!/bin/bash
PATH=/bin:/usr/bin
params=$@
set -- $(getopt -o V -l version -q -- "$@")
while :
do
[ -z "$1" ] && break;
case "$1" in
-V|--version ) PRINT_VERSION='y' && params=(${params[*]/$1});shift;;
-- ) shift;;
esac
done
if [ ! -z "$PRINT_VERSION" ]; then
echo -en "{{.VersionInfo}}"
exit 0
fi
line=$(wc -l $0 | awk '{print $1}')
line=$((line - 26))
tmpdir=/home/zstack/zvr/target
rm -rf $tmpdir
mkdir -p $tmpdir
tail -n $line $0 | tar x -C $tmpdir
cd $tmpdir
{{.Env}} bash -x {{.InstallScript}} ${params[*]}
ret=$?
rm -rf $tmpdir
exit $ret
EOF
mkdir -p $(dirname {{.BinaryPath}})
cat $tmpdir/setup.sh $targettar > {{.BinaryPath}}
chmod a+x {{.BinaryPath}}
rm -rf $tmpdir
`
utils.ModuleName = project.name
binaryPath := fmt.Sprintf("%s/%s.bin", *project.config.Location, project.name)
context := map[string]string{
"Dir": *project.config.Dir,
"Installer": *project.config.Installer,
"BinaryPath": binaryPath,
"InstallScript": path.Base(*project.config.Installer),
"Env": project.config.Env,
"VersionInfo": utils.GetBuildInfo(),
}
tmpl, err := template.New("script").Parse(script)
if err != nil {
panic(err)
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, context)
if err != nil {
panic(err)
}
if out, err := exec.Command("sh", "-c", buf.String()).CombinedOutput(); err != nil {
panic(fmt.Errorf("failed to execute script:\n%s\n%s\n%s", buf.String(), out, err))
} else {
fmt.Println(string(out))
}
fmt.Println(fmt.Sprintf("successfully built the project [%s] to %s", project.name, binaryPath))
}
func init() {
flag.StringVar(&configPath, "conf", "", "path to the configuration file")
flag.StringVar(&utils.Version, "version", "", "version for build")
flag.StringVar(&utils.GitInfo, "gitInfo", "", "git info for build")
flag.StringVar(&utils.User, "user", "", "git user for build")
flag.StringVar(&utils.Time, "time", "", "time for build")
flag.StringVar(&utils.Platform, "platform", "", "target platform for build")
flag.StringVar(&utils.GoVersion, "goVersion", "", "go version for build")
flag.Parse()
if flag.NArg() > 0 {
flag.Usage()
fmt.Printf("unknown options %v\n", flag.Args())
os.Exit(1)
}
if configPath == "" {
flag.Usage()
fmt.Printf("option [-conf] is required and cannot be an empty string\n")
os.Exit(1)
}
}
func build() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}()
f, err := ioutil.ReadFile(configPath)
if err != nil {
panic(fmt.Errorf("unable to read the config file[%s], %s", configPath, err))
}
config := Config{}
err = json.Unmarshal(f, &config)
if err != nil {
panic(fmt.Errorf("unable to JSON unmarshal the config file[%s], %s", configPath, err))
}
for key, value := range config.Projects {
p := NewProject(key, value)
p.build()
}
}
func main() {
build()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zstackio/zstack-vyos.git
git@gitee.com:zstackio/zstack-vyos.git
zstackio
zstack-vyos
zstack-vyos
master

搜索帮助