scripts/build-pkg.py (342 lines of code) (raw):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Steps for building dist package:
# 1. install docker
# 2. build docker image
# 3. python3 scripts/build-pkg.py
# 4. packages are placed in dist/
# Steps for debug
# 1. copy & paste the docker run command with small changes:
# sudo docker run -d (-v parts) /bin/bash -c 'sleep 3600'
# 2. sudo docker ps -a to find the container id
# 3. attach to the container: sudo docker exec -it [id] bash
# 4. cd /var/ossfs/command and manually run the script
import subprocess
from subprocess import Popen, PIPE
import shlex, random, string, os, shutil, glob, ntpath, re
docker_images = {
'centos6.5:dev':'ossfs-centos6.5:dev',
'centos6.5:test':'ossfs-centos6.5:test',
'centos7.0:dev':'ossfs-centos7.0:dev',
'centos7.0:test':'ossfs-centos7.0:test',
'centos8.0:dev':'ossfs-centos8.0:dev',
'centos8.0:test':'ossfs-centos8.0:test',
'ubuntu14.04:dev':'ossfs-ubuntu14.04:dev',
'ubuntu14.04:test':'ossfs-ubuntu14.04:test',
'ubuntu16.04:dev':'ossfs-ubuntu16.04:dev',
'ubuntu16.04:test':'ossfs-ubuntu16.04:test',
'ubuntu18.04:dev':'ossfs-ubuntu18.04:dev',
'ubuntu18.04:test':'ossfs-ubuntu18.04:test',
'ubuntu20.04:dev':'ossfs-ubuntu20.04:dev',
'ubuntu20.04:test':'ossfs-ubuntu20.04:test',
'ubuntu22.04:dev':'ossfs-ubuntu22.04:dev',
'ubuntu22.04:test':'ossfs-ubuntu22.04:test',
'anolisos7.0:dev':'ossfs-anolisos7.0:dev',
'anolisos7.0:test':'ossfs-anolisos7.0:test',
'anolisos8.0:dev':'ossfs-anolisos8.0:dev',
'anolisos8.0:test':'ossfs-anolisos8.0:test',
'alinux2:dev':'ossfs-alinux2:dev',
'alinux2:test':'ossfs-alinux2:test',
'alinux3:dev':'ossfs-alinux3:dev',
'alinux3:test':'ossfs-alinux3:test',
}
os_list = ['ubuntu14.04', 'ubuntu16.04', 'ubuntu18.04', 'ubuntu20.04', 'ubuntu22.04', 'centos7.0', 'centos8.0', 'alinux2', 'alinux3']
working_dir = '/tmp/ossfs'
dest_dir = '/var/ossfs'
ossfs_source_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
dist_dir = os.path.join(ossfs_source_dir, 'dist')
def get_ossfs_version():
for line in open(os.path.join(ossfs_source_dir, 'configure.ac'), 'r'):
r = re.match(r"AC_INIT\(ossfs, (.+)\)", line)
if r:
return r.group(1)
ossfs_version = get_ossfs_version()
def random_string(length):
return ''.join(random.choice(string.ascii_lowercase) for i in range(length))
def exec_cmd(cmd):
print(cmd)
p = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
out,err = p.communicate()
if p.returncode != 0:
print("failed to run: " + cmd)
raise RuntimeError("Failed to run: %s\n%s" % (cmd,err))
def docker_image_exist(name):
return True
def docker_pull_image(name):
pass
def docker_stop(name):
for action in ('kill', 'rm'):
cmd = "docker %s %s" % (action, name)
# print 'run cmd: ', cmd
p = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
if p.wait() != 0:
raise RuntimeError(p.stderr.read())
def docker_run(conatiner_name, img, volume_list, cmd):
"""Run a specified command with the given image"""
volume_param = ''
for volume in volume_list:
volume_param += (' -v ' + volume)
if volume_param:
cmd = 'docker run --rm=true --name %s %s %s %s' % (conatiner_name, volume_param, img, cmd)
else:
cmd = 'docker run --rm=true --name %s %s %s' % (conatiner_name, img, cmd)
print(cmd)
p = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
out,err = p.communicate()
print("=====DOCKER INFO=====")
print(out)
exitcode = p.returncode
if exitcode != 0:
# print "failed to run docker: " + cmd
# print err
raise RuntimeError(err)
if exitcode == -9: # happens on timeout
# print "timeout to run docker: " + cmd
docker_stop(container_name)
def prepare():
"""
Prepare the environment, such as get source code from git,
generate script running in docker container etc.
"""
exec_cmd('rm -rf %s'%working_dir)
os.makedirs(os.path.join(working_dir, 'command'))
os.makedirs(os.path.join(working_dir, 'package'))
for name in os_list:
image = docker_images[name+':dev']
if not docker_image_exist(image):
docker_pull_image()
def command_build_package(f, install_dir):
f.write('ldconfig\n')
f.write('cd %s/source\n' % dest_dir)
f.write('./autogen.sh\n')
f.write('./configure\n')
f.write('make clean\n')
f.write('make\n')
f.write('make install DESTDIR=%s\n' % install_dir)
f.write('cd %s/package\n' % dest_dir)
def command_test_package(f):
f.write('version=$(ossfs --version | grep -E -o "V[0-9.]+[^ ]+" | cut -d"V" -f2)\n')
f.write('test "$version" = "%s"\n' % ossfs_version)
def command_build_package_centos65():
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/root/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_centos65.sh'), 'w')
f.write('#!/bin/bash\n')
f.write('export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t rpm -n ossfs -v %s -C %s -p ossfs_VERSION_centos6.5_ARCH.rpm -d "libcurl >= 7.0" -d "libxml2 >= 2.6" -d "openssl-devel >= 0.9" --after-install /root/post_action.sh --after-upgrade /root/post_action.sh' % (ossfs_version, install_dir))
f.close()
def command_test_package_centos65():
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*centos6.5*'))
if not pkg_list:
raise RuntimeError("Can not found centos6.5 package! May be build fail?")
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_centos65.sh'), 'w')
f.write('#!/bin/bash\n')
f.write('rpm --rebuilddb\n')
f.write('yum -y localinstall %s/package/%s --nogpgcheck\n' % (dest_dir, pkg))
command_test_package(f)
f.close()
def command_build_package_centos70():
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/tmp/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_centos70.sh'), 'w')
f.write('#!/bin/bash\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t rpm -n ossfs -v %s -C %s -p ossfs_VERSION_centos7.0_ARCH.rpm -d "fuse >= 2.8.4" -d "fuse-libs >= 2.8.4" -d "libcurl >= 7.0" -d "libxml2 >= 2.6" -d "openssl-libs >= 0.9"\n' % (ossfs_version, install_dir))
f.close()
def command_test_package_centos70():
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*centos7.0*'))
if not pkg_list:
raise RuntimeError("Can not found centos7.0 package! May be build fail?")
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_centos70.sh'), 'w')
f.write('#!/bin/bash\n')
f.write('yum -y update upgrade\n')
f.write('yum -y localinstall %s/package/%s --nogpgcheck\n' % (dest_dir, pkg))
command_test_package(f)
f.close()
def command_build_package_centos(os_name):
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/tmp/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t rpm -n ossfs -v %s -C %s -p ossfs_VERSION_%s_ARCH.rpm -d "fuse >= 2.8.4" -d "fuse-libs >= 2.8.4" -d "libcurl >= 7.0" -d "libxml2 >= 2.6" -d "openssl-libs >= 0.9"\n' % (ossfs_version, install_dir, os_name))
f.close()
def command_test_package_centos(os_name):
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*%s*'%os_name))
if not pkg_list:
raise RuntimeError("Can not found %s package! May be build fail?"%os_name)
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
f.write('yum -y update\n')
f.write('yum -y localinstall %s/package/%s --nogpgcheck\n' % (dest_dir, pkg))
command_test_package(f)
f.close()
def command_build_package_ubuntu(os_name):
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/tmp/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t deb -n ossfs -v %s -C %s -p ossfs_VERSION_%s_ARCH.deb -d "fuse >= 2.8.4" -d "libcurl3-gnutls >= 7.0" -d "libxml2 >= 2.6" -d "libssl-dev >= 0.9"\n' % (ossfs_version, install_dir, os_name))
f.close()
def command_test_package_ubuntu(os_name):
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*%s*'%os_name))
if not pkg_list:
raise RuntimeError("Can not found %s package! May be build fail?"%os_name)
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
f.write('apt-get update -y\n')
f.write('apt-get install gdebi-core -y\n')
f.write('gdebi -n %s/package/%s\n' % (dest_dir,pkg))
command_test_package(f)
f.close()
def command_build_package_anolisos(os_name):
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/tmp/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t rpm -n ossfs -v %s -C %s -p ossfs_VERSION_%s_ARCH.rpm -d "fuse >= 2.8.4" -d "fuse-libs >= 2.8.4" -d "libcurl >= 7.0" -d "libxml2 >= 2.6" -d "openssl-libs >= 0.9"\n' % (ossfs_version, install_dir, os_name))
f.close()
def command_test_package_anolisos(os_name):
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*%s*'%os_name))
if not pkg_list:
raise RuntimeError("Can not found %s package! May be build fail?"%os_name)
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
f.write('yum -y update\n')
f.write('yum -y localinstall %s/package/%s --nogpgcheck\n' % (dest_dir, pkg))
command_test_package(f)
f.close()
def command_build_package_alinux(os_name):
"""
Generate the build package script running in docker container
"""
cmd_dir = os.path.join(working_dir, 'command')
install_dir = '/tmp/ossfs_install'
f = open(os.path.join(cmd_dir, 'build_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
command_build_package(f, install_dir)
f.write('fpm -s dir -t rpm -n ossfs -v %s -C %s -p ossfs_VERSION_%s_ARCH.rpm -d "fuse >= 2.8.4" -d "fuse-libs >= 2.8.4" -d "libcurl >= 7.0" -d "libxml2 >= 2.6" -d "openssl-libs >= 0.9"\n' % (ossfs_version, install_dir, os_name))
f.close()
def command_test_package_alinux(os_name):
"""
Generate the test package script running in docker container
"""
pkg_list = glob.glob(os.path.join(working_dir, 'package/*%s*'%os_name))
if not pkg_list:
raise RuntimeError("Can not found %s package! May be build fail?"%os_name)
pkg = ntpath.basename(pkg_list[0])
cmd_dir = os.path.join(working_dir, 'command')
test_dir = os.path.join(dest_dir, 'source/test')
f = open(os.path.join(cmd_dir, 'test_package_%s.sh'%os_name), 'w')
f.write('#!/bin/bash\n')
f.write('yum -y update\n')
f.write('yum -y localinstall %s/package/%s --nogpgcheck\n' % (dest_dir, pkg))
command_test_package(f)
f.close()
def build_docker_image():
#ubuntu:14.04
exec_cmd('docker pull ubuntu:14.04')
exec_cmd('docker tag ubuntu:14.04 ossfs-ubuntu14.04:test')
exec_cmd('docker build -t ossfs-ubuntu14.04:dev %s/scripts/docker-file/ubuntu/14.04'%ossfs_source_dir)
#ubuntu:16.04
exec_cmd('docker pull ubuntu:16.04')
exec_cmd('docker tag ubuntu:16.04 ossfs-ubuntu16.04:test')
exec_cmd('docker build -t ossfs-ubuntu16.04:dev %s/scripts/docker-file/ubuntu/16.04'%ossfs_source_dir)
#ubuntu:18.04
exec_cmd('docker pull ubuntu:18.04')
exec_cmd('docker tag ubuntu:18.04 ossfs-ubuntu18.04:test')
exec_cmd('docker build -t ossfs-ubuntu18.04:dev %s/scripts/docker-file/ubuntu/18.04'%ossfs_source_dir)
#ubuntu:20.04
exec_cmd('docker pull ubuntu:20.04')
exec_cmd('docker tag ubuntu:20.04 ossfs-ubuntu20.04:test')
exec_cmd('docker build -t ossfs-ubuntu20.04:dev %s/scripts/docker-file/ubuntu/20.04'%ossfs_source_dir)
#ubuntu:22.04
exec_cmd('docker pull ubuntu:22.04')
exec_cmd('docker tag ubuntu:22.04 ossfs-ubuntu22.04:test')
exec_cmd('docker build -t ossfs-ubuntu22.04:dev %s/scripts/docker-file/ubuntu/22.04'%ossfs_source_dir)
#centos:7.x
exec_cmd('docker pull centos:centos7')
exec_cmd('docker build -t ossfs-centos7.0:test %s/scripts/docker-file/centos/7.x'%ossfs_source_dir)
exec_cmd('docker build -t ossfs-centos7.0:dev %s/scripts/docker-file/centos/7.x'%ossfs_source_dir)
#centos:8.x
exec_cmd('docker pull centos:centos8')
exec_cmd('docker build -t ossfs-centos8.0:dev %s/scripts/docker-file/centos/8.x'%ossfs_source_dir)
exec_cmd('docker build -t ossfs-centos8.0:test %s/scripts/docker-file/centos/8.x'%ossfs_source_dir)
#alibaba clound linux 2, anolisos:7.x
exec_cmd('docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2:latest')
exec_cmd('docker tag alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2:latest ossfs-alinux2:test')
exec_cmd('docker build -t ossfs-alinux2:dev %s/scripts/docker-file/alinux/2'%ossfs_source_dir)
#alibaba cloud linux 3, anolisos: 8.x
exec_cmd('docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest')
exec_cmd('docker tag alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest ossfs-alinux3:test')
exec_cmd('docker build -t ossfs-alinux3:dev %s/scripts/docker-file/alinux/3'%ossfs_source_dir)
pass
def build_package():
prepare()
for os_name in os_list:
volumes = ['%s:%s'%(working_dir, dest_dir), '%s:%s'%(ossfs_source_dir, os.path.join(dest_dir, 'source'))]
dev_image = docker_images[os_name+':dev']
test_image = docker_images[os_name+':test']
if os_name == 'centos6.5':
# build package
print("===========================")
print("build centos6.5 package ...")
print("===========================")
command_build_package_centos65()
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_centos65.sh'%dest_dir)
# test package
print("==========================")
print("test centos6.5 package ...")
print("==========================")
command_test_package_centos65()
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_centos65.sh'%dest_dir)
elif os_name == 'centos7.0':
# build package
print("===========================")
print("build centos7.0 package ...")
print("===========================")
command_build_package_centos70()
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_centos70.sh'%dest_dir)
# test package
print("==========================")
print("test centos7.0 package ...")
print("==========================")
command_test_package_centos70()
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_centos70.sh'%dest_dir)
elif os_name.startswith('centos'):
# build package
print("=============================")
print("build %s package ..." % os_name)
print("=============================")
command_build_package_centos(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_%s.sh' % (dest_dir, os_name))
# test package
print("============================")
print("test %s package ..." % os_name)
print("============================")
command_test_package_centos(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_%s.sh' % (dest_dir, os_name))
elif os_name.startswith('ubuntu'):
# build package
print("=============================")
print("build %s package ..." % os_name)
print("=============================")
command_build_package_ubuntu(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_%s.sh' % (dest_dir, os_name))
# test package
print("============================")
print("test %s package ..." % os_name)
print("============================")
command_test_package_ubuntu(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_%s.sh' % (dest_dir, os_name))
elif os_name.startswith('anolisos'):
# build package
print("=============================")
print("build %s package ..." % os_name)
print("=============================")
command_build_package_anolisos(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_%s.sh' % (dest_dir, os_name))
# test package
print("============================")
print("test %s package ..." % os_name)
print("============================")
command_test_package_anolisos(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_%s.sh' % (dest_dir, os_name))
elif os_name.startswith('alinux'):
# build package
print("=============================")
print("build %s package ..." % os_name)
print("=============================")
command_build_package_alinux(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, dev_image, volumes, '/bin/bash %s/command/build_package_%s.sh' % (dest_dir, os_name))
# test package
print("============================")
print("test %s package ..." % os_name)
print("============================")
command_test_package_alinux(os_name)
container_name = 'ossfs_%s'%random_string(5)
docker_run(container_name, test_image, volumes, '/bin/bash %s/command/test_package_%s.sh' % (dest_dir, os_name))
if __name__ == '__main__':
build_docker_image()
build_package()
subprocess.check_call(['ln', '-sfT', os.path.join(working_dir, 'package'), dist_dir])