作者: 边城元元
引言
TiUP 是由 PingCAP 开发的一个 TiDB 组件管理工具,它允许用户下载和安装 TiDB 的各个组件。本文将分享如何将 TiUP 的package 能力 从 tidb-community-toolkit-v8.1.0-linux-amd64\package-v0.0.9-linux-amd64.tar.gz 、tiup 源码 server/pacakge/package.go 中集成到 tiup mirror pack 中,以便于管理和分发自定义的 TiDB 组件。
步骤一: 获取 TiUP 源码
首先,我们需要从 GitHub 上克隆 TiUP 的源代码。请确保您已经安装了 Git,并执行以下命令来克隆 TiUP 的特定版本:
git clone https://github.com/pingcap/tiup.git --depth=1 -b release-1.15 tiup1.15
步骤二:扩展 TiUP Mirror Pack 功能
接下来,我们需要在 TiUP 的源码中添加一个新的子命令,用于打包组件。打开 cmd/mirror.go
文件,并在文件末尾添加以下代码:
// packageOptions 结构体定义了打包选项
type packageOptions struct {
goos string
goarch string
dir string
name string
version string
entry string
}
// the `mirror pack` sub command
func newMirrorPackCmd() *cobra.Command {
options := packageOptions{}
rootCmd := &cobra.Command{
Use: "pack",
Short: "pack compent",
Long: `pack component to tarball.
tar -C <bindir> -czf package/<name>-<release>-<os>-<arch>.tar.gz <entry>`,
DisableFlagParsing: false,
RunE: func(cmd *cobra.Command, args []string) error {
if err := utils.MkdirAll("package", 0755); err != nil {
return err
}
// tar -czf package/{name}-{version}-{goos}-{goarch}.tar.gz target
file := fmt.Sprintf("package/%s-%s-%s-%s.tar.gz", options.name, options.version, options.goos, options.goarch)
argsNew := []string{"-czf", file}
if options.dir != "" {
argsNew = append(argsNew, "-C", options.dir)
}
cmdNew := exec.Command("tar", append(argsNew, options.entry)...)
cmdNew.Stdout = os.Stdout
cmdNew.Stderr = os.Stderr
if err := cmdNew.Run(); err != nil {
return fmt.Errorf("package target: %s", err.Error())
}
return nil
},
}
// some arguments are not used anymore, we keep them to make it compatible
// with legacy CI jobs
rootCmd.Flags().StringVar(&options.goos, "os", runtime.GOOS, "Target OS of the package")
rootCmd.Flags().StringVar(&options.goarch, "arch", runtime.GOARCH, "Target ARCH of the package")
rootCmd.Flags().StringVarP(&options.dir, "", "C", "", "Change directory before compress")
rootCmd.Flags().StringVar(&options.name, "name", "", "Name of the package (required)")
rootCmd.Flags().StringVar(&options.version, "release", "", "Version of the package (required)")
rootCmd.Flags().StringVar(&options.entry, "entry", "", "(deprecated) Entry point of the package")
_ = rootCmd.MarkFlagRequired("name")
_ = rootCmd.MarkFlagRequired("release")
return rootCmd
}
然后,在 cmd/mirror.go
文件的第 70 行下面增加一行,将新的 pack
子命令添加到 TiUP Mirror 的命令列表中:
newMirrorPackCmd(), // new pack
步骤三:编译 TiUP
现在,我们需要编译 TiUP,以确保我们的更改被正确集成。在 /tiup1.15/
目录下执行以下命令:
make build && cp -rf ./bin/tiup /root/.tiup/bin/tiup
步骤四:创建自定义组件
接下来,我们将创建一个自定义组件,并为其编写一个简单的脚本。创建一个名为 jichpack
的组件,并为其编写一个启动脚本:
cat > /component/com-jichengpack/bin/jichpack << EOF
#!/bin/sh
cur=`date +'%Y-%m-%d-%H%M'`
echo 'curtime:'$cur
echo 'this is jichpack component'
echo 'this jichpack component '$cur >>/component/com-jichengpack.txt
EOF
chmod 755 /component/com-jichengpack/bin/jichpack
步骤五:使用 TiUP Mirror Pack
现在,我们可以使用 TiUP Mirror 的新 pack
子命令来打包我们的自定义组件。在 /component/com-jichengpack/
目录下执行以下命令:
tiup mirror pack -C=bin --name=jichpack --release=1.3 --entry=jichpack
执行完毕后,使用 ls -slrt package
查看打包的文件。
结语
通过以上步骤,我们成功地将 TiUP 的包能力集成到了 TiUP Mirror Pack 中,并创建了一个自定义的组件。这为管理和分发自定义 TiDB 组件提供了极大的便利。希望这篇技术分享能够帮助到需要进行类似操作的开发者。
请注意,以上内容是根据您提供的代码片段和指令进行整理和润色的,可能需要根据实际情况进行调整。在实际操作中,请确保遵循最佳实践和安全指南。