关于Jenkins的Codedeploy 小结

1. 首先,这里使用到的是Jenkins job的流水线,语法可以参考:Jenkins 术语表

2. 那么,我们为什么要打包称zip包。

    因为当我们需要用到AWS的Codedeploy 服务的时候,就需要先把我们应用的源码打包成zip上传到S3。通过Jenkins的话可以很方便的一键打包所有东西到一个zip里面,并且通过yml文件来执行一些自动化部署的操作。Maven打包Zip(包含jar)

3. 接下来有两步。第一个是Jenkins package到S3,第二个是Jenkins deploy到指定的EC2。

4. Jenkins package

    1) 假设Jenkins安装完成。我们先创建一个jenkins job,如图:

关于Jenkins的Codedeploy 小结_第1张图片

    2) 创建完成后,进入配置。

关于Jenkins的Codedeploy 小结_第2张图片

   package流水线demo:

environment {
	CHECKRESULT=""
}

pipeline {
	agent {label "awsjenklinux"}
	tools{
	    maven 'Maven 3.2.5'
	}
    options {
        buildDiscarder(logRotator(numToKeepStr: '5',daysToKeepStr:'16'))
        timeout(time: 30, unit: 'MINUTES')
    }
    parameters {

        string(name: 'GIT_REPO', defaultValue: 'https://test.com/scm/myproject.git', description: '')
        choice(choices: ['YES','NO'], description: 'default to YES', name: 'DeployFlag')
        choice(choices: ['cn-east-1','cn-west-2'], description: '', name: 'REGION')
        choice(choices: ['111011193316', '2222215333393'], description: '', name: 'USER_ID')
       
        choice(choices: ['dev', 'qa', 'prd'], description: '', name: 'RUN_ENV')
        choice(choices: ['module1','module2','module3','module4'], description: '', name: 'application_dir')
        choice(choices: ['s3-code-package','s3-code-package-bg'], description: '', name: 'bucket')

    }
    environment {
        PROJECT_NAME = "myproject"
        JENKIN_ROLE_NAME='role-Deploy'
        ROOT_BACKEND_PATH = "${WORKSPACE}"
        MAVEN_HOME = "${tool 'Maven 3.5.3 -Linux -Windows'}"
        
        VERSION_NUMBER = "0.0.${BUILD_NUMBER}.${RUN_ENV}"
        mvn_package_name = "target/${application_dir}-0.0.1-SNAPSHOT.zip"
        application_dirs = "${PROJECT_NAME}/${application_dir}"
    }
    stages {

        stage('PullCode'){
            steps{
                configFileProvider([configFile(fileId: '123a1944-605d-2280-a1ec-5e1115bb01fc', variable: 'pullcode')]) {
                    script{
                        def pullcode = load "$pullcode"
                        pullcode.call()
                    }
                }
            }
          
        }

        stage( 'SecurityTest' ) {
            when {
                environment ignoreCase: true, name: 'SKIP_SECURITY_TEST', value: 'NO'
            }
            agent {label "redhat_linux"}
            steps{
                configFileProvider([configFile(fileId: 'e9432a23-8e11-22e1-aa60-123439512fe1', variable: 'checkmarx')]) {
                    script{
                        def checkmarx = load "$checkmarx"
                        checkmarx.call()
                    }
                }
            }
        }
        
        stage('PackageToS3' ) {
	        when {
                environment ignoreCase: true, name: 'DeployFlag', value: 'YES'
                beforeAgent true
            }
            steps{
                configFileProvider([configFile(fileId: 'fd712345-1ef1-4ba3-a311-66666aa899bd', variable: 'buildPackage')]) {
                    script{

                        def UPLOAD_SCRIPT = '''
                            cd myproject
                            ${MAVEN_HOME}/bin/mvn package -U -Dmaven.test.skip=true -am
                            cd ../
                            source terraform_scripts/role.sh ${USER_ID} ${JENKIN_ROLE_NAME}
                            aws s3 cp ${application_dirs}/${mvn_package_name} s3://${bucket}/code-package/${application_dirs}_${VERSION_NUMBER}.zip
                            '''
                        sh UPLOAD_SCRIPT
                        echo "VERSION_NUMBER:  ${VERSION_NUMBER}"
                    }
                }
            }
        }
    }
}

说明

a. parameters 作为启动任务时的输入参数,可以输入文本内容也可以选择下拉框。如图:

关于Jenkins的Codedeploy 小结_第3张图片

b. environment作为我们自定义的变量,这个变量可以用parameters 的参数名来传值。

c. 每一个stage作为一个阶段任务:PullCode从Git拉取代码;SecurityTest执行安全性检测;PackageToS3执行mvn命令打包,并且上传到s3。

3) 上面是一些流水线的自动化部署的代码,语法类似py。现在重点是如何打包成zip,这个时候得通过maven的pom来配置了。

如何打包称zip可以参考这篇文章:Maven打包Zip(包含jar),最终打包成这个样子,如图:

关于Jenkins的Codedeploy 小结_第4张图片

 正如上面的jenkins job里面的${MAVEN_HOME}/bin/mvn package -U -Dmaven.test.skip=true -am,执行jenkins job后会执行mvn package 打包命令。

4) 上一步提及到的appspec.yml指的是deploy之后执行的一些自动化操作,具体的说明可以看:关于AWS Codedeploy的使用 小结。

5) 流水线最后一步输出了number:echo "VERSION_NUMBER:  ${VERSION_NUMBER}"。记下这个编号。

    

   或者,如图的558就是我们要的number,但是可能会有前缀,比如1.0,看一次job日志之后就可以确定前缀是什么了。

5. Jenkins deploy

    上一步我们已经完成了源码的打包并且已经上传到了S3。那么现在我们将其发布到指定的EC2.

   1) 首先当然是先创建一个jenkins job。

   2) 然后写入我们的流水线任务:

stage('deploy') {
	steps{
		configFileProvider([configFile(fileId: '63111193b-123ac-433-a910-18fa33sdf57', variable: 'role')]) {
			script{
				def DEPLOY_SCRIPT = '''
							   pwd
							   source ${role} ${USER_ID} ${JENKIN_ROLE_NAME}
							   aws --region ${REGION} deploy create-deployment \
							   --application-name myproject-code-deploy \
							   --deployment-group-name ${code_deploy_group} \
								--s3-location bucket=${bucket},key=code-package/${application_dirs}_${VERSION_NUMBER}.zip,bundleType=zip
							   '''
				sh DEPLOY_SCRIPT
			}
		}
	}
}

   3) 里面的aws命令是操作:Aws Codedeploy。流水线代码主要是实现自动化操作。

    具体的手动操作可以看下这篇文章:关于AWS Codedeploy的使用 小结。

 

 

你可能感兴趣的:(Jenkins,CodeDeploy,软件/工具,Jenkins)