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,如图:
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 作为启动任务时的输入参数,可以输入文本内容也可以选择下拉框。如图:
b. environment作为我们自定义的变量,这个变量可以用parameters 的参数名来传值。
c. 每一个stage作为一个阶段任务:PullCode从Git拉取代码;SecurityTest执行安全性检测;PackageToS3执行mvn命令打包,并且上传到s3。
3) 上面是一些流水线的自动化部署的代码,语法类似py。现在重点是如何打包成zip,这个时候得通过maven的pom来配置了。
如何打包称zip可以参考这篇文章:Maven打包Zip(包含jar),最终打包成这个样子,如图:
正如上面的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的使用 小结。