Search code examples
amazon-web-servicesjenkinsjenkins-pluginsaws-cloudformationaws-codepipeline

AWS Cloudformation template for a codepipeline with jenkins build stage


I need to write a CFT for pipeline with Jenkins integration for build/test. I found this documentation to setup ActionTypeId for the jenkins stage. But this doc does not specify how to set the server url of the jenkins server. And also it is not clear to me where to give the Jenkins Provider name. Is it in the ActionTypeId or in configuration properties?

I could not find any example for this use case in the internet as well.

Please provide a proper example for setup Jenkins Action Provider for AWS Codepipeline using AWS Cloudformation template.

Following is a section from the sample cft I wrote from what I learnt from above doc.

"stages": [
    {
        "name": "Jenkins",
        "actions": [
            ...
            {
                "name": "Jenkins Build",
                "actionTypeId": {
                    "category": "Build",
                    "owner": "Custom",
                    "provider": "Jenkins",
                    "version": "1"
                },
                "runOrder": 2,
                "configuration": {
                    ???
                },
                ...
            }
        ]
    },
    ...
]

Solution

  • The piece of information which was missing for me was that I need to create a Custom Action to use Jenkins as the Action provider for my codepipeline.

    First I added the custom action as below:

    JenkinsCustomActionType: 
        Type: AWS::CodePipeline::CustomActionType
        Properties: 
            Category: Build 
            Provider: !Ref JenkinsProviderName
            Version: 1
            ConfigurationProperties: 
                - 
                    Description: "The name of the build project must be provided when this action is added to the pipeline." 
                    Key: true 
                    Name: ProjectName 
                    Queryable: false
                    Required: true 
                    Secret: false 
                    Type: String 
            InputArtifactDetails: 
                MaximumCount: 5
                MinimumCount: 0 
            OutputArtifactDetails: 
                MaximumCount: 5
                MinimumCount: 0 
            Settings: 
                EntityUrlTemplate: !Join ['', [!Ref JenkinsServerURL, "/job/{Config:ProjectName}/"]]
                ExecutionUrlTemplate: !Join ['', [!Ref JenkinsServerURL, "/job/{Config:ProjectName}/{ExternalExecutionId}/"]]
            Tags:
                - Key: Name
                  Value: custom-jenkins-action-type
    

    The jenkins server URL is given in the settings for Custom Action and the Jenkins provider name is given for Provider. Which were the issues I had initially.

    Then configure the pipeline stage as following:

    DevPipeline:
        Type: AWS::CodePipeline::Pipeline
        DependsOn: JenkinsCustomActionType
        Properties:
            Name: Dev-CodePipeline
            RoleArn:
                Fn::GetAtt: [ CodePipelineRole, Arn ]
            Stages:
                ...
                - Name: DevBuildVerificationTest
                  Actions:
                      - Name: JenkinsDevBVT
                        ActionTypeId:
                            Category: Build
                            Owner: Custom
                            Version: 1
                            Provider: !Ref JenkinsProviderName
                        Configuration:
                            # JenkinsDevBVTProjectName - Jenkins Job name defined as a parameter in the CFT
                            ProjectName: !Ref JenkinsDevBVTProjectName
                        RunOrder: 4
    

    The Custom Action has to be created before the Pipeline. Hence DependsOn: JenkinsCustomActionType