def test_check_secrets(self): os.environ['SECRET_ONE'] = '1234' os.environ['SECRET_TWO'] = '5678' pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "popperized/bin/sh@master" args = ["ls -ltr"] secrets = ["SECRET_ONE", "SECRET_TWO"] } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() WorkflowRunner.check_secrets(wf, False, False) WorkflowRunner.check_secrets(wf, True, False) WorkflowRunner.check_secrets(wf, False, True) os.environ.pop('SECRET_ONE') pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "popperized/bin/sh@master" args = ["ls -ltr"] secrets = ["SECRET_ONE", "SECRET_TWO"] } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() os.environ['CI'] = 'false' with patch('getpass.getpass', return_value='1234') as fake_input: WorkflowRunner.check_secrets(wf, False, False) os.environ['CI'] = 'true' os.environ.pop('SECRET_ONE') self.assertRaises(SystemExit, WorkflowRunner.check_secrets, wf, False, False)
def test_get_workflow_env(self): pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "sh" } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() env = WorkflowRunner.get_workflow_env(wf, '/tmp/test_folder') self.assertDictEqual( env, { 'HOME': os.environ['HOME'], 'GITHUB_WORKFLOW': 'sample', 'GITHUB_ACTION': '', 'GITHUB_ACTOR': 'popper', 'GITHUB_REPOSITORY': 'unknown', 'GITHUB_EVENT_NAME': 'push', 'GITHUB_EVENT_PATH': '/tmp/github_event.json', 'GITHUB_WORKSPACE': '/tmp/test_folder', 'GITHUB_SHA': 'unknown', 'GITHUB_REF': 'unknown', 'POPPER_WORKFLOW': 'sample', 'POPPER_ACTION': '', 'POPPER_ACTOR': 'popper', 'POPPER_REPOSITORY': 'unknown', 'POPPER_EVENT_NAME': 'push', 'POPPER_EVENT_PATH': '/tmp/github_event.json', 'POPPER_WORKSPACE': '/tmp/test_folder', 'POPPER_SHA': 'unknown', 'POPPER_REF': 'unknown' })
def test_instantiate_runners(self): pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "sh" args = "ls" } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() env = WorkflowRunner.get_workflow_env(wf, '/tmp/test_folder') WorkflowRunner.instantiate_runners('docker', wf, '/tmp/test_folder', False, False, '12345') self.assertIsInstance(wf.action['a']['runner'], HostRunner) os.makedirs('/tmp/test_folder/actions/sample') pu.write_file('/tmp/test_folder/actions/sample/entrypoint.sh') pu.write_file('/tmp/test_folder/actions/sample/README.md') pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "./actions/sample" } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() env = WorkflowRunner.get_workflow_env(wf, '/tmp/test_folder') WorkflowRunner.instantiate_runners('singularity', wf, '/tmp/test_folder', False, False, '12345') self.assertIsInstance(wf.action['a']['runner'], HostRunner) pu.write_file( '/tmp/test_folder/a.workflow', """ workflow "sample" { resolves = "a" } action "a" { uses = "popperized/bin/sh@master" } """) wf = Workflow('/tmp/test_folder/a.workflow') wf.parse() env = WorkflowRunner.get_workflow_env(wf, '/tmp/test_folder') WorkflowRunner.instantiate_runners('singularity', wf, '/tmp/test_folder', False, False, '12345') self.assertIsInstance(wf.action['a']['runner'], SingularityRunner) WorkflowRunner.instantiate_runners('docker', wf, '/tmp/test_folder', False, False, '12345') self.assertIsInstance(wf.action['a']['runner'], DockerRunner) WorkflowRunner.instantiate_runners('vagrant', wf, '/tmp/test_folder', False, False, '12345') self.assertIsInstance(wf.action['a']['runner'], VagrantRunner)
def run_workflow(**kwargs): kwargs['wfile'] = pu.find_default_wfile(kwargs['wfile']) log.info('Found and running workflow at ' + kwargs['wfile']) # Initialize a Worklow. During initialization all the validation # takes place automatically. wf = Workflow(kwargs['wfile']) wf_runner = WorkflowRunner(wf) # Check for injected actions pre_wfile = os.environ.get('POPPER_PRE_WORKFLOW_PATH') post_wfile = os.environ.get('POPPER_POST_WORKFLOW_PATH') # Saving workflow instance for signal handling popper.cli.interrupt_params['parallel'] = kwargs['parallel'] if kwargs['parallel']: if sys.version_info[0] < 3: log.fail('--parallel is only supported on Python3') log.warning("Using --parallel may result in interleaved output. " "You may use --quiet flag to avoid confusion.") if kwargs['with_dependencies'] and (not kwargs['action']): log.fail('`--with-dependencies` can be used only with ' 'action argument.') if kwargs['skip'] and kwargs['action']: log.fail('`--skip` can\'t be used when action argument ' 'is passed.') on_failure = kwargs.pop('on_failure') wfile = kwargs.pop('wfile') try: if pre_wfile: pre_wf = Workflow(pre_wfile) pre_wf_runner = WorkflowRunner(pre_wf) pre_wf_runner.run(**kwargs) wf_runner.run(**kwargs) if post_wfile: post_wf = Workflow(post_wfile) pre_wf_runner = WorkflowRunner(post_wf) pre_wf_runner.run(**kwargs) except SystemExit as e: if (e.code != 0) and on_failure: kwargs['skip'] = list() kwargs['action'] = on_failure wf_runner.run(**kwargs) else: raise if kwargs['action']: log.info('Action "{}" finished successfully.'.format(kwargs['action'])) else: log.info('Workflow "{}" finished successfully.'.format(wfile))