作者: 边城元元


引言

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 Package 组件能力集成到 TiUP Mirror Pack_tidb



结语

通过以上步骤,我们成功地将 TiUP 的包能力集成到了 TiUP Mirror Pack 中,并创建了一个自定义的组件。这为管理和分发自定义 TiDB 组件提供了极大的便利。希望这篇技术分享能够帮助到需要进行类似操作的开发者。


请注意,以上内容是根据您提供的代码片段和指令进行整理和润色的,可能需要根据实际情况进行调整。在实际操作中,请确保遵循最佳实践和安全指南。