Esempio n. 1
0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t',
                        '--tag',
                        help='the GIT tag to build the image from',
                        metavar='GIT_TAG',
                        required=True)
    parser.add_argument('-i',
                        '--imagetype',
                        help='sets the image type',
                        choices=['jdk', 'jre', 'test'],
                        required=True)
    parser.add_argument('-p',
                        '--publish',
                        help='publish the image',
                        action='store_true',
                        default=False)
    parser.add_argument('--alpine',
                        help='build Alpine Linux image',
                        action='store_true',
                        default=False)
    parser.add_argument('--latest',
                        help='tag image as latest',
                        action='store_true',
                        default=False)
    args = parser.parse_args()

    tag = args.tag
    image_type = args.imagetype
    publish = args.publish
    build_alpine = args.alpine
    latest = args.latest

    version, version_part, major, build_number, sap_build_number, os_ext = utils.sapmachine_tag_components(
        tag)

    if version is None:
        raise Exception(str.format('Invalid tag: {0}', tag))

    dependencies = 'wget ca-certificates'

    if image_type == 'test':
        if build_alpine:
            dependencies += ' zip git unzip coreutils python binutils shadow bash'
            add_user = '******'
        else:
            dependencies += ' zip git unzip realpath python binutils'
            add_user = '******'
    else:
        add_user = ''

    if build_alpine:
        package = str.format('sapmachine-{0}-{1}={2}.{3}.{4}-r0', major,
                             'jdk' if image_type == 'test' else image_type,
                             version_part, build_number, sap_build_number)
    else:
        package = str.format('sapmachine-{0}-{1}={2}+{3}.{4}', major,
                             'jdk' if image_type == 'test' else image_type,
                             version_part, build_number, sap_build_number)

    docker_work = join(os.getcwd(), 'docker_work', image_type)

    utils.remove_if_exists(join(os.getcwd(), 'docker_work'))
    os.makedirs(docker_work)

    if build_alpine:
        template = template_alpine
    else:
        template = template_ubuntu

    with open(join(docker_work, 'Dockerfile'), 'w+') as dockerfile:
        dockerfile.write(
            Template(template).substitute(dependencies=dependencies,
                                          package=package,
                                          add_user=add_user))

    if 'DOCKER_USER' in os.environ and image_type != 'test':
        docker_user = os.environ['DOCKER_USER']
        match = re.match(r'([0-9]+)(\.[0-9]+)?(\.[0-9]+)?', version_part)
        version_part_expanded = version_part

        i = 0
        while i < (3 - match.lastindex):
            version_part_expanded += '.0'
            i += 1

        docker_tag = str.format('{0}/jdk{1}:{2}.{3}.{4}{5}{6}', docker_user,
                                major, version_part_expanded, build_number,
                                sap_build_number,
                                '-jre' if image_type == 'jre' else '',
                                '-alpine' if build_alpine else '')

        docker_tag_latest = str.format('{0}/jdk{1}:latest{2}{3}', docker_user,
                                       major,
                                       '-jre' if image_type == 'jre' else '',
                                       '-alpine' if build_alpine else '')

        if latest:
            utils.run_cmd([
                'docker', 'build', '-t', docker_tag, '-t', docker_tag_latest,
                docker_work
            ])
        else:
            utils.run_cmd(['docker', 'build', '-t', docker_tag, docker_work])

        retcode, out, err = utils.run_cmd(
            ['docker', 'run', docker_tag, 'java', '-version'],
            throw=False,
            std=True)

        if retcode != 0:
            raise Exception(str.format('Failed to run Docker image: {0}', err))

        version_2, version_part_2, major_2, build_number_2, sap_build_number_2 = utils.sapmachine_version_components(
            err, multiline=True)

        if version_part != version_part_2 or build_number != build_number_2 or sap_build_number != sap_build_number_2:
            raise Exception(
                str.format('Invalid version found in Docker image:\n{0}', err))

        retcode, out, err = utils.run_cmd(
            ['docker', 'run', docker_tag, 'which', 'javac'],
            throw=False,
            std=True)

        if image_type == 'jdk':
            if retcode != 0 or not out:
                raise Exception('Image type is not JDK')
        else:
            if retcode == 0:
                raise Exception('Image type is not JRE')

        if publish and 'DOCKER_PASSWORD' in os.environ:
            docker_password = os.environ['DOCKER_PASSWORD']
            utils.run_cmd(
                ['docker', 'login', '-u', docker_user, '-p', docker_password])
            utils.run_cmd(['docker', 'push', docker_tag])

            if latest:
                utils.run_cmd(['docker', 'push', docker_tag_latest])
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-a',
                        '--asset',
                        help='the SapMachine asset file',
                        metavar='ASSET',
                        required=True)
    parser.add_argument('-j',
                        '--jre',
                        help='Build SapMachine JRE installer',
                        action='store_true',
                        default=False)
    parser.add_argument('-s',
                        '--sapmachine-directory',
                        help='specify the SapMachine GIT directory',
                        metavar='DIR',
                        required=True)
    args = parser.parse_args()

    cwd = os.getcwd()
    work_dir = join(cwd, 'msi_work')
    asset = os.path.realpath(args.asset)
    is_jre = args.jre
    sapmachine_git_dir = args.sapmachine_directory
    products = None
    product_id = None
    upgrade_code = None

    utils.remove_if_exists(work_dir)
    os.makedirs(work_dir)

    utils.extract_archive(asset, work_dir, remove_archive=False)
    sapmachine_folder = glob.glob(join(work_dir, 'sapmachine*'))
    os.rename(sapmachine_folder[0], join(work_dir, 'SourceDir'))

    _, _, version_output = utils.run_cmd(
        [join(work_dir, 'SourceDir', 'bin', 'java.exe'), '-version'], std=True)

    version, version_part, major, version_sap, build_number = utils.sapmachine_version_components(
        version_output, multiline=True)
    sapmachine_version = [e for e in version_part.split('.')]

    if len(sapmachine_version) < 3:
        sapmachine_version += [
            '0' for sapmachine_version in range(0, 3 - len(sapmachine_version))
        ]

    if len(sapmachine_version) == 4:
        sapmachine_version[3] = str((int(sapmachine_version[3]) << 8) & 0xFF00)

    if len(sapmachine_version) == 5:
        merged_version = str((int(sapmachine_version[3]) << 8)
                             | (int(sapmachine_version[4]) & 0xFF))

        del sapmachine_version[4]
        sapmachine_version[3] = merged_version

    sapmachine_version = '.'.join(sapmachine_version)

    shutil.copyfile(
        join(sapmachine_git_dir, 'src', 'java.base', 'windows', 'native',
             'launcher', 'icons', 'awt.ico'), join(work_dir, 'sapmachine.ico'))
    write_as_rtf(join(sapmachine_git_dir, 'LICENSE'),
                 join(work_dir, 'license.rtf'))

    infrastructure_dir = join(work_dir, 'sapmachine_infrastructure')
    templates_dir = join(infrastructure_dir, 'wix-templates')
    utils.git_clone('github.com/SAP/SapMachine-infrastructure', 'master',
                    infrastructure_dir)

    with open(join(templates_dir, 'products.yml'), 'r') as products_yml:
        products = yaml.safe_load(products_yml.read())

    image_type = 'jre' if is_jre else 'jdk'

    if products[image_type] is None or major not in products[image_type]:
        product_id = str(uuid.uuid4())
        upgrade_code = str(uuid.uuid4())
        if products[image_type] is None:
            products[image_type] = {}
        products[image_type][major] = {
            'product_id': product_id,
            'upgrade_code': upgrade_code
        }

        with open(join(templates_dir, 'products.yml'), 'w') as products_yml:
            products_yml.write(yaml.dump(products, default_flow_style=False))

        utils.git_commit(infrastructure_dir, 'Updated product codes.',
                         [join('wix-templates', 'products.yml')])
        utils.git_push(infrastructure_dir)
    else:
        product_id = products[image_type][major]['product_id']
        upgrade_code = products[image_type][major]['upgrade_code']

    create_sapmachine_wxs(
        join(
            templates_dir, 'SapMachine.jre.wxs.template'
            if is_jre else 'SapMachine.jdk.wxs.template'),
        join(work_dir, 'SapMachine.wxs'), product_id, upgrade_code,
        sapmachine_version, major)

    shutil.copyfile(join(work_dir, 'SourceDir', 'release'),
                    join(work_dir, 'release'))
    utils.remove_if_exists(join(work_dir, 'SourceDir', 'release'))

    utils.run_cmd(
        'heat dir SourceDir -swall -srd -gg -platform x64 -template:module -cg SapMachineGroup -out SapMachineModule.wxs'
        .split(' '),
        cwd=work_dir)

    with open(join(work_dir, 'SapMachineModule.wxs'),
              'r+') as sapmachine_module:
        sapmachine_module_content = sapmachine_module.read()
        sapmachine_module_content = sapmachine_module_content.replace(
            'PUT-MODULE-NAME-HERE', 'SapMachineModule')
        sapmachine_module_content = sapmachine_module_content.replace(
            'PUT-COMPANY-NAME-HERE', 'SapMachine Team')
        sapmachine_module.seek(0)
        sapmachine_module.truncate()
        sapmachine_module.write(sapmachine_module_content)

    utils.run_cmd('candle -arch x64 SapMachineModule.wxs'.split(' '),
                  cwd=work_dir)
    utils.run_cmd('light SapMachineModule.wixobj'.split(' '), cwd=work_dir)
    utils.run_cmd('candle -arch x64 SapMachine.wxs'.split(' '), cwd=work_dir)
    utils.run_cmd('light -ext WixUIExtension SapMachine.wixobj'.split(' '),
                  cwd=work_dir)

    msi_name = os.path.basename(asset)
    msi_name = os.path.splitext(msi_name)[0]
    os.rename(join(work_dir, 'SapMachine.msi'),
              join(cwd, str.format('{0}.msi', msi_name)))

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tag', help='Test a tag', metavar='TAG')
    parser.add_argument('-l',
                        '--list-latest-non-ga',
                        default=False,
                        help='List the latest non-ga tag',
                        action='store_true')
    parser.add_argument(
        '-a',
        '--test-all-tags',
        nargs='?',
        default='not present',
        const='all',
        help='List latest tags, value could be sap,jdk,unknown')
    parser.add_argument('-r',
                        '--test-all-releases',
                        default=False,
                        help='List latest releases',
                        action='store_true')
    parser.add_argument('-v', '--jvm', help='Test a VM', metavar='VM Path')
    parser.add_argument('-s',
                        '--version-string',
                        help='Test a VM version String',
                        metavar='Version String')
    args = parser.parse_args()

    if args.tag:
        tag = Tag.from_string(args.tag)
        if tag is None:
            print(
                str.format("Tag value {0} seems to be an invalid tag",
                           args.tag))
            sys.exit(-1)
        tag.print_details()
        if args.list_latest_non_ga:
            latest_non_ga_tag = tag.get_latest_non_ga_tag()
            if latest_non_ga_tag is None:
                print(str.format('Latest non-ga tag is None'))
            else:
                print(str.format('Latest non-ga tag:'))
                latest_non_ga_tag.print_details()

    if args.test_all_tags != 'not present':
        print_unknown = args.test_all_tags != "sap" and args.test_all_tags != "jdk"
        print_sap = args.test_all_tags != "unknown" and args.test_all_tags != "jdk"
        print_jdk = args.test_all_tags != "unknown" and args.test_all_tags != "sap"
        tags = utils.get_github_tags()
        if tags is None:
            print("Could not get tags from GitHub")
            sys.exit(-1)
        for tag in tags:
            to = Tag.from_string(tag['name'])
            if to is None:
                if print_unknown:
                    print(str.format("Tag {0} is unknown.", tag['name']))
            elif to.is_sapmachine_tag():
                if print_sap:
                    to.print_details()
                    latest_non_ga = to.get_latest_non_ga_tag()
                    if latest_non_ga is None:
                        print(
                            str.format("Latest non-ga tag for {0} is None",
                                       to.as_string()))
                        sys.exit(-1)
                    elif latest_non_ga != to:
                        print("  Latest non-ga tag:")
                        latest_non_ga.print_details(indent='  ')
            elif to.is_jdk_tag():
                if print_jdk:
                    to.print_details()
                    latest_non_ga = to.get_latest_non_ga_tag()
                    if latest_non_ga is None:
                        print(
                            str.format("Latest non-ga tag for {0} is None",
                                       to.as_string()))
                        sys.exit(-1)
                    elif latest_non_ga != to:
                        print("  Latest non-ga tag:")
                        latest_non_ga.print_details(indent='  ')

    if args.test_all_releases:
        releases = utils.get_github_releases()
        if releases is None:
            print("Could not get releases from GitHub")
            sys.exit(-1)
        for release in releases:
            t = SapMachineTag.from_string(release['name'])
            if t is None:
                print(str.format("Release {0} is unknown.", release['name']))
            else:
                t.print_details()

    if args.jvm:
        _, std_out, std_err = utils.run_cmd(
            [join(args.jvm, 'bin', 'java.exe'), '-version'], std=True)
        print('Stdout:')
        print(std_out)
        print('Stderr')
        print(std_err)

        version, major = utils.sapmachine_version_components(std_err)
        version_components = [version, major]
        print(' '.join([
            version_component if version_component else 'N/A'
            for version_component in version_components
        ]))
        sapmachine_version = [e for e in version.split('.')]
        print(sapmachine_version)

    if args.version_string:
        print(
            str.format("Version string to test: \"{0}\".",
                       args.version_string))

        version, major = utils.sapmachine_version_components(
            args.version_string)
        version_components = [version, major]
        print(' '.join([
            version_component if version_component else 'N/A'
            for version_component in version_components
        ]))
        sapmachine_version = [e for e in version.split('.')]
        print(sapmachine_version)

    return 0
Esempio n. 4
0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t',
                        '--tag',
                        help='the GIT tag to build the image from',
                        metavar='GIT_TAG',
                        required=True)
    parser.add_argument('-i',
                        '--imagetype',
                        help='sets the image type',
                        choices=['jdk', 'test'],
                        required=True)
    parser.add_argument('-p',
                        '--publish',
                        help='publish the image',
                        action='store_true',
                        default=False)
    parser.add_argument('--latest',
                        help='tag image as latest',
                        action='store_true',
                        default=False)
    parser.add_argument('--workdir',
                        help='specify the working directory',
                        metavar='DIR',
                        required=False)
    args = parser.parse_args()

    tag = args.tag
    image_type = args.imagetype
    publish = args.publish
    latest = args.latest
    workdir = args.workdir
    tag_is_release = utils.sapmachine_tag_is_release(tag)

    version, version_part, major, build_number, sap_build_number, os_ext = utils.sapmachine_tag_components(
        tag)

    if version is None:
        raise Exception(str.format('Invalid tag: {0}', tag))

    dependencies = 'wget ca-certificates'

    if image_type == 'test':
        dependencies += ' zip git unzip realpath python binutils'
        add_user = '******'
    else:
        add_user = ''

    if build_number:
        package = str.format('sapmachine-{0}-jdk={1}+{2}.{3}', major,
                             version_part, build_number,
                             sap_build_number if sap_build_number else '0')
    else:
        package = str.format('sapmachine-{0}-jdk={1}', major, version_part)

    if workdir is None:
        workdir = join(os.getcwd(), 'docker_work', image_type)

    utils.remove_if_exists(workdir)
    os.makedirs(workdir)

    template = template_ubuntu

    with open(join(workdir, 'Dockerfile'), 'w+') as dockerfile:
        dockerfile.write(
            Template(template).substitute(dependencies=dependencies,
                                          package=package,
                                          add_user=add_user))

    if 'DOCKER_USER' in os.environ and image_type != 'test':
        docker_user = os.environ['DOCKER_USER']
        sapmachine_version = [int(e) for e in version_part.split('.')]
        expand = 5 if sap_build_number else 3
        sapmachine_version += [
            0 for sapmachine_version in range(0, expand -
                                              len(sapmachine_version))
        ]

        if sap_build_number:
            sapmachine_version[4] = int(sap_build_number)

        sapmachine_version_string = '.'.join(
            [str(e) for e in sapmachine_version])

        docker_tag = str.format('{0}/jdk{1}:{2}{3}', docker_user, major,
                                sapmachine_version_string,
                                '.b' + build_number if build_number else '')

        docker_tag_latest = str.format('{0}/jdk{1}:latest', docker_user, major)

        if latest:
            utils.run_cmd([
                'docker', 'build', '-t', docker_tag, '-t', docker_tag_latest,
                workdir
            ])
        else:
            utils.run_cmd(['docker', 'build', '-t', docker_tag, workdir])

        retcode, out, err = utils.run_cmd(
            ['docker', 'run', docker_tag, 'java', '-version'],
            throw=False,
            std=True)

        if retcode != 0:
            raise Exception(str.format('Failed to run Docker image: {0}', err))

        version_2, version_part_2, major_2, build_number_2, sap_build_number_2 = utils.sapmachine_version_components(
            err, multiline=True)

        if version_part != version_part_2 or (
                build_number and (build_number != build_number_2)) or (
                    sap_build_number and
                    (sap_build_number != sap_build_number_2)):
            raise Exception(
                str.format('Invalid version found in Docker image:\n{0}', err))

        retcode, out, err = utils.run_cmd(
            ['docker', 'run', docker_tag, 'which', 'javac'],
            throw=False,
            std=True)

        if retcode != 0 or not out:
            raise Exception('Image type is not JDK')

        if publish and 'DOCKER_PASSWORD' in os.environ:
            docker_password = os.environ['DOCKER_PASSWORD']
            utils.run_cmd(
                ['docker', 'login', '-u', docker_user, '-p', docker_password])
            utils.run_cmd(['docker', 'push', docker_tag])

            if latest:
                utils.run_cmd(['docker', 'push', docker_tag_latest])