fastnetmon-ng/src/ci/parallel_builder.go
2017-12-03 21:22:11 +00:00

201 lines
5.9 KiB
Go

package main
import "fmt"
import "sync"
import "os"
import "bytes"
import "os/exec"
import "regexp"
import "log"
import "strconv"
import "io/ioutil"
// In this folder we will store all results of our work
var target_directory = ""
var public_key_path = "/root/.ssh/id_rsa.pub"
var container_private_path = "/vz_zram/private"
/*
Download all images
vztmpl-dl --update centos-6-x86_64 centos-6-x86 centos-7-x86_64 debian-7.0-x86 debian-7.0-x86_64 debian-8.0-x86_64 ubuntu-12.04-x86 ubuntu-12.04-x86_64 ubuntu-14.04-x86 ubuntu-14.04-x86_64 debian-6.0-x86_64
Please configure NAT before:
Fix /etc/modprobe.d/openvz.conf to following content:
options nf_conntrack ip_conntrack_disable_ve0=0
vim /etc/sysct.conf
Uncomment:
net.ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -s 10.10.10.1/24 -o eth0 -j SNAT --to 192.168.0.241
Save iptables config
/etc/init.d/iptables save
Enable iptables:
chkconfig iptables on
Generate ssh key:
ssh-keygen -t rsa -q -f /root/.ssh/id_rsa -P ""
Disable quotas:
vim /etc/vz/vz.conf
# Disable quota
DISK_QUOTA=no
Create zram disk for build speedup:
modprobe zram num_devices=1
echo $((20*1024*1024*1024)) > /sys/block/zram0/disksize
mkdir /vz_zram
mkfs.ext4 /dev/zram0
mount /dev/zram0 /vz_zram
mkdir /vz_zram/private
*/
/*
For renaming of result packages you could use:
find -type f| perl -e 'do{ chomp; my @m=split "/", $_; my @n = split /\./, $_; rename($_, "fastnetmon-git-447aa5b86bb5a248e310c15a4d5945e72594d6cf-$m[1]_x86_64.$n[-1]"); } for <>'
*/
var distros_x86_64 = []string{"centos-6-x86_64", "centos-7-x86_64", "debian-6.0-x86_64", "debian-7.0-x86_64", "debian-8.0-x86_64", "ubuntu-12.04-x86_64", "ubuntu-14.04-x86_64"}
var distros_x86 = []string{"centos-6-x86", "debian-6.0-x86", "debian-7.0-x86", "ubuntu-12.04-x86", "ubuntu-14.04-x86"}
var start_ctid_number = 1000
func main() {
target_directory, err := ioutil.TempDir("/root", "builded_packages")
if err != nil {
log.Fatal("Can't create temp folder", err)
}
fmt.Println("We will store result data to folder", target_directory)
_ = distros_x86
var wg sync.WaitGroup
if _, err := os.Stat(public_key_path); os.IsNotExist(err) {
log.Fatal("Please generate ssh keys for root here")
}
for element_number, distro := range distros_x86_64 {
// Increment the WaitGroup counter.
wg.Add(1)
go func(position int, distribution_name string) {
// Decrement the counter when the goroutine completes.
defer wg.Done()
ip_address := fmt.Sprintf("10.10.10.%d", position)
ctid := start_ctid_number + position
ctid_as_string := strconv.Itoa(ctid)
vzctl_create_as_string := fmt.Sprintf("create %d --ostemplate %s --config vswap-4g --layout simfs --ipadd %s --diskspace 20G --hostname ct%d.test.com --private %s/%d", ctid, distribution_name, ip_address, ctid, container_private_path, ctid)
r := regexp.MustCompile("[^\\s]+")
vzctl_create_as_list := r.FindAllString(vzctl_create_as_string, -1)
fmt.Println("Create container ", ctid_as_string)
create_cmd := exec.Command("/usr/sbin/vzctl", vzctl_create_as_list...)
//cmd.Stdout = os.Stdout
//cmd.Stderr = os.Stderr
err := create_cmd.Run()
if err != nil {
log.Println("create failed")
log.Fatal(err)
}
// Run it
fmt.Println("Start container ", ctid_as_string)
// We whould wait here for full CT startup
start_cmd := exec.Command("/usr/sbin/vzctl", "start", ctid_as_string, "--wait")
// start_cmd.Stdout = os.Stdout
// start_cmd.Stderr = os.Stderr
err = start_cmd.Run()
if err != nil {
log.Println("start failed")
log.Fatal(err)
}
vzroot_path := fmt.Sprintf("/vz/root/%d", ctid)
auth_keys_path := vzroot_path + "/root/.ssh/authorized_keys"
os.Mkdir(vzroot_path+"/root/.ssh", 0600)
copy_key_command := exec.Command("cp", public_key_path, auth_keys_path)
copy_key_command.Run()
if err != nil {
log.Println("Can't copy ssh keys to container")
log.Fatal(err)
}
os.Chmod(auth_keys_path, 0400)
wget_installer_cmd := exec.Command("wget", "--no-check-certificate", "https://raw.githubusercontent.com/pavel-odintsov/fastnetmon/master/src/fastnetmon_install.pl", "-O"+vzroot_path+"/root/fastnetmon_install.pl")
wget_installer_cmd.Run()
if err != nil {
log.Println("Can't download FastNetMon installer to container")
log.Fatal(err)
}
// Remove ssh known hosst file because in other case ssh will fail
os.Remove("/root/.ssh/known_hosts")
// perl /root/fastnetmon_install.pl --use-git-master --create-binary-bundle --build-binary-environment"
// install_cmd := exec.Command("ssh", "-lroot", ip_address, "perl", "/root/fastnetmon_install.pl")
install_cmd := exec.Command("ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-lroot", ip_address, "perl", "/root/fastnetmon_install.pl", "--use-git-master", "--create-binary-bundle", "--build-binary-environment")
var stdout_output bytes.Buffer
var stderr_output bytes.Buffer
install_cmd.Stdout = &stdout_output
install_cmd.Stderr = &stderr_output
install_cmd.Run()
fmt.Println("Command call on " + distribution_name + " finished")
fmt.Println("stdout")
fmt.Println(stdout_output.String())
fmt.Println("stderr")
fmt.Println(stderr_output.String())
fmt.Println("Get produced data from container to host system")
copy_cmd := exec.Command("cp", "-rf", "/vz/root/"+ctid_as_string+"/tmp/result_data", target_directory+"/"+distribution_name)
copy_cmd.Run()
// Stop it
fmt.Println("Stop container ", ctid_as_string)
stop_cmd := exec.Command("/usr/sbin/vzctl", "stop", ctid_as_string)
err = stop_cmd.Run()
if err != nil {
log.Println("stop failed")
log.Fatal(err)
}
fmt.Println("Destroy container ", ctid_as_string)
destroy_cmd := exec.Command("/usr/sbin/vzctl", "destroy", ctid_as_string)
err = destroy_cmd.Run()
if err != nil {
log.Println("destroy failed")
log.Fatal(err)
}
}(element_number, distro)
}
wg.Wait()
}