Jenkins Jfrog Artifactory 以及docker下的pipeline 容器编排实践
1. 测试环境情况:
Docker主机 10.24.101.99
JFrog Artifactory 主机 10.24.101.99: (admin password)
jenkinx 10.24.101.99:
github原始地址:https://github.com/jinriyang/swampup
github fock后地址:https://github.com/jinanxiaolaohu/swampup
2. 调试通了之后简单的groovy脚本
因为test脚本有异常 删除test stage 部分的脚本
后面有一部分无意义的脚本 但是没来得及 仔细清理.
#!/usr/bin/env groovy node ('master') {
//Clone example project from GitHub repository
git url: 'https://github.com/jinanxiaolaohu/swampup.git', branch: 'master'
def rtServer = Artifactory.server SERVER_ID
def buildInfo = Artifactory.newBuildInfo()
def tagName
buildInfo.env.capture = true
//Fetch all depensencies from Artifactory
stage('Dependencies') {
dir('automation/docker-app') {
try {
println "Gather Java and Tomcat" def downloadSpec = """{
"files": [
{
"pattern": "zhaobsh_generic/jdk-8-linux-x64.tar.gz",
"target": "jdk/jdk-8-linux-x64.tar.gz",
"flat":"true"
},
{
"pattern": "zhaobsh_generic/apache-tomcat-8.tar.gz",
"target": "tomcat/apache-tomcat-8.tar.gz",
"flat":"true"
}
]
}""" rtServer.download (downloadSpec, buildInfo)
if (fileExists('jdk/jdk-8-linux-x64.tar.gz') && fileExists('tomcat/apache-tomcat-8.tar.gz')) {
println "Downloaded dependencies"
} else {
println "Missing Dependencies either jdk or tomcat - see listing below:"
sh 'ls -d */*'
throw new FileNotFoundException("Missing Dependencies")
}
} catch (Exception e) {
println "Caught exception during resolution. Message ${e.message}"
throw e
}
}
}
//Build docker image named "docker-framework" with Java 8 and Tomcat
stage('Build') {
dir ('automation/docker-app') {
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
def rtDocker = Artifactory.docker server: rtServer
tagName = "${ARTDOCKER_REGISTRY}/docker-app:${env.BUILD_NUMBER}"
def gradleLatestPath = getLatestGradleWar().trim()
def gradleWarDownload = """{
"files": [
{
"pattern": "zhaobsh_generic/*.war",
"target": "war/webservice.war", "flat": "true"
}
]
}"""
sh 'rm -f war/*'
rtServer.download(gradleWarDownload)
docker.build(tagName)
echo tagName
sleep
rtDocker.push(tagName,REPO, buildInfo)
sleep
rtServer.publishBuildInfo buildInfo
}
}
} //Promote image from local staging repositoy to production repository
stage ('Promote') {
dir ('automation/docker-app') {
def promotionConfig = [
'buildName' : env.JOB_NAME,
'buildNumber' : env.BUILD_NUMBER,
'targetRepo' : PROMOTE_REPO,
'comment' : 'Framework test with latest version of application',
'sourceRepo' : SOURCE_REPO,
'status' : 'Released',
'includeDependencies': false,
'copy' : true
] echo promotionConfig as String
rtServer.promote promotionConfig
reTagLatest (SOURCE_REPO)
reTagLatest (PROMOTE_REPO)
}
}
} def getLatestGradleWar () {
def response = ''
def gradleLatestWarSrc = """items.find(
{
"repo":{"\$eq":"zhaobsh_generic"}, "name":{"\$match":"webservice-*.war"}
}
).sort({"\$desc" : ["created"]}).limit()"""
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
def curlString = "curl -s -u " + env.USERNAME + ":" + env.PASSWORD + " " + SERVER_URL
def gradleLatestStr = curlString + "/api/search/aql -X POST -H 'Content-Type: text/plain' -d '" + gradleLatestWarSrc + "' | python -c 'import sys, json; print json.load(sys.stdin)[\"results\"][0][\"path\"]'"
println "Curl String is " + gradleLatestStr
response = sh (script: gradleLatestStr, returnStdout: true)
}
println "Curl response: " + response
return response
} def updateDockerFile () {
def BUILD_NUMBER = env.BUILD_NUMBER
sh 'sed -i "s/docker-app:latest/docker-app:$BUILD_NUMBER/" Dockerfile'
} def reTagLatest (targetRepo) {
def BUILD_NUMBER = env.BUILD_NUMBER
sh 'sed -E "s/@/$BUILD_NUMBER/" retag.json > retag_out.json'
switch (targetRepo) {
case PROMOTE_REPO :
sh 'sed -E "s/TARGETREPO/${PROMOTE_REPO}/" retag_out.json > retaga_out.json'
break
case SOURCE_REPO :
sh 'sed -E "s/TARGETREPO/${SOURCE_REPO}/" retag_out.json > retaga_out.json'
break
}
sh 'cat retaga_out.json'
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
def curlString = "curl -u " + env.USERNAME + ":" + env.PASSWORD + " " + SERVER_URL
def regTagStr = curlString + "/api/docker/$targetRepo/v2/promote -X POST -H 'Content-Type: application/json' -T retaga_out.json"
println "Curl String is " + regTagStr
sh regTagStr
}
}
//test docker image by runnning container
def testFramework (tag) {
def result = true
docker.image(tag).withRun('-p 8181:8181') {c ->
sleep
def stdout = sh(script: 'curl "http://localhost:8181/swampup/"', returnStdout: true)
if (stdout.contains("Welcome Docker Lifecycle Training")) {
println "*** Passed Test: " + stdout
} else {
println "*** Failed Test: " + stdout
result = false
}
}
sh "docker rmi ${tag}"
return result
} def updateProperty (property) {
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
def curlString = "curl -u " + env.USERNAME + ":" + env.PASSWORD + " " + "-X PUT " + SERVER_URL
def updatePropStr = curlString + "/api/storage/${SOURCE_REPO}/docker-framework/${env.BUILD_NUMBER}?properties=${property}"
println "Curl String is " + updatePropStr
sh updatePropStr
}
}
3. pipeline的参数情况
4. linux主机的修改.
关闭防火墙
关闭selinux
关闭swap
修改/etc/docker/daemon.json 增加jfrog仓库为insecure-registries
重启docker
下载jdk的tar包 解压缩并且 修改 /etc/profile 配置文件 增加JAVA_HOME 环境变量.
安装jenkins
安装jfrog artifactory
docker下安装sonar
5. jfrog artifactory的处理
新增仓库 主要是第三步中的REPO的名字必须得有. 仓库类型 docker
新增generic 仓库 上传文件, 与groovy脚本中的下载文件部分相匹配.
主要需要的文件如图示
仓库名/文件名
继续一个仓库名 文件名
6. jenkins 需要进行的处理.
根据配置文件中的 server_id 增加 artifactory的 server_id 并且在步骤三中 定义上.
在 系统管理-系统设置中 进行设置, 添加 serverid 如图示
下载部分可选插件
Artifactory部分的 增加相当的额内容.
即可
7. build with parameters 即可.
Jenkins Jfrog Artifactory 以及docker下的pipeline 容器编排实践的更多相关文章
- Jfrog Artifactory 创建docker 镜像仓库以及 push 镜像到 该仓库.
1. 安装aitifactory 以及 启动 使用30天有效期激活 不在阐述. 2. 登录artifactory username:admin password:password 3. 创建 仓库 在 ...
- 【docker】为docker下的php容器安装php-redis扩展【编译安装】
使用docker安装的PHPFPM容器没有Redis扩展,需要安装一下扩展. 首先进入docker的PHPFPM容器 $ docker exec -it myphpfpm /bin/bash 依次执行 ...
- Docker知识进阶与容器编排技术
目录 1 使用Dockerfile定制redis镜像 1.1 环境准备 1.2 编写Dockerfile文件 1.3 通过Dockerfile构建镜像 1.4 通过镜像运行容器 1.5 官方镜像替代我 ...
- Docker下构建centos7容器无法使用systemctl命令的解决办法
最近在使用docker 构建centos7 容器时,发现无法使用systemctl 命令.后来万能的百度解决了问题,随记之以备后用. 解决办法: docker run --privileged -it ...
- Docker下制作一个容器镜像
操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
- [docker swarm] 从单容器走向负载均衡部署
背景 之前写过<<docker-compose真香>> 和<docker-compose.docker stack前世今生>两篇博客, 回顾一下思路: ① dock ...
- jfrog artifactory jenkins pipeline 集成
1. 预备环境 artifactory ( 开源版本 ) maven jenkins jenkins artifactory plugin (在插件管理安装即可) 2. 配置artifactory ...
- Jenkins集群下的pipeline实战
关于Jenkins集群 在<快速搭建Jenkins集群>一文中,我们借助docker快速搭建了Jenkins集群,今天就在这个集群环境中创建pipeline任务,体验Jenkins集群下的 ...
随机推荐
- Database hang and Row Cache Lock concurrency troubleshooting
http://www.dadbm.com/database-hang-row-cache-lock-concurrency-troubleshooting/ Issue backgroundThis ...
- 【opatch打补丁】oracle10.2.0.5.0升级10.2.0.5.9 for linux
https://wenku.baidu.com/view/c38702b56edb6f1afe001f59.html 这篇文章也不错,可参考 任务:oracle 10.2.0.5.0 打补丁升级 ...
- java 实现serialVersionUID
文章转自 https://www.cnblogs.com/duanxz/p/3511695.html 作用 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制 ...
- <数据结构与算法分析>读书笔记--最大子序列和问题的求解
现在我们将要叙述四个算法来求解早先提出的最大子序列和问题. 第一个算法,它只是穷举式地尝试所有的可能.for循环中的循环变量反映了Java中数组从0开始而不是从1开始这样一个事实.还有,本算法并不计算 ...
- Linux中进程与线程的概念以及区别
linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是 ...
- Python排序算法——希尔排序(Shell’s Sort)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...
- github打开慢,甚至打不开
有人使用github后,在某些网络下发现打开慢,甚至打不开,这都是因为他是国外站:目前互联网的连接机制导致超过一定的路由节点的连接就会出现这个问题,解决办法就是直接告诉本机ip.不要先层层询问域名转i ...
- C# 异步上传图片案例
好久没写博客了,都感觉自己快堕落了!今天随性写一篇关于异步上传图片的程序及插件! 说是程序及插件,其实程序占大头,所谓的插件只是两个JS.分别为:jquery.html5upload.js 和 jqu ...
- Linux性能评测工具之一:gprof篇
这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并把相关的资料作一个汇总,以便以后信手拈来! 1 简介 改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数 ...
- ubuntu12.04安装mininet
网上安装mininet教程有很多,都是通过git命令安装,但有一个坑,安装到./install.sh时会报错,记录下来 1.通过git 下载mininet git clone git://github ...