!61 启动时能够自动启动act_runner

Merge pull request !61 from vecmatex/feature_add_runner
This commit is contained in:
孟宁
2025-02-20 01:28:04 +00:00
repo.diff.committed_by Gitee
repo.diff.parent 635238b3b7 c944cd0e2a
repo.diff.commit 72e38d0913
repo.diff.stats_desc%!(EXTRA int=6, int=147, int=2)

repo.diff.view_file

@@ -64,7 +64,7 @@ func CreateDevcontainer(ctx *context.Context, newDevContainer *CreateDevcontaine
return nil
}
func createAndStartContainer(cli *client.Client, opts *devcontainer_dto.CreateDevcontainerOptions) (string, error) {
err := docker_module.CreateAndStartContainer(cli, opts.Image, opts.CommandList,
err := docker_module.CreateAndStartContainer(cli, opts.Image, opts.CommandList, nil, nil,
nat.PortSet{"22/tcp": struct{}{}, "7681/tcp": struct{}{}}, opts.Name)
if err != nil {
return "", fmt.Errorf("创建或启动容器失败: %v", err)

120
services/runner/runner.go Normal file
repo.diff.view_file

@@ -0,0 +1,120 @@
package runner
import (
"context"
"fmt"
"net"
"strings"
"time"
actions_module "code.gitea.io/gitea/models/actions"
docker_module "code.gitea.io/gitea/modules/docker"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
)
func RegistGlobalRunner(ctx context.Context) error {
log.Info("获取全局RunnerToken...")
actionRunnerToken, err := actions_module.NewRunnerToken(ctx, 0, 0)
if err != nil {
return fmt.Errorf("获取全局RunnerToken失败:%v", err)
}
runnerCount := setting.Runner.Count
for i := 0; i < runnerCount; i++ {
err := RegistRunner(&ctx, actionRunnerToken.Token)
if err != nil {
return fmt.Errorf("注册Runner失败:%v", err)
}
}
return nil
}
func RegistRunner(ctx *context.Context, token string) error {
log.Info("开始注册Runner...")
cli, err := docker_module.CreateDockerClient(ctx)
if err != nil {
return err
}
defer cli.Close()
//拉取act_runner镜像
dockerHost, err := docker_module.GetDockerSocketPath()
if err != nil {
return fmt.Errorf("获取docker socket路径失败:%v", err)
}
// 拉取镜像
err = docker_module.PullImage(cli, dockerHost, setting.Runner.Image)
if err != nil {
return fmt.Errorf("拉取act_runner镜像失败:%v", err)
}
//获取本机IP
ips, err := getLocalIP()
if err != nil {
return fmt.Errorf("获取本机IP失败:%v", err)
}
//获取InstanceUrl
conntype := strings.Split(setting.AppURL, "://")[0]
port := setting.HTTPPort
instanceURL := conntype + "://" + ips[0] + ":" + port
timestamp := time.Now().Format("20060102150405")
//Runner配置
env := []string{
"GITEA_INSTANCE_URL=" + instanceURL,
"GITEA_RUNNER_REGISTRATION_TOKEN=" + token,
"GITEA_RUNNER_NAME=runner-" + timestamp,
}
binds := []string{
"/var/run/docker.sock:/var/run/docker.sock",
}
containerName := "runner-" + timestamp
//创建并启动Runner容器
err = docker_module.CreateAndStartContainer(cli, setting.Runner.Image, nil, env, binds, nil, containerName)
if err != nil {
return fmt.Errorf("创建并注册Runner失败:%v", err)
}
return nil
}
func getLocalIP() ([]string, error) {
var ips []string
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range interfaces {
if iface.Flags&net.FlagUp == 0 ||
iface.Flags&net.FlagLoopback != 0 {
continue
}
addrs, err := iface.Addrs()
if err != nil {
continue
}
// 遍历地址列表
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip == nil || ip.IsLoopback() {
continue
}
ip = ip.To4()
if ip == nil {
continue // 非IPv4地址
}
ips = append(ips, ip.String())
}
}
if len(ips) == 0 {
return nil, fmt.Errorf("no valid IP address found")
}
return ips, nil
}