无法在 Python 中实现 ICodePipelineActionFactory

Unable to implement ICodePipelineActionFactory in Python

我正在尝试创建一个 arbitrary CodePipeline action 作为在 Python 中实现的 CDK 管道的一部分。具体来说,在这种情况下,它是一个步骤函数调用,但我也想调用其他类型。无论我做什么,我总是收到相同的错误,提示无法在 stage 对象上找到 add_action 属性。

jsii.errors.JSIIError: '' object has no attribute 'add_action'

我尝试了方法名称的不同变体,用 dir() 检查对象(stage 是一个非常不透明的 InterfaceDynamicProxy 对象),阅读 jsii 文档以查看它们是否有一种列出可用属性的方法,但一无所获。

有人在 Python 中有 jsii 接口实现的工作示例吗?或者你能告诉我下面的代码有什么问题吗?

我在 Mac OS X 上使用带有 Python 3.9.6 和 node.js 16.6.2 的 CDK 1.118.0。

from aws_cdk import core, pipelines, aws_codepipeline_actions, aws_codepipeline, aws_stepfunctions
import jsii
 
 
@jsii.implements(pipelines.ICodePipelineActionFactory)
class SomeStep(pipelines.Step):
    def __init__(self, id_):
        super().__init__(id_)
 
    @jsii.member(jsii_name="produceAction")
    def produce_action(
            self, stage: aws_codepipeline.IStage,
            options: pipelines.ProduceActionOptions,
            # TODO why are these not passed?
            # *,
            # action_name, artifacts, pipeline, run_order, scope,
            # before_self_mutation=None,
            # code_build_defaults=None,
            # fallback_artifact=None
    ) -> pipelines.CodePipelineActionFactoryResult:
        stage.add_action(
            aws_codepipeline_actions.StepFunctionInvokeAction(
                state_machine=aws_stepfunctions.StateMachine.from_state_machine_arn("..."),
                action_name="foo",
                state_machine_input=aws_codepipeline_actions.StateMachineInput.literal({"foo": "bar"}),
                run_order=options["run_order"],
            )
        )
 
        return pipelines.CodePipelineActionFactoryResult(run_orders_consumed=1)
 
 
app = core.App()
 
stage = core.Stage(app, "stage")
stack = core.Stack(stage, "stack")
pipeline_stack = core.Stack(app, "pipeline-stack")
pipeline = pipelines.CodePipeline(
    pipeline_stack,
    "pipeline",
    synth=pipelines.ShellStep("synth", input=pipelines.CodePipelineSource.git_hub("foo/bar", "main"), commands=["cdk synth"])
)
 
pipeline.add_wave("wave").add_stage(stage, pre=[SomeStep("some")])
 
app.synth()

完整错误:

jsii.errors.JavaScriptError: 
  Error: '' object has no attribute 'add_action'
      at KernelHost.completeCallback (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/tmpwwmvzicu/lib/program.js:9462:35)
      at KernelHost.callbackHandler (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/tmpwwmvzicu/lib/program.js:9453:41)
      at Step.value (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/tmpwwmvzicu/lib/program.js:8323:49)
      at CodePipeline.pipelineStagesAndActionsFromGraph (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/pipelines/lib/codepipeline/codepipeline.js:154:48)
      at CodePipeline.doBuildPipeline (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/pipelines/lib/codepipeline/codepipeline.js:116:14)
      at CodePipeline.buildPipeline (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/pipelines/lib/main/pipeline-base.js:93:14)
      at CodePipeline.buildJustInTime (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/pipelines/lib/main/pipeline-base.js:101:18)
      at Object.visit (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/pipelines/lib/main/pipeline-base.js:42:57)
      at recurse (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/core/lib/private/synthesis.js:86:20)
      at recurse (/private/var/folders/ln/r1dlp_xj6t57ddclvh7zgl8m0000gp/T/jsii-kernel-x3iY7A/node_modules/@aws-cdk/core/lib/private/synthesis.js:98:17)
 
The above exception was the direct cause of the following exception:
 
Traceback (most recent call last):
  File "~/dev/cdk-playground/app.py", line 55, in <module>
    app.synth()
  File ".../lib/python3.9/site-packages/aws_cdk/core/__init__.py", line 16432, in synth
    return typing.cast(aws_cdk.cx_api.CloudAssembly, jsii.invoke(self, "synth", [options]))
  File ".../lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 128, in wrapped
    return _recursize_dereference(kernel, fn(kernel, *args, **kwargs))
  File ".../lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 348, in invoke
    return _callback_till_result(self, response, InvokeResponse)
  File ".../lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 216, in _callback_till_result
    response = kernel.sync_complete(
  File ".../lib/python3.9/site-packages/jsii/_kernel/__init__.py", line 386, in sync_complete
    return self.provider.sync_complete(
  File ".../lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 382, in sync_complete
    resp = self._process.send(_CompleteRequest(complete=request), response_type)
  File ".../lib/python3.9/site-packages/jsii/_kernel/providers/process.py", line 326, in send
    raise JSIIError(resp.error) from JavaScriptError(resp.stack)
jsii.errors.JSIIError: '' object has no attribute 'add_action'
Subprocess exited with error 1

AWS 已解决 jsii 中的问题。

https://github.com/aws/jsii/issues/2963

它应该在 CDK 1.121.0 中可用。