Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import division, print_function, unicode_literals
- import json
- import argparse
- import yaml
- import os
- import pprint
- import subprocess
- import sys
- import utils
- from .arg_parse import Arg_Parse_Yaml
- class Command:
- def __init__(self):
- self.load_params()
- self.script_path = os.path.dirname(os.path.abspath(__file__))
- self.current_path=os.path.abspath(os.curdir)
- def sh(self, args, print_output=True, shell=True, cwd=None):
- try:
- try:
- print(args)
- if cwd != None:
- os.chdir(cwd)
- else:
- if self.current_path == os.getcwd():
- os.chdir(os.path.abspath(os.path.curdir))
- else:
- os.chdir(os.path.abspath(self.current_path))
- p = subprocess.Popen(args=args.split(), encoding='utf-8', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell, cwd=cwd)
- out, err = p.communicate()
- p.stdout.close()
- if out:
- print(out)
- if err:
- print(err)
- return out
- except Exception as e:
- print(e)
- return subprocess.check_output(args, shell=shell).decode('utf-8')
- except OSError as ex:
- print(ex)
- sys.exit(32)
- def sh_inline(self, args, print_output=True, shell=True):
- try:
- return self.sh(args, print_output=print_output, shell=shell).replace('\n','')
- except OSError as ex:
- print(ex)
- sys.exit(32)
- def access_token(self):
- from oauthlib.oauth2 import BackendApplicationClient
- from requests_oauthlib import OAuth2Session
- APP_TENTANT_ID = os.environ.get("APP_TENTANT_ID",'')
- CLIENT_ID= os.environ.get("CLIENT_ID",'')
- CLIENT_SECRET= os.environ.get("CLIENT_SECRET",'')
- client = BackendApplicationClient(client_id=CLIENT_ID)
- oauth = OAuth2Session(client=client)
- token_url = "https://login.microsoftonline.com/{APP_TENTANT_ID}/oauth2/token"
- print(token_url)
- json_token = oauth.fetch_token(token_url=token_url, client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
- token = dict(json_token)['access_token']
- print(token)
- def get_args_command(self):
- return self.params['Command']
- def load_params(self):
- arg_Parse_Yaml = Arg_Parse_Yaml()
- script_path = os.path.dirname(os.path.abspath(__file__))
- args_file = "/{0}/../args.yaml".format(script_path)
- # print(args_file)
- params_yaml = arg_Parse_Yaml.get_parameters_yaml(args_file)
- # print(params_yaml)
- # pprint.pprint(params_yaml)
- #NOW READ IN LOCAL ONLY NOT IN SOURCE CONTROL FOR PASSWORDS IF LOCAL ONLY
- #IF CI/CD PASS COME FROM KEY VAULT OR CIRCLECI
- args_file = "/{0}/../../bin/local_only/local_only.yaml".format(script_path)
- # print(args_file)
- if os.path.isfile(args_file):
- secret_params_yaml = arg_Parse_Yaml.get_parameters_yaml(args_file)
- # print(secret_params_yaml)
- # pprint.pprint(secret_params_yaml)
- params_yaml.update(secret_params_yaml)
- self.params = params_yaml
- def set_all_vars(self):
- keys={}
- for key, val in self.params.items():
- # print(key, val)
- os.environ[key]=val
- os.putenv(key,val)
- if key != "Command":
- keys[key]=val
- os.environ["VERSION_NUMBER"]=os.environ["DEBUG"]
- os.environ["NAME"]=os.environ['PROJECT_NAME']
- os.environ["VERSION"]="{}.{}.{}".format(os.environ['MAJOR'],os.environ['MINOR'],"1213")
- os.environ["ROUTE"]="/{}".format(os.environ['PROJECT_NAME'])
- os.environ["CONTAINER_NAME"]="{}/{}".format(os.environ['DOCKER_REPO'], os.environ['PROJECT_NAME'])
- os.environ["REPO_SERVER"]="{}.azurecr.io".format(os.environ['REPO'])
- os.environ["CONTAINER_FULL_NAME"]="{}/{}:{}".format(os.environ['DOCKER_REPO'], os.environ['PROJECT_NAME'], os.environ['VERSION'])
- os.environ["TAG"]="{}/{}".format(os.environ['REPO_SERVER'], os.environ['CONTAINER_FULL_NAME'])
- os.environ["BASE_IMAGE"]="{}/{}/base_crud-api:{}".format(os.environ['REPO_SERVER'], os.environ['DOCKER_REPO'], os.environ['BASE_IMAGE_VERSION'])
- os.putenv("VERSION",os.environ["VERSION"])
- os.putenv("ROUTE",os.environ["ROUTE"])
- os.putenv("CONTAINER_NAME",os.environ["CONTAINER_NAME"])
- os.putenv("REPO_SERVER",os.environ["REPO_SERVER"])
- os.putenv("CONTAINER_FULL_NAME",os.environ["CONTAINER_FULL_NAME"])
- os.putenv("TAG",os.environ["TAG"])
- os.putenv("BASE_IMAGE",os.environ["BASE_IMAGE"])
- os.putenv("HOST_URL",os.environ["HOST_URL"])
- keys["VERSION"]=os.environ["VERSION"]
- keys["ROUTE"]=os.environ["ROUTE"]
- keys["CONTAINER_NAME"]=os.environ["CONTAINER_NAME"]
- keys["REPO_SERVER"]=os.environ["REPO_SERVER"]
- keys["CONTAINER_FULL_NAME"]=os.environ["CONTAINER_FULL_NAME"]
- keys["TAG"]=os.environ["TAG"]
- keys["BASE_IMAGE"]=os.environ["BASE_IMAGE"]
- keys["HOST_URL"]=os.environ["HOST_URL"]
- env_file = self.current_path + "/all_vars.sh"
- with open(env_file, mode='wb') as f:
- for key, val in keys.items():
- f.write("export {}='{}'\n".format(key,val).encode("utf-8"))
- def set_dirs(self):
- self.set_all_vars()
- os.environ["BUILD_SCRIPTS_DIR"] = "{0}/../../bin/".format(self.script_path)
- os.environ["PROJECT_DIR"] = "{0}/../../".format(self.script_path)
- os.environ["BUILD_LIB_DIR"]="{0}/../../bin/build_lib/".format(self.script_path)
- os.environ["ACCEPTANCE_TEST_DIR"]="{0}/../../acceptance/".format(self.script_path)
- os.environ["APPLICATION_DIR"]="{0}/../../app/".format(self.script_path)
- os.environ["AZURE_SCRIPTS_DIR"]="{0}/../../azure/".format(self.script_path)
- os.environ["VENV"]="{}venv/{}".format(os.environ["PROJECT_DIR"], os.environ["PROJECT_NAME"])
- os.putenv("BUILD_SCRIPTS_DIR",os.environ["BUILD_SCRIPTS_DIR"])
- os.putenv("PROJECT_DIR",os.environ["PROJECT_DIR"])
- os.putenv("BUILD_LIB_DIR",os.environ["BUILD_LIB_DIR"])
- os.putenv("ACCEPTANCE_TEST_DIR",os.environ["ACCEPTANCE_TEST_DIR"])
- os.putenv("APPLICATION_DIR",os.environ["APPLICATION_DIR"])
- os.putenv("AZURE_SCRIPTS_DIR",os.environ["AZURE_SCRIPTS_DIR"])
- keys={}
- keys["BUILD_SCRIPTS_DIR"]=os.environ["BUILD_SCRIPTS_DIR"]
- keys["PROJECT_DIR"]=os.environ["PROJECT_DIR"]
- keys["BUILD_LIB_DIR"]=os.environ["BUILD_LIB_DIR"]
- keys["ACCEPTANCE_TEST_DIR"]=os.environ["ACCEPTANCE_TEST_DIR"]
- keys["APPLICATION_DIR"]=os.environ["APPLICATION_DIR"]
- keys["AZURE_SCRIPTS_DIR"]=os.environ["AZURE_SCRIPTS_DIR"]
- env_file = self.current_path + "/dirs.sh"
- with open(env_file, mode='wb') as f:
- for key, val in keys.items():
- f.write("export {}='{}'\n".format(key,val).encode("utf-8"))
- def set_venv(self):
- self.set_dirs()
- os.environ["VENV"]="{}venv/{}".format(os.environ["PROJECT_DIR"], os.environ["PROJECT_NAME"])
- os.putenv("VENV",os.environ["VENV"])
- keys={}
- keys["VENV"]=os.environ["VENV"]
- env_file = self.current_path + "/venv.sh"
- with open(env_file, mode='wb') as f:
- for key, val in keys.items():
- f.write("export {}='{}'\n".format(key,val).encode("utf-8"))
- def with_venv (self):
- self.set_venv()
- def set_project (self):
- self.set_dirs()
- os.environ["PROJECT_NAME"]="{}venv/{}".format(os.environ["PROJECT_DIR"], os.environ["PROJECT_NAME"])
- os.putenv("VENV",os.environ["VENV"])
- keys={}
- keys["VENV"]=os.environ["VENV"]
- env_file = self.current_path + "/venv.sh"
- with open(env_file, mode='wb') as f:
- for key, val in keys.items():
- f.write("export {}='{}'\n".format(key,val).encode("utf-8"))
- def get_sudo_user(self):
- SUDO = "sudo"
- whoami = self.sh_inline("sudo -S whoami", print_output=False)
- if whoami == "root":
- SUDO = ""
- return SUDO
- def az_install(self):
- # Set sudo to work whether logged in as root user or non-root user
- SUDO = self.get_sudo_user()
- which_az = self.sh_inline("which az", print_output=False)
- if len(which_az)==0:
- self.sh(f"{SUDO} apt-get update && {SUDO} apt-get -qqy install apt-transport-https")
- command_lsb_release = self.sh_inline("command -v lsb_release", print_output=False)
- if len(command_lsb_release)==0:
- print("Installing lsb_release")
- self.sh(f"{SUDO} apt-get -qqy install lsb-release")
- AZ_REPO=self.sh_inline("lsb_release -cs", print_output=False)
- # Modify your sources list
- self.sh(f'echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ {AZ_REPO} main" | {SUDO} tee /etc/apt/sources.list.d/azure-cli.list')
- command_curl = self.sh_inline("command -v curl", print_output=False)
- if len(command_lsb_release)==0:
- print("Installing curl")
- self.sh(f"{SUDO} apt-get -qqy install curl")
- # Get the Microsoft signing key
- self.sh(f"curl -L https://packages.microsoft.com/keys/microsoft.asc | {SUDO} apt-key add -")
- # Update and install the Azure CLI
- self.sh(f"{SUDO} apt-get update")
- self.sh(f"{SUDO} apt-get -qqy install ca-certificates azure-cli")
- print("Azure CLI is now installed.")
- else:
- print("Azure CLI installed already.")
- def az_login(self):
- if len(os.getenv("AZURE_USERNAME","")) > 0:
- print("User credentials detected; logging in with user")
- self.sh("az login -u $AZURE_USERNAME -p $AZURE_PASSWORD")
- self.sh("az acr login -n pmtolk")
- elif len(os.getenv("AZURE_SP","")) > 0:
- print("Service Principal credentials detected; logging in with Service Principal")
- self.sh("az login --service-principal --tenant $AZURE_SP_TENANT -u $AZURE_SP -p $AZURE_SP_PASSWORD")
- self.sh("az acr login -n pmtolk")
- else:
- print("Login failed; neither user nor Service Principal credentials were provided")
- sys.exit(1)
- def install_odbc(self):
- # Set sudo to work whether logged in as root user or non-root user
- SUDO = self.get_sudo_user()
- self.sh(f"{SUDO} curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - ")
- #Download appropriate package for the OS version
- #Choose only ONE of the following, corresponding to your OS version
- self.sh(f"{SUDO} curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list")
- self.sh(f"{SUDO} apt-get update")
- self.sh(f"{SUDO} ACCEPT_EULA=Y apt-get -y install msodbcsql17")
- # optional: for bcp and sqlcmd
- self.sh(f"{SUDO} ACCEPT_EULA=Y apt-get -y install mssql-tools")
- self.sh("echo 'export PATH=\"\$PATH:/opt/mssql-tools/bin\"' >> ~/.bash_profile")
- self.sh("echo 'export PATH=\"\$PATH:/opt/mssql-tools/bin\"' >> ~/.bashrc")
- self.sh("source ~/.bashrc")
- # optional: for unixODBC development headers
- self.sh(f"{SUDO} apt-get install -y unixodbc-dev")
- def build(self):
- PROJECT_DIR=os.getenv("PROJECT_DIR","")
- # BUILD_SCRIPTS_DIR=os.getenv("BUILD_SCRIPTS_DIR","")
- BASE_IMAGE=os.getenv("BASE_IMAGE", "")
- VERSION=os.getenv("VERSION", "")
- PROJECT_NAME=os.getenv("PROJECT_NAME","")
- ROUTE=os.getenv("ROUTE","")
- CONTAINER_NAME=os.getenv("CONTAINER_NAME","")
- os.chdir(PROJECT_DIR)
- print('build_sh: before calling analyze_and_test')
- # self.sh(f"{BUILD_SCRIPTS_DIR}/analyze_and_test.sh")
- print("build_sh: before docker build")
- self.sh(f"docker build --build-arg base_image={BASE_IMAGE} --build-arg VERSION={VERSION} --build-arg NAME={PROJECT_NAME} --build-arg ROUTE={ROUTE} -t {CONTAINER_NAME} .", shell=False, cwd=f"{PROJECT_DIR}bin/base_image")
- # print("build_sh: beforeexport image")
- # # Capture image_id so we can leverage it for execution and tagging purposes.
- # IMAGE_ID=self.sh_inline(f'docker build --build-arg base_image={BASE_IMAGE} --build-arg VERSION={VERSION} --build-arg NAME={PROJECT_NAME} --build-arg ROUTE={ROUTE} -t {CONTAINER_NAME} . 2>/dev/null')
- # print(f"Successfully built {IMAGE_ID}")
- # for word in $IMAGE_ID
- # do
- # export IMAGE_ID=$word
- # done
- # print(f"echo \"Captured [{IMAGE_ID}] as IMAGE_ID.\"")
- # print("Acceptance test is currently disabled in build.sh")
- # #"$BUILD_SCRIPTS_DIR/run_acceptance_tests.sh"
- # #echo "Acceptance test ran successfully"
- # echo "Running unit test"
- # "$BUILD_SCRIPTS_DIR/run_unit_tests.sh"
- def build_docker (self):
- self.sh("chmod +x ./bin/*")
- # self.sh("chmod +x ./bin/azure/az_install.sh && ./bin/azure/az_install.sh")
- self.az_install()
- # self.sh("chmod +x ./bin/azure/az_login.sh && ./bin/azure/az_login.sh")
- self.az_login()
- # self.sh("chmod +x ./bin/base_image/install_odbc.sh && ./bin/base_image/install_odbc.sh")
- self.install_odbc()
- # self.sh("chmod +x ./bin/build.sh && ./bin/build.sh")
- self.build()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement