基于Docker的Jenkins安装及流水线项目部署 | 字数总计: 1.3k | 阅读时长: 6分钟 | 阅读量: |
安装 拉取镜像:docker pull jenkinsci/blueocean:latest
创建主目录:mkdir -p /data/jenkins
运行容器:
1 2 3 4 5 6 7 docker run -d -u root \ -p 8080:8080 \ -p 50000:50000 \ -v /data/jenkins:/var/jenkins_home \ -v /etc/localtime:/etc/localtime \ -v /var/run/docker.sock:/var/run/docker.sock \ --name jenkins jenkinsci/blueocean:latest
访问页面 浏览器访问http://ip:8080进入Jenkins管理界面 初始密码查询:cat /data/jenkins/secrets/initialAdminPassword
默认账号名:admin
插件安装 如果在页面安装插件失败,也可进入jenkins容器内部用命令安装,比如安装git
插件:
1 jenkins-plugin-cli --plugins git
修改插件镜像源 Jenkins在安装插件时,默认使用官方地址下载,有时可能速度太慢导致安装失败,可换成国内镜像地址:
vim /data/jenkins/hudson.model.UpdateCenter.xml
修改改成清华大学镜像地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
部署mvn程序 安装插件Docker 和 Docker Pipeline
设置maven镜像仓库,创建一个文件/data/jenkins/settings.xml
,里面指定镜像路径:
1 2 3 4 5 6 7 8 <mirrors > <mirror > <id > alimaven</id > <name > aliyun maven</name > <url > http://maven.aliyun.com/nexus/content/groups/public/</url > <mirrorOf > central</mirrorOf > </mirror > </mirrors >
新建流水线项目,由于这是使用的maven是容器,把配置文件映射进去,表示从阿里云获取maven依赖,这样拉取依赖会快很多;mvn容器默认使用的jdk11,有时候为了使用低版本的java,还需要把java环境变量配置进去:
1 2 3 4 5 6 7 8 pipeline { agent { docker { image 'maven:latest' args '-v /root/.m2:/root/.m2 -v /data/jenkins/settings.xml:/usr/share/maven/conf/settings.xml -v /home/xtwh/jdk1.8.0_271:/usr/local/jdk1.8.0_271 -e JAVA_HOME=/usr/local/jdk1.8.0_271' } } }
配置ssh拉取git代码
在Jenkins服务器上创建公私钥对ssh-keygen
;
jenkins中添加私钥:Dashboard -> 凭据 -> 系统 -> 全局凭据
,添加凭据SSH Username with private key
得到唯一凭据id;
在git服务器中添加公钥;
在流水线项目中添加唯一凭据id:
1 2 3 4 5 6 7 8 9 10 11 pipeline { agent any stages { stage('Git Clone') { steps { git credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git' } } // ... } }
报错一 You’re using ‘Known hosts file’ strategy to verify ssh host keys, but your known_hosts file does not exist, please go to ‘Manage Jenkins’ -> ‘Configure Global Security’ -> ‘Git Host Key Verification Configuration’ and configure host key verification.
方式一:
在容器中手动创建文件/root/.ssh/known_hosts
方式二: 修改配置系统管理 -> 全局安全配置
报错二 Couldn’t find any revision to build. Verify the repository and branch configuration for this job.
Jenkins调用git时用了默认的master
分支,而gitlab这边使用的是main
分支,指定分支名:
1 2 3 4 5 stage('Git Clone') { steps { git branch: 'main', credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git' } }
发布 需要安装Publish Over SSH
插件
系统管理 -> 系统配置
中找到Publish over SSH
选项,添加服务器,主要配置如下:
SSH Server Name: ssh配置名称(自定义)记住这个名称,pipeline代码中要用到
Hostname: 主机IP
Username: ssh账户名
Password: ssh密码
Remote Directory: 远程路径,可以理解为ssh连接上后自动cd到目录
完整部署脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 def remoteId = 'xxx.xxx.xxx.xxx' // 远程服务器配置名 pipeline { agent { docker { image 'maven:latest' args '-v /root/.m2:/root/.m2 -v /data/jenkins/settings.xml:/usr/share/maven/conf/settings.xml -v /home/xtwh/jdk1.8.0_271:/usr/local/jdk1.8.0_271 -e JAVA_HOME=/usr/local/jdk1.8.0_271' } } stages { stage('Checkout') { steps { git branch: 'main', credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git' } } stage('Build') { steps { sh 'mvn -B -DskipTests clean package' } } stage('Zip'){ steps{ // 将生成的Dockerfile,deploy.sh 和jar包整成压缩包发往远程服务器 sh """ cd ./your-soa-test/target rm -rf target.tar.gz tar -zcvf target.tar.gz lib/* resources/* your-soa-test-0.0.1-SNAPSHOT-boot.jar """ } } stage('Publish'){ steps { // 必须装了Publish over SSH插件才能写这个 sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """ supervisorctl status > 1.txt // 这里的1.txt在/root目录,即默认工作目录~ """, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/test', // 这里是相对路径(相对于远程服务器的Remote Directory目录/usr/local/jars) remoteDirectorySDF: false, removePrefix: 'your-soa-test/target', sourceFiles: 'your-soa-test/target/target.tar.gz')], // 这里是相对路径(相对于Jenkins的工作目录/var/jenkins_home/workspace/project_name) usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) echo "发布成功" } } } }
触发(基于推送gitlab) Jenkins操作
安装插件gitlab
项目的构建触发器,勾选gitlab选项
设置Secret token
,最后保存配置
Gitlab操作
项目 -> 设置 -> Webhooks
,创建一个Webhook,主要配置如下3项
Jenkins触发url地址
token值
触发条件:推送
报错 Urlis blocked: Requests to the local network are not allowed
在gitlab的admin -> Settings -> Network
的Outbound requests
选项中,勾选Allow requests to the local network from webhooks and integrations
: