需要提一下,现在新安装的没有这个选项,需要在插件里安装一下 Maven Integration
java配置,其他配置查看以前文章
发布到服务器,DockerFile部署自动构建
创建一个Pipeline SCM项目 jenkins项目名为sample-tezst (和发布的工程名保持一致)
在工程的根目录下创建Dockerfile文件和Jenkins_docker文件
pipeline {
agent {label 'master'}
tools{
maven 'maven'
}
environment {
GIT_PROJECT_ADDR="git@gitee.com:uncleqiao/springboot-test.git" //项目的git地址
JENKINS_WORKSPACE="/root/.jenkins/workspace" //jenkins存放文件的地址
PROJECT_NAME="${JOB_NAME}" // 项目名
JAR_NAME="sample-tezst-0.0.1-SNAPSHOT.jar" // 项目生成的jar的名字
_NAME="sample-tezst" // 镜像名一般和项目名相同
_ADDR="repository/qiao_namespace/${ _NAME}" // 镜像的位置
VERSION_ID="${BUILD_ID}"
}
stages {
stage('pullCode'){
steps{
echo 'This is a pullCode step'
//git branch: "${BRANCH}", credentialsId: '1001', url: "${GIT_PROJECT_ADDR}"
checkout scm
}
}
stage('Build') {
steps{
echo 'This is a Build step'
// 在有Jenkinsfile同一个目录下(项目的根目录下)
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
// 创建目录(如果不存在),并把jar文件上传到该目录下
stage('ssh') {
steps{
echo 'push jar to target server'
sh '''
ole_ _id=`docker s|grep ${ _NAME}|grep ${VERSION_ID}|awk '{print $3}'`
if [[ -n "${ole_ _id}" ]]; then
docker rmi -f ${ole_ _id}
fi
docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${ _NAME}:${VERSION_ID} .
new_ _id=`docker s|grep ${ _NAME}|grep ${VERSION_ID}|awk '{print $3}'`
sudo docker tag ${new_ _id} ${ _ADDR}:${VERSION_ID}
sudo docker push ${ _ADDR}:${VERSION_ID}
'''
}
}
stage('run') {
// 在应用服务器节点 test
agent {
node {
label 'test'
//customWorkspace "${SERVER_TARGET_PATH}" //此参数会初始化目录 注意填写
}
}
options {
// 不让它切换到节点上自动从仓库拉取项目
skipDefaultCheckout()
}
steps {
echo 'pull and docker run'
withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
sh '''
sudo docker login --username=yourusername --password=yourpassword ccr.ccs.tencentyun.com
sudo docker pull ${ _ADDR}:${VERSION_ID}
container_id=`docker ps|grep ${ _ADDR}:${VERSION_ID}|awk '{print $1}'`
if [ -n "${container_id}" ]; then
docker rm -f "${container_id}"
fi
old_pid=`ps -ef|grep ${JAR_NAME}|grep -v grep|awk '{print $2}'`
if [[ -n $old_pid ]]; then
kill -9 $old_pid
fi
old_ =`docker s|grep ${ _ADDR}|grep ${VERSION_ID}`
if [[ -n $old_ ]]; then
old_ _id=`echo ${old_ }|awk '{print $3}'`
docker rmi -f ${old_ _id}
fi
sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${ _ADDR}:${VERSION_ID}
'''
}
}
}
}
}
if -n str 这个命令在使用的时候如果str为空,也是true,可以使用 if [ -n {str}x" != "x"
]或者使用if [[ -n ![{str} ]]来判断
shell语法中,](https://math.jianshu.com/math?formula=%7Bstr%7D%20%5D%5D%E6%9D%A5%E5%88%A4%E6%96%AD%20shell%E8%AF%AD%E6%B3%95%E4%B8%AD%EF%BC%8C)()`
和 (两个单引号) 可以在子shell中执行命令,但是这儿$()不支持
idea没有jenkinsfile的语法提示,很容易出错,这个很难受
checkout scm , 这个scm是创建jenkins流水线时选择的,属于特殊变量,代表了你的仓库信息,自动从仓库中获取项目
将拉取下来的项目进行编译并打包
将打包好的项目build成docker镜像,然后推送到镜像仓库(这里可以分成两步)
ole_ _id=`docker s| grep ${ _NAME} | grep ${VERSION_ID}|awk '{print $3}'`
if [[ -n "${ole_ _id}" ]]; then
docker rmi -f ${ole_ _id}
fi
docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${ _NAME}:${VERSION_ID} .
new_ _id=`docker s | grep ${ _NAME} | grep ${VERSION_ID} | awk '{print $3}'`
sudo docker tag ${new_ _id} repoistory/qiao_namespace/${ _NAME}:${VERSION_ID}
sudo docker push repoistory/qiao_namespace/${ _NAME}:${VERSION_ID}
应用服务器拉取项目并且运行, 这一步要选择节点(应用服务器,如果是集群,就不用节点用scp登陆吧)
sudo docker login --username=yourusername --password=yourpassword repository
sudo docker pull repository/qiao_namespace/${ _NAME}:${VERSION_ID}
container_id=`docker ps | grep ${ _ADDR}:${VERSION_ID} | awk '{print $1}'`
if [ -n "${container_id}" ]; then
docker rm -f "${container_id}"
fi
pid=`ps -ef | grep ${JAR_NAME}| grep -v grep | awk '{print $2}'`
if [[ -n $pid ]]; then
kill -9 $pid
fi
old_ =`docker s|grep ${ _ADDR}|grep ${VERSION_ID}`
if [[ -n $old_ ]]; then
old_ _id=`echo ${old_ }|awk '{print $3}'`
docker rmi -f ${old_ _id}
fi
sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${ _ADDR}:${VERSION_ID}
FROM repository/qiao_namespace/myjdk8:v1
ARG jar_name={jar_name:-sample-teszt-0.0.1-SNAPSHOT.jar}
RUN mkdir -p /usr/local/project
WORKDIR /usr/local/project
COPY ./target/sample-teszt-0.0.1-SNAPSHOT.jar ./
EXPOSE 8081
CMD java -jar -Dserver.port=8081 springboot-test-0.0.1-SNAPSHOT.jar
执行完毕后我们登陆到应用服务器,看到容器已经启动
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。