Docker安装Jenkins

文章目录

    • 一、Docker安装Jenkins
      • 1.查看Jenkins LTS 版本
      • 2.拉取jenkins镜像
      • 3.创建挂载数据卷
      • 4.配置并启动jenkins
      • 5.通过`IP:8600`启动jenkins并初始化
    • 二、Jenkins插件安装+流水线创建
      • 1.Jenkins安装插件
      • 2.设置系统配置+全局工具配置
      • 3.新建Pipeline流水线
    • 三、Jenkins自动化部署Docker+SpringCloud项目
      • 1.创建微服务项目,并推送到git上
      • 2.创建`Jenkinsfile`文件
      • 3.拉取代码
      • 4.maven打包编译成docker镜像
      • 5.上传镜像文件到镜像仓库
      • 6.拉取镜像并应用部署
      • 7.使用gitee的webhook功能
      • 8.安装ngrok内网穿透,映射本地jenkins端口
      • 9.gitee中设置webhook功能
      • 10.推送1.1.0版本,gitee的webhooks自动触发Jenkins自动部署
    • 四、使用jenkins加阿里云云效webhooks
      • 1.安装`Generic Webhook Trigger`
      • 2.用户管理里面添加`apiToken`
      • 3.流水线配置中添加Generic Webhook Trigger配置
      • 4.设置只针对项目的某个分支触发操作
      • 5.阿里云云效添加webHooks配置
      • 6.推送1.1.2版本到云效代码库,触发jenkins自动部署
      • 7.整个钉钉实现版本推送通知
    • 五、Jenkins自动化部署vue-element-admin项目
      • 1.安装nodejs插件
      • 2.全局工具配置
      • 3.新建流水线
      • 4.在vue-element-admin下面创建Jenkinsfile文件
      • 5.拉取代码
      • 6.使用nodejs打包部署vue-element-admin
      • 7.上传服务器并替换vue项目

一、Docker安装Jenkins

1.查看Jenkins LTS 版本

Jenkins官网:https://www.jenkins.io/zh/download/

Docker安装Jenkins_第1张图片

2.拉取jenkins镜像

docker pull jenkins/jenkins:2.346.1

Docker安装Jenkins_第2张图片

3.创建挂载数据卷

创建jenkins_home文件夹

image-20220625095530322

赋予jenkins_home文件夹访问权限

chown -R 1000 /software/jenkins/jenkins_home/
chmod 777 jenkins_home

image-20220625100506142

赋予 /var/run/docker.sock文件访问权限

chmod 777 /var/run/docker.sock

image-20220625100759794

4.配置并启动jenkins

docker run -d -m 2g -p 8600:8080 -p 50000:50000 \
     --restart=always \
     -v /home/software/jenkins/jenkins_home:/var/jenkins_home \
     -v /var/run/docker.sock:/var/run/docker.sock \
     -v /usr/bin/docker:/usr/bin/docker \
     --name jenkins \
    jenkins/jenkins:2.346.1
  • -d: 后台启动
  • -m: 设置内存大小(m-M,g-G)
  • -u: 使用管理员权限启动
  • --restar=always: 开机启动,失败也会一直重启
  • -p: 映射端口
  • -v: 挂载数据卷
    • /var/jenkins_home: jenkins挂载目录
    • /var/run/docker.sock: 外部docker挂载目录
    • /usr/bin/docker: 外部docker启动目录
  • --name: 容器名称

image-20220625095720710

进入jenkens容器内部,查看docker是否挂载成功

docker exec -it jenkins /bin/bash
docker version

image-20220625100625614

5.通过IP:8600启动jenkins并初始化

Docker安装Jenkins_第3张图片

  • 初始密码在日志文件中可查看,保存密码的目录:/var/jenkins_home/secrets/initiaAdminPassword

Docker安装Jenkins_第4张图片

Docker安装Jenkins_第5张图片

Docker安装Jenkins_第6张图片

image-20220625101734942

Docker安装Jenkins_第7张图片

Docker安装Jenkins_第8张图片

Docker安装Jenkins_第9张图片

二、Jenkins插件安装+流水线创建

1.Jenkins安装插件

点击 Manage Jenkins(系统管理) -> Manage Plugins(插件管理)

Docker安装Jenkins_第10张图片

Docker安装Jenkins_第11张图片

maven插件

Docker安装Jenkins_第12张图片

Publish Over SSHSSH插件

Docker安装Jenkins_第13张图片

安装完插件,重启Jenkins

Docker安装Jenkins_第14张图片

Docker安装Jenkins_第15张图片

2.设置系统配置+全局工具配置

下载maven3.8.6版本并上传到jenkins文件夹下

mkdir /software/jenkins/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation

image-20220625111656227

修改maven3.8.6文件夹下面的conf文件夹下面的settings.xml,修改下载源


<mirror>
    <id>alimavenid>
    <name>aliyun mavenname>
    <url>
        http://maven.aliyun.com/nexus/content/groups/public/
    url>
    <mirrorOf>centralmirrorOf>
mirror>

给mvn命令添加权限

chmod a+x /software/jenkins/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.8.6/bin/mvn

系统管理 -> 全局工具配置 -> maven

Docker安装Jenkins_第16张图片

Docker安装Jenkins_第17张图片

系统管理 -> 系统配置 -> 环境变量

MAVEN_HOME
/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.8.6

PATH+EXTRA
$MAVEN_HOME/bin

Docker安装Jenkins_第18张图片

系统管理 -> 系统配置 -> Publish over SSH

Docker安装Jenkins_第19张图片

Docker安装Jenkins_第20张图片

Docker安装Jenkins_第21张图片

设置jenkins时区

  • 用户名称 -> 设置

Docker安装Jenkins_第22张图片

Docker安装Jenkins_第23张图片

3.新建Pipeline流水线

新增流水线

Docker安装Jenkins_第24张图片

勾选参数化构建过程,添加字符参数和选项参数

  • 字符参数:设置分支参数

Docker安装Jenkins_第25张图片

  • 选项参数:设置微服务项目名称

Docker安装Jenkins_第26张图片

添加流水线使用Jenkinsfile文件配置

Docker安装Jenkins_第27张图片

Docker安装Jenkins_第28张图片

Docker安装Jenkins_第29张图片

Docker安装Jenkins_第30张图片

三、Jenkins自动化部署Docker+SpringCloud项目

1.创建微服务项目,并推送到git上

test-cloud
	|-test-common
		|-test-common-cloud
		|-test-common-mybatisplus
		|-test-common-redis
		|-test-common-spring
		|-test-common-swagger
		|-test-common-tool
    |-test-seata
    	|-test-seata-account
    		|-src
    		|-Dockerfile
    		|-pom.xml
    	|-test-seata-order
    		|-src
    		|-Dockerfile
    		|-pom.xml
    	|-test-seata-storage
    		|-src
    		|-Dockerfile
    		|-pom.xml
    	|-pom.xml
    |-Jenkinsfile
    |-pom.xml

2.创建Jenkinsfile文件

node {
	def mvnHome
	stage('测试') {
		sh "echo 测试流水线Jenkinsfile文件"
	}
}

Jenkins的选择立即构建,查看构建结果

Docker安装Jenkins_第31张图片

Docker安装Jenkins_第32张图片

3.拉取代码

流水线项目 -> 流水线语法 -> checkout: Check out from version control -> 复制流水线脚本

Docker安装Jenkins_第33张图片

Docker安装Jenkins_第34张图片

Docker安装Jenkins_第35张图片

编辑Jenkinsfile文件,添加拉取代码

node {
	def mvnHome
	stage('拉取代码') {
		checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '2524582f-70ea-4384-a607-06e4c82a971f', url: 'https://gitee.com/lingjian1027/test-cloud.git']]])
	}
}

Docker安装Jenkins_第36张图片

Docker安装Jenkins_第37张图片

4.maven打包编译成docker镜像

添加Dockerfile文件,在每个微服务中都需要添加

FROM openjdk:8-jdk-oraclelinux8
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

pom.xml文件中添加maven打包命令,在每个微服务中都需要添加


<version>1.0.0version>
    <build>
        <finalName>test-seata-accountfinalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
            <plugin>
                <artifactId>maven-resources-pluginartifactId>
                <configuration>
                    <encoding>utf-8encoding>
                    <useDefaultDelimiters>trueuseDefaultDelimiters>
                configuration>
            plugin>
            <plugin>
                <groupId>com.spotifygroupId>
                <artifactId>dockerfile-maven-pluginartifactId>
                <version>1.4.10version>
                <executions>
                    <execution>
                        <id>defaultid>
                        <goals>
                            
                            <goal>buildgoal>
                            <goal>pushgoal>
                        goals>
                    execution>
                executions>
                <configuration>
                    <repository>${project.build.finalName}repository>
                    <tag>${project.version}tag>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jarJAR_FILE>
                    buildArgs>
                configuration>
            plugin>
        plugins>
    build>

编辑Jenkinsfile文件,添加maven打包

node {
	def mvnHome
	stage('拉取代码') {
		checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '2524582f-70ea-4384-a607-06e4c82a971f', url: 'https://gitee.com/lingjian1027/test-cloud.git']]])
	}

    stage('编译,打包微服务工程') {
        // 编译打包
        sh "mvn clean install"
    }
}

Docker安装Jenkins_第38张图片

Docker安装Jenkins_第39张图片

Docker安装Jenkins_第40张图片

5.上传镜像文件到镜像仓库

添加全局docker凭证: 系统管理 -> Manage Credentials -> 全局 -> 添加凭证

Docker安装Jenkins_第41张图片

Docker安装Jenkins_第42张图片

流水线项目 -> 流水线语法 -> withCredentials: Bind credentials to variables -> 绑定新增(Username and password (separated))

Docker安装Jenkins_第43张图片

编辑Jenkinsfile文件,添加上传镜像

def tag = "1.0.7"
def aliyun_url = "registry.cn-hangzhou.aliyuncs.com"
def aliyun_project = "testcloud1"
def storage = "test-seata-storage"
def order = "test-seata-order"
def account = "test-seata-account"
node {
	def mvnHome
	stage('拉取代码') {
		checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '2524582f-70ea-4384-a607-06e4c82a971f', url: 'https://gitee.com/lingjian1027/test-cloud.git']]])
	}

    stage('编译,打包微服务工程') {
        // 编译打包
        sh "mvn clean install"
    }

    stage('上传镜像') {
            sh "docker version"
            // 定义镜像名称
            def storageName = "test-seata-storage:${tag}"
            def orderName = "test-seata-order:${tag}"
            def accountName = "test-seata-account:${tag}"

            withCredentials([usernamePassword(credentialsId: '034e0cb5-d092-4d59-a3d9-2df6b47cc47e', passwordVariable: 'password', usernameVariable: 'username')]) {
                // some block
                sh "docker login --username=${username} --password=${password} ${aliyun_url}"
                sh "docker tag ${storageName} ${aliyun_url}/${aliyun_project}/${storageName}"
                sh "docker tag ${orderName} ${aliyun_url}/${aliyun_project}/${orderName}"
                sh "docker tag ${accountName} ${aliyun_url}/${aliyun_project}/${accountName}"

                sh "docker push ${aliyun_url}/${aliyun_project}/${storageName}"
                sh "docker push ${aliyun_url}/${aliyun_project}/${orderName}"
                sh "docker push ${aliyun_url}/${aliyun_project}/${accountName}"
                sh "echo 镜像上传成功"

                sh "docker rmi ${storageName}"
                sh "docker rmi ${orderName}"
                sh "docker rmi ${accountName}"
                sh "echo 删除原始镜像成功"
            }
        }
}

Docker安装Jenkins_第44张图片

Docker安装Jenkins_第45张图片

Docker安装Jenkins_第46张图片

Docker安装Jenkins_第47张图片

6.拉取镜像并应用部署

流水线项目 -> 流水线语法 -> sshPublisher: Send build artifacts over SSH -> 生成流水线脚本

Docker安装Jenkins_第48张图片

Docker安装Jenkins_第49张图片

编辑Jenkinsfile文件,添加应用部署

注意execCommand: "/software/project/deploy.sh $tag",后面的路径必须由单引号改为双引号,不然外部传参,无法传参

def tag = "1.0.7"
def aliyun_url = "registry.cn-hangzhou.aliyuncs.com"
def aliyun_project = "testcloud1"
def storage = "test-seata-storage"
def order = "test-seata-order"
def account = "test-seata-account"
node {
	def mvnHome
	stage('拉取代码') {
		checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '2524582f-70ea-4384-a607-06e4c82a971f', url: 'https://gitee.com/lingjian1027/test-cloud.git']]])
	}

    stage('编译,打包微服务工程') {
        // 编译打包
        sh "mvn clean install"
    }

    stage('上传镜像') {
        sh "docker version"
        // 定义镜像名称
        def storageName = "test-seata-storage:${tag}"
        def orderName = "test-seata-order:${tag}"
        def accountName = "test-seata-account:${tag}"

        withCredentials([usernamePassword(credentialsId: '034e0cb5-d092-4d59-a3d9-2df6b47cc47e', passwordVariable: 'password', usernameVariable: 'username')]) {
            // some block
            sh "docker login --username=${username} --password=${password} ${aliyun_url}"
            sh "docker tag ${storageName} ${aliyun_url}/${aliyun_project}/${storageName}"
            sh "docker tag ${orderName} ${aliyun_url}/${aliyun_project}/${orderName}"
            sh "docker tag ${accountName} ${aliyun_url}/${aliyun_project}/${accountName}"

            sh "docker push ${aliyun_url}/${aliyun_project}/${storageName}"
            sh "docker push ${aliyun_url}/${aliyun_project}/${orderName}"
            sh "docker push ${aliyun_url}/${aliyun_project}/${accountName}"
            sh "echo 镜像上传成功"

            sh "docker rmi ${storageName}"
            sh "docker rmi ${orderName}"
            sh "docker rmi ${accountName}"
            sh "echo 删除原始镜像成功"
        }
    }

    stage('拉取镜像并应用部署') {
        sh "echo 应用部署"
        sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/software/project/deploy.sh $tag", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

在服务器的/software/project目录下面添加deploy.sh执行文件

#!/bin/bash
#接收外部参数,$1对应第一个参数,$2对应第二个参数,参数之间使用空格分割
tag=$1
aliyun_url='registry.cn-hangzhou.aliyuncs.com'
aliyun_project='testcloud1'
storage='test-seata-storage'
order='test-seata-order'
account='test-seata-account'

storageName=${aliyun_url}/${aliyun_project}/${storage}:${tag}
orderName=${aliyun_url}/${aliyun_project}/${order}:${tag}
accountName=${aliyun_url}/${aliyun_project}/${account}:${tag}

echo "${tag}" >> /software/project/log.txt
echo "storageName ${storageName}" >> /software/project/log.txt
echo "orderName ${orderName}" >> /software/project/log.txt
echo "accountName ${accountName}" >> /software/project/log.txt

#删除镜像
storageImageId=`docker images -q --filter reference=${storageName}`
if [ "$storageImageId" != "" ]; then
    #删除镜像
    docker rmi -f $storageImageId
    echo "成功删除storage镜像"
fi
orderImageId=`docker images -q --filter reference=${orderName}`
if [ "$orderImageId" != "" ]; then
    #删除镜像
    docker rmi -f $orderImageId
    echo "成功删除order镜像"
fi
accountImageId=`docker images -q --filter reference=${accountName}`
if [ "$accountImageId" != "" ]; then
    #删除镜像
    docker rmi -f $accountImageId
    echo "成功删除account镜像"
fi

#登录docker
docker login --username=剑灵服务器3 --password=ling10jian1992 ${aliyun_url}

# 拉取镜像
docker pull ${storageName}
docker pull ${orderName}
docker pull ${accountName}

#查询容器是否存在,存在则删除
storageContainerId=`docker ps -aq --filter name=${storage}`
if [ "$storageContainerId" != "" ]; then
	#停掉容器
    docker stop $storageContainerId
    #删除容器
    docker rm $storageContainerId
    echo "成功删除storage容器"
fi
orderContainerId=`docker ps -aq --filter name=${order}`
if [ "$orderContainerId" != "" ]; then
	#停掉容器
    docker stop $orderContainerId
    #删除容器
    docker rm $orderContainerId
    echo "成功删除order容器"
fi
accountContainerId=`docker ps -aq --filter name=${account}`
if [ "$accountContainerId" != "" ]; then
	#停掉容器
    docker stop $accountContainerId
    #删除容器
    docker rm $accountContainerId
    echo "成功删除account容器"
fi

# 启动容器
docker run -d -p 8882:8882 -m 512m --name ${account} ${accountName}
docker run -d -p 8881:8881 -m 512m --name ${order} ${orderName}
docker run -d -p 8883:8883 -m 512m --name ${storage} ${storageName}

Docker安装Jenkins_第50张图片

Docker安装Jenkins_第51张图片

Docker安装Jenkins_第52张图片

7.使用gitee的webhook功能

下载gitee插件,安装完成后重启Jenkins

Docker安装Jenkins_第53张图片

Docker安装Jenkins_第54张图片

Docker安装Jenkins_第55张图片

8.安装ngrok内网穿透,映射本地jenkins端口

ngrok官网地址:https://ngrok.com/

Docker安装Jenkins_第56张图片

注册账号并下载Linux版本

Docker安装Jenkins_第57张图片

上传服务器,启用并映射IP:8600端口

  • 解压并设置全局运用
tar xvzf ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin

image-20220625143851895

  • 设置登录权限token
ngrok config add-authtoken <token>

Docker安装Jenkins_第58张图片

  • 运行ngrok,需要一直保持在线连接,二级域名才能有效
ngrok http 192.168.80.128:8600

Docker安装Jenkins_第59张图片

9.gitee中设置webhook功能

Docker安装Jenkins_第60张图片

Docker安装Jenkins_第61张图片

Docker安装Jenkins_第62张图片

10.推送1.1.0版本,gitee的webhooks自动触发Jenkins自动部署

Docker安装Jenkins_第63张图片

Docker安装Jenkins_第64张图片

四、使用jenkins加阿里云云效webhooks

1.安装Generic Webhook Trigger

Docker安装Jenkins_第65张图片

2.用户管理里面添加apiToken

Docker安装Jenkins_第66张图片

3.流水线配置中添加Generic Webhook Trigger配置

Docker安装Jenkins_第67张图片

4.设置只针对项目的某个分支触发操作

  • Generic Webhook TriggerPost content parameters中添加参数
ref

$.ref // 勾选JSONpath

Docker安装Jenkins_第68张图片

  • Optional filter添加正则匹配
^refs/heads/(test|main)$

$ref

Docker安装Jenkins_第69张图片

5.阿里云云效添加webHooks配置

Docker安装Jenkins_第70张图片

Docker安装Jenkins_第71张图片

6.推送1.1.2版本到云效代码库,触发jenkins自动部署

Docker安装Jenkins_第72张图片

Docker安装Jenkins_第73张图片

Docker安装Jenkins_第74张图片

7.整个钉钉实现版本推送通知

点击 Manage Jenkins(系统管理) -> Manage Plugins(插件管理) -> 可选插件(DingTalk)

Docker安装Jenkins_第75张图片

在钉钉中创建钉钉群,并设置机器人

Docker安装Jenkins_第76张图片

Docker安装Jenkins_第77张图片

Docker安装Jenkins_第78张图片

Docker安装Jenkins_第79张图片

Docker安装Jenkins_第80张图片

Docker安装Jenkins_第81张图片

点击 Manage Jenkins(系统管理) -> Configure System(系统配置) -> 钉钉

Docker安装Jenkins_第82张图片

在流水线中勾选钉钉,即可使用

Docker安装Jenkins_第83张图片

五、Jenkins自动化部署vue-element-admin项目

1.安装nodejs插件

Docker安装Jenkins_第84张图片

2.全局工具配置

下载nodejs16.15.1包并上传到jenkins_home文件夹下面

  • 下载地址:https://nodejs.org/dist/v16.15.1/node-v16.15.1-linux-x64.tar.gz

image-20220629085129727

系统管理 -> 全局工具配置 -> NodeJs

Docker安装Jenkins_第85张图片

3.新建流水线

Docker安装Jenkins_第86张图片

Docker安装Jenkins_第87张图片

Docker安装Jenkins_第88张图片

4.在vue-element-admin下面创建Jenkinsfile文件

node {
	def mvnHome
	stage('测试vue') {
    	
   }
}

Docker安装Jenkins_第89张图片

Docker安装Jenkins_第90张图片

5.拉取代码

流水线项目 -> 流水线语法 -> checkout: Check out from version control -> 复制流水线脚本

Docker安装Jenkins_第91张图片

Docker安装Jenkins_第92张图片

编辑Jenkinsfile文件,添加拉取代码

node {
	def mvnHome
	stage('拉取代码') {
    checkout([$class: 'GitSCM', branches: [[name: '*/test']], extensions: [], userRemoteConfigs: [[credentialsId: '2b610a7f-5a1a-4d0c-8f93-29aabe182c88', url: 'https://codeup.aliyun.com/6191d29d38b0ff04d2a421d4/huameng_safe_product/safe-product-web.git']]])
   }
}

Docker安装Jenkins_第93张图片

6.使用nodejs打包部署vue-element-admin

流水线项目 -> 流水线语法 -> nodejs: Provide Node & npm bin/folder to PATH -> 复制流水线脚本

Docker安装Jenkins_第94张图片

编辑Jenkinsfile文件,添加nodejs打包

node {
	def mvnHome
	stage('拉取代码') {
      checkout([$class: 'GitSCM', branches: [[name: '*/test']], extensions: [], userRemoteConfigs: [[credentialsId: '2b610a7f-5a1a-4d0c-8f93-29aabe182c88', url: 'https://codeup.aliyun.com/6191d29d38b0ff04d2a421d4/huameng_safe_product/safe-product-web.git']]])
  }

   stage('打包,部署vue项目') {
      nodejs('nodejs16') {
          sh "npm install"
          sh "npm run build:stage"
      }
   }
}

Docker安装Jenkins_第95张图片

Docker安装Jenkins_第96张图片

Docker安装Jenkins_第97张图片

7.上传服务器并替换vue项目

流水线项目 -> 流水线语法 -> sshPublisher: Send build artifacts over SSH -> 生成流水线脚本

Docker安装Jenkins_第98张图片

Docker安装Jenkins_第99张图片

编辑Jenkinsfile文件,添加上传服务器

sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/projects/server', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

Docker安装Jenkins_第100张图片

Docker安装Jenkins_第101张图片

你可能感兴趣的:(docker,jenkins,docker,运维)