diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 06f1aa7980da28a3e93fba69eb93e704d4f1c5cf..5cd270169ff595aa442b2fabed634f14482cea41 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,3 @@ - variables: PYTHON_VERSION: "3.6.13" @@ -7,21 +6,24 @@ stages: - test - package +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_COMMIT_TAG + .build: stage: build script: - - yum -y install zlib-devel bzip2-devel openssl-devel readline-devel ncurses-devel sqlite-devel gdbm-devel db4-devel expat-devel libpcap-devel xz-devel pcre-devel libffi-devel tk-devel - - curl -s https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz | tar -xJf - - - cd Python-${PYTHON_VERSION} - - ./configure --prefix=${PYTHON_ROOT} - - make -j 4 - - make install - - ln -s python3 ${PYTHON_ROOT}/bin/python - - rm -rf Python-${PYTHON_VERSION} + - conan config init + - conan profile update settings.compiler.libcxx=libstdc++11 default + - conan create . python/${PYTHON_VERSION}@soleil/stable --build -c tools.system.package_manager:mode=install -c tools.system.package_manager:tool=yum -c tools.system.package_manager:sudo=True + - conan install python/${PYTHON_VERSION}@soleil/stable --install-folder ${PYTHON_ROOT} # Upgrade pip + - unset PYTHONPATH - ${PYTHON_ROOT}/bin/pip3 install -q --no-cache-dir --upgrade pip # Fix python shebang to make it independent of install path - - grep -I -r -l "^#\!${PYTHON_ROOT}/bin/python.*$" ${PYTHON_ROOT} | xargs sed -i '1c\#\!/usr/bin/env python' + - grep -I -r -l "^#\!.*/bin/python.*$" ${PYTHON_ROOT} | xargs sed -i '1c\#\!/usr/bin/env python' # Clean pycache - find ${PYTHON_ROOT} -iname __pycache__ -print0 | xargs -0 rm -rf artifacts: @@ -41,98 +43,50 @@ stages: - zip -r --symlinks ../${NAME}.zip * - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ../${NAME}.zip "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/python/${PYTHON_VERSION}/"' -linux-el6-x86_64: - extends: [".build"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44 - variables: - NAME: "python-${PYTHON_VERSION}-linux-el6-x86_64" - PYTHON_ROOT: "${CI_PROJECT_DIR}/${NAME}" - -test-el6-x86_64: - extends: [".test"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44 - variables: - NAME: "python-${PYTHON_VERSION}-linux-el6-x86_64" - needs: - - linux-el6-x86_64 - -package-el6-x86_64: - extends: [".package"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44 - variables: - NAME: "python-${PYTHON_VERSION}-linux-el6-x86_64" - needs: - - linux-el6-x86_64 - - test-el6-x86_64 - -linux-el6-i686: - extends: [".build"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44-x86 - variables: - NAME: "python-${PYTHON_VERSION}-${CI_JOB_NAME}" - PYTHON_ROOT: "${CI_PROJECT_DIR}/${NAME}" - -test-el6-i686: - extends: [".test"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44-x86 - variables: - NAME: "python-${PYTHON_VERSION}-linux-el6-i686" - needs: - - linux-el6-i686 - -package-el6-i686: - extends: [".package"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44-x86 - variables: - NAME: "python-${PYTHON_VERSION}-linux-el6-i686" - needs: - - linux-el6-i686 - - test-el6-i686 - -linux-el7-x86_64: +linux-x86_64: extends: [".build"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91 variables: - NAME: "python-${PYTHON_VERSION}-linux-el7-x86_64" + NAME: "python-${PYTHON_VERSION}-linux-x86_64" PYTHON_ROOT: "${CI_PROJECT_DIR}/${NAME}" -test-el7-x86_64: +test-x86_64: extends: [".test"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91 variables: - NAME: "python-${PYTHON_VERSION}-linux-el7-x86_64" + NAME: "python-${PYTHON_VERSION}-linux-x86_64" needs: - - linux-el7-x86_64 + - linux-x86_64 -package-el7-x86_64: +package-x86_64: extends: [".package"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91 variables: - NAME: "python-${PYTHON_VERSION}-linux-el7-x86_64" + NAME: "python-${PYTHON_VERSION}-linux-x86_64" needs: - - linux-el7-x86_64 - - test-el7-x86_64 + - linux-x86_64 + - test-x86_64 -linux-el7-i686: +linux-i686: extends: [".build"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48-x86 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91-x86 variables: - NAME: "python-${PYTHON_VERSION}-${CI_JOB_NAME}" + NAME: "python-${PYTHON_VERSION}-linux-i686" PYTHON_ROOT: "${CI_PROJECT_DIR}/${NAME}" -test-el7-i686: +test-i686: extends: [".test"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48-x86 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91-x86 variables: - NAME: "python-${PYTHON_VERSION}-linux-el7-i686" + NAME: "python-${PYTHON_VERSION}-linux-i686" needs: - - linux-el7-i686 + - linux-i686 -package-el7-i686: +package-i686: extends: [".package"] - image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48-x86 + image: gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/conan-docker-tools/conan-el6-gcc91-x86 variables: - NAME: "python-${PYTHON_VERSION}-linux-el7-i686" + NAME: "python-${PYTHON_VERSION}-linux-i686" needs: - - linux-el7-i686 - - test-el7-i686 + - linux-i686 + - test-i686 diff --git a/README.md b/README.md index fabe1fe9a9b2ecd50f8ade21cfd21b2a3d617a26..b8d5509d6213ac791108a5f668a75eb0194f51e3 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,9 @@ Pipeline to build Python 3.6.13 on CentOS Docker image Allows to build Python 3.6.13 for: -* CentOS 6.10 64 bits: [python-3.6.13-linux-el6-x86_64.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/main/download?job=linux-el6-x86_64) -* CentOS 6.10 32 bits: [python-3.6.13-linux-el6-i686.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/main/download?job=linux-el6-i686) -* CentOS 7.9 64 bits: [python-3.6.13-linux-el7-x86_64.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/main/download?job=linux-el7-x86_64) -* CentOS 7.9 32 bits: [python-3.6.13-linux-el7-i686.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/main/download?job=linux-el7-i686) +* CentOS 6.10 64 bits: [python-3.6.13-linux-x86_64.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/3.6.13/download?job=linux-x86_64) +* CentOS 6.10 32 bits: [python-3.6.13-linux-i686.zip](https://gitlab.synchrotron-soleil.fr/software-control-system/devtools/python3/-/jobs/artifacts/3.6.13/download?job=linux-i686) Build on Docker image: * gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44 * gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el6-gcc44-x86 -* gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48 -* gitlab-registry.synchrotron-soleil.fr/software-control-system/containers/dev-docker-tools/dev-el7-gcc48-x86 diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000000000000000000000000000000000000..b244940940c27be4baf8e31979303d044999bb15 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,73 @@ +from conan import ConanFile +from conan.tools.system import package_manager +from conan.errors import ConanInvalidConfiguration +from conans import AutoToolsBuildEnvironment, tools +import os + +class PythonConan(ConanFile): + name = "python" + version = "3.6.13" + + settings = "os", "compiler", "build_type", "arch" + + requires = "openssl/1.1.1s", \ + "zlib/1.2.13", \ + "bzip2/1.0.8", \ + "sqlite3/3.39.4", \ + "libdb/5.3.28", \ + "expat/2.5.0", \ + "libpcap/1.10.1", \ + "xz_utils/5.2.5", \ + "pcre/8.45", \ + "libffi/3.4.3", \ + "libuuid/1.0.3", + + _autotools = None + + def validate(self): + if self.settings.os not in ["Linux"]: + raise ConanInvalidConfiguration("This recipe supports only Linux") + + # Install devel package when unable to build correctly from conan + def system_requirements(self): + yum = package_manager.Yum(self) + yum.install(["readline-devel", "ncurses-devel", "gdbm-devel", "tk-devel"]) + + def source(self): + self.run("curl -s -L -O https://www.python.org/ftp/python/%s/Python-%s.tgz" % (self.version, self.version)) + self.run("tar -xzf Python-%s.tgz --strip 1" % self.version) + + def _build_configure(self): + if self._autotools: + return self._autotools + + self._autotools = AutoToolsBuildEnvironment(self) + + self._autotools.include_paths.append(os.path.join(self.deps_cpp_info["openssl"].rootpath, "include")) + self._autotools.library_paths.append(os.path.join(self.deps_cpp_info["openssl"].rootpath, "lib")) + + args=[ + "--enable-optimizations", + "--with-ssl-default-suites=openssl", + "--with-openssl=%s" % self.deps_cpp_info["openssl"].rootpath + ] + + self._autotools.configure(args=args) + return self._autotools + + + def build(self): + env_build = self._build_configure() + env_build.make() + + def package(self): + env_build = self._build_configure() + env_build.install() + os.symlink('python3', os.path.join(self.package_folder, 'bin', 'python')) + + def package_info(self): + self.cpp_info.libs = tools.collect_libs(self) + self.env_info.PATH.append(os.path.join(self.package_folder, "bin")) + + def deploy(self): + self.copy("*", symlinks=True)