docker +jenkins + gitosc


到gitosc上,复制地址:https://git.oschina.net/99fu/CI.git

进入到 /home/fu  
  1. git clone https://git.oschina.net/99fu/CI.git

分别进入相应的目录build镜像

README.md中有相应的指令:

 
 
注:maven 的dockerfile可以看一下:
将自己下载好的 3.3.9的maven解压到maven目录与当前dockerfill同级,也可以打开ADD注释,通过ADD自动下载,会很慢
如果有公司内部settings.xml ,可以覆盖当前settings.xml
 运行build后,会自动构建maven中的hello项目:
 
启动jenkins容器,并配制jenkins:
=====================================================================================

下载jenkins镜像:

在https://hub.docker.com官网pull最新版jenkins,这里是2.19.1
 



启动jenkins:

sudo docker run -d -p 8080:8080 --name jenkins -v /usr/lib/docker:/usr/lib/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root jenkins

说明:
-d 后台启动
-p 端口
--name 容器名称
-v /usr/lib/docker:/usr/bin/docker  -v /var/run/docker.sock:/var/run/docker.sock  把docker二进制命令给jenkins,让jenkins可以调用docker命令
-v /home/fu/maven-tar:/root    把maven挂载,jenkins可用

挂载的结果,宿主机上的maven在容器中也能查看到:
 
官方的jenkins容器说明:

基于官方jenkins,配制一个可以执行docker的jenkins:

新建一个Dockerfile:
  1. FROM jenkins:latest
  2. ENV JENKINS_HOME /var/jenkins_home
  3. ENV JENKINS_SLAVE_AGENT_PORT 50000
  4. # Jenkins is ran with user `root`, so can operate docker
  5. USER root
  6. RUN apt-get update \
  7. && apt-get install -y sudo \
  8. && rm -rf /var/lib/apt/lists/*
  9. RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
  10. USER jenkins
  11. COPY plugins.txt /usr/share/jenkins/plugins.txt
  12. RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

我们需要赋予jenkins用户sudo权限以便能在容器内运行Docker命令。当然,也可以将jenkins用户加入到Docker组中来避免在所有Docker命令前使用‘sudo’,不过由于这个组gid的不同会造成不可移植(如Pini文中所述)。

最后两行用于处理 plugins.txt 文件中定义的插件。如果你不需要任何插件可以忽略这两行,不过1.6前推荐至少包括如下内容:

$ cat plugins.txt
scm-api:latest
git-client:latest
git:latest
greenballs:latest
plugins.txt 为空,因为新版的可以UI选择安装:

进入到Dockerfile当前目录
 
 运行命令制作基于jenkins的镜像:
  1. sudo docker build -t 99fu.cn:5000/fu/jenkins:latest .

 
 
 

启动容器:

  1. sudo docker run -d -p 8080:8080 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
或者用变量代替:
  1. sudo docker run -d -p 8080:8080 --name jenkins -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
我们把jenkins加入挂载目录吧,这样不小心误删,少去插件配制:
  1. sudo docker run -d -p 8080:8080 --name jenkins -v /home/fu/jenkins_home:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
当你看日志,发现报错,这里有解答:https://github.com/jenkinsci/docker/issues/177
报错提示:
  1. ouch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
  2. Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?


解决方法:
  1. If the directory is empty:
  2. sudo chown 1000 volume_dir
  3. If the directory already contains files:
  4. sudo chown -R 1000 volume_dir



查看启动的容器:
 
进入容器,查看是否能看到宿主机的镜像:

  1. sudo docker exec -it jenkins /bin/bash
 exit 可以退出容器
 
 查看jenkins运行日志:
  1. sudo docker logs jenkins
 从上面只可以看到,初始化管理密码;

配制jenkins:
在浏览器打开:http://192.168.80.147:8080
 

可以通过日志查看,也可在指定的文件中,把密码复制出来:
交互模式进入容器:
  1. sudo docker exec -it jenkins /bin/bash

查看初始密码:
  1. cat /var/jenkins_home/secrets/initialAdminPassword

 复制密码,输入,进入
插件安装,第一种是建议安装社区使用最多的插件
                  第二种是自己选择安装所需的插件
 
我们所须的插件有:
scm-api
plain-credentials
git-client
git
github-api
github

这里我选的建议安装:
 
安装完成后,配制用户:
(fu  zhangxiaofu)
 
 
好啦,初始jenkins环境完成,开始配制jenkins:
进入系统配制:

 
 
我们先测试一下,在jenkins中是否可以运行docker命令:
新建-->

选择构建一个自由风格的软件项目:
 
 


增加构建步骤-->Excute shell:
在命令框里输入“sudo docker run hello-world”
  1. sudo docker run hello-world
保存后,点击 立即构建
 点击前面的小地图,可以看到控制台输出,看到以下命令,成功!


 注:

  1. 在容器中调用docker的方式
  2. 现在的问题是,jenkins是运行docker容器中,无法感知docker的存在。
  3. 在Docker中使用Docker有三种方:
  4. DooD(Docker-outside-of-Docker)
  5. 我们需要赋予jenkins用户sudo权限以便能在容器内运行Docker命令。当然,也可以将jenkins用户加入到Docker组中来避免在所有Docker命令前使用‘sudo’,不过由于这个组gid的不同会造成不可移植
  6. DinD(Docker in Docker)
  7. 在docker镜像中要再安装docker服务。
  8. 此时,在容器中的docker和宿主机的docker是两个不同的程序,相互没有关联,DinD并不比使用特权模式的容器安全性高,不过确实能避免使用sudo。DinD最主要的劣势是你无法重用宿主缓存的镜像(不过如果需要为测试容器提供一个与宿主隔离的干净环境,这将很有用)。
  9. 使用HTTPS与Docker后台程序通讯
  10. jenkins配置docker插件,并且docker进行端口配置。
  11. 通过HTTPS暴露socket不需要sudo并且可以使用宿主的镜像,但因为打开了端口增加了攻击面,可以说是最不安全的

新建应用:
选择git,并复制git地址,选择分支

输入Token,线上应复杂。复制路径到git上 

****

选择增加构建步骤,然后Excute shell

*****
  1. REGISTRY_URL=192.168.80.146:5000
  2. cp /root/apache-maven-3.3.9-bin.tar.gz $WORKSPACE/maven
  3. sudo docker build -t $REGISTRY_URL/fu/maven:3.3.9 $WORKSPACE/maven
  4. if sudo docker ps -a | grep -i maven ;then
  5. sudo docker rm -f maven
  6. fi
  7. sudo docker create --name maven $REGISTRY_URL/fu/maven:3.3.9
  8. sudo docker cp maven:/hello/target/hello.war $WORKSPACE/hello
  9. sudo docker build -t $REGISTRY_URL/fu/hello:1.0 $WORKSPACE/hello
  10. sudo docker push $REGISTRY_URL/fu/hello:1.0
  11. if sudo docker ps -a | grep -i hello; then
  12. sudo docker rm -f hello
  13. fi
  14. sudo docker run -d -p 80:8080 --name hello $REGISTRY_URL/fu/hello:1.0

  1. 注:须要在registry中加入REGISTRY_URL=192.168.80.146:5000 的过滤,如{ "insecure-registries":["99fu.cn:5000","192.168.80.146:5000"] }
  1. 设置registry路径
  2. copy maven的tar包到项目maven中( $WORKSPACE为git pull下来项目中)
  3. build maven 项目
  4. 查看当前容器,-i 忽略大小写,如果存在刚删除
  5. 然后再创建一个新的maven容器
  6. 从新创建的容器中取出maven项目下的hello的war包,到hello中
  7. 然后再构建hello项目
  8. 将hello应用push到registry中,以便别的服务可以拉取
  9. 如果hello容器已存在,须先删除,容器名字相同会使容器启动失败
  10. 启动hello容器,可从浏览器中查看更改

保存,然后设置webHooks:

点击用户名(99fu)--> 设置:
show api Token 查看Token:
 
 

配制gitosc上的webHooks:


  1. http://fu:8b1a616bb9f22c01542465b81c3e5ad7@192.168.80.147:8080/job/docker-app/build?token=java-token
  1. fu:8b1a616bb9f22c01542465b81c3e5ad7@ 从jenkins中获取
   
    /job/docker-app/build?token=
     java-token



配制完,保存,测试
 
如果是外网,就可以通过修改代码,然后提交更改后,测试jenkins是否能够自动构建。



下载gitlab镜像,因为我们是本地,无法用gitosc上的勾子(webHooks)

以下是hub.docker.com 上的镜像:
  1. docker pull sameersbn/gitlab:8.13.3
 
 
 
 

先下载镜像:
  1. docker pull sameersbn/gitlab:8.13.3

 以上提到两种方式安装:
第一种:
新建一个 gitlab目录,cd gitlab,
  1. wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml

然后运行给合命令,启动多个容器:
  1. docker-compose up
第二种:
Step 1. Launch a postgresql container
  1. docker run --name gitlab-postgresql -d \
  2. --env 'DB_NAME=gitlabhq_production' \
  3. --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
  4. --env 'DB_EXTENSION=pg_trgm' \
  5. --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
  6. sameersbn/postgresql:9.5-3
Step 2. Launch a redis container
  1. docker run --name gitlab-redis -d \
  2. --volume /srv/docker/gitlab/redis:/var/lib/redis \
  3. sameersbn/redis:latest
Step 3. Launch the gitlab container
  1. docker run --name gitlab -d \
  2. --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
  3. --publish 10022:22 --publish 10080:80 \
  4. --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
  5. --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
  6. --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
  7. --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
  8. --volume /srv/docker/gitlab/gitlab:/home/git/data \
  9. sameersbn/gitlab:8.13.3
docker-compose.yml安装后 浏览器中:http://192.168.80.147:10080  设置root密码
 
一步步启动容器后,注册登陆用户:
 
 
用以上的,不知为什么都是报502,连接超时,而且登陆不进去,还是换用熟悉的mysql吧!
可能是虚拟机设的内存比较下吧。会很慢,卡
 
 MySQL 存储:
  1. docker run --name gitlab-mysql -d \
  2. --env 'DB_NAME=gitlabhq_production' \
  3. --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
  4. --volume /srv/docker/gitlab/mysql:/var/lib/mysql \
  5. sameersbn/mysql:latest


重新用link启动,我们用mysql作为数据存储:
我们删除之前的gitlab,postgresql 然后再运行以下执行容器命令,否则会提示容器名称重复。
  1. docker run --name gitlab -d \
  2. --link gitlab-mysql:mysql --link gitlab-redis:redisio \
  3. --publish 10022:22 --publish 10080:80 \
  4. --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
  5. --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
  6. --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
  7. --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
  8. --volume /srv/docker/gitlab/gitlab:/home/git/data \
  9. sameersbn/gitlab:8.13.3


 
启动后:首先会让我们改一下root密码,我用的zhangxiaofu

然后登陆进去:
 我们新建一个项目为 app-test:
(可以看到我用的root用户)
 我们上传项目到 app-test:
因为我们是新项目,进入项目文件夹:

  1. git init
  2. git remote add origin http://192.168.80.147:10080/root/app-test.git
  3. git add .
  4. git commit -m "init"
  5. git push -u origin master
(须要多来几次,我是push啦好几次的)

打开慢的原因,之前用的vmwart 的NAT模式,内存为1G,发现特别慢
然后,停掉所有容器,然后用将内存提升到3G,网络改成啦桥接,呵呵,网一下子快啦,看来跟数据库没关系的。

验权:

 

设置作者用户名,并输入密码
 
 

我们遇到如下问题:
  1. remote: GitLab: You are not allowed to push code to protected branches on this project.
  2. To http://192.168.1.103:10080/fu/CI.git
  3. ! [remote rejected] master -> master (pre-receive hook declined)
  4. error: failed to push some refs to 'http://192.168.1.103:10080/fu/CI.git'


解决方法:
登陆进入---> projects-->选择项目
 先择设置,Members  成员
 
 增加成员,可以搜索,  增加到哪个分支   到期时间
 
好啦,我们再push:
 
 
 





 接下来,我们要设置webHooks


fu是用启名,
79dc814d0177397b46557831252b8c62 为token
192.168.1.103:8080/job/CI/build?token=java-token
身份令牌,在jenkins中获取
  1. Use the following URL to trigger build remotely: JENKINS_URL/job/CI/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME
  2. Optionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.


 
提交,可以测试。
这里,我遇到啦问题。
  1. Hook executed successfully but returned HTTP 403 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2>HTTP ERROR 403</h2> <p>Problem accessing /job/CI/build. Reason: <pre> No valid crumb was included in the request</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/> </body> </html>

 

可以看到,请求被重置,因为在jenkins中,默认开启啦(防止跨站点请求伪造)

我们须要进入jenkins中,关闭(去掉勾选: 防止跨站点请求伪造)
 
然后再测试:
  1. Hook executed successfully: HTTP 201

 
可以看到成功啦,再看一下控制台:
 
好啦,我们提交一下代码,看一下效果,是否能自动执行命令(注,红色的表示失败啦哦,蓝色是成功)
提交完代码,同时,就看到了jenkins执行啦!
 


注:
jenkins 默认git pull下来的代码在:cd /var/jenkins_home/workspace/CI/
jenkins_home 环境变量
CI  为项目名

新增加一个mysql给hello项目用

  1. docker run --name mysql -d -p 3307:3306 \
  2. --env 'DB_NAME=xc' \
  3. --env 'DB_USER=admin' --env 'DB_PASS=admin' \
  4. --volume /srv/docker/mysql_data/mysql:/var/lib/mysql \
  5. sameersbn/mysql:latest


============================> dev-springemp <============================
#jenkins docker 命令说明
--persistent String parameter
2个参数
Registry_URL
image_repository
--Registry_URL
默认值:localhost
描述:registry仓库地址
例如:139.129.21.58:443
--image_repository
描述:
应用镜像名
csphere/my-web-app
--git
https://git.oschina.net/2839543/springemp.git
--Execute Shell 4 step
# build image
docker build -t ${Registry_URL}/${image_repository}:$GIT_COMMIT $WORKSPACE/
# push image to registry
docker push ${Registry_URL}/${image_repository}:$GIT_COMMIT
# tag with latest
docker tag -f ${Registry_URL}/${image_repository}:$GIT_COMMIT ${Registry_URL}/${image_repository}:latest
# push image to registry
docker push ${Registry_URL}/${image_repository}:latest
============================> test-springemp <============================
--persistent String parameter
4个参数
Registry_URL
image_repository
image_tag
test_url
--git
https://git.oschina.net/2839543/springemp.git
--Execute Shell
#增加可执行权限
chmod u+x deploy.sh init.sh test-script.sh
#执行测试
./test-script.sh
--增加邮件通知
============================> prod-springemp <============================
--persistent String parameter
4个参数
Registry_URL
image_repository
image_tag
image_new_tag
--Execute Shell
# new tag
docker tag -f ${Registry_URL}/${image_repository}:${image_tag} ${Registry_URL}/${image_repository}:${image_new_tag}
# docker push image
docker push ${Registry_URL}/${image_repository}:${image_new_tag}

持续集成(Continuous integration)的更多相关文章

  1. Docker与CI持续集成/CD

    背景        Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...

  2. Jenkins+Gitlab搭建持续集成(CI)环境

    利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...

  3. 用持续集成工具Travis进行构建和部署

    用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...

  4. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

  5. <自动化测试方案_9>第九章、持续集成平台搭建

    第九章.持续集成平台搭建 (一)什么是持续集成 参考文章地址:https://blog.csdn.net/qq_32261399/article/details/76651376 敏捷软件开发(英语: ...

  6. 基于 CODING 的 Spring Boot 持续集成项目

    本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...

  7. CI/CD持续集成/持续部署 敏捷开发

    敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...

  8. 持续集成①安装部署jenkins从git获取代码

    持续集成①安装部署jenkins从git获取代码 一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部 ...

  9. Docker与CI持续集成/CD(转)

    背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会 ...

  10. Jenkins持续集成【简介】

    1.1 目前主流网站部署的流程    目前主流网站部署方法,通过Hudson/Jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台 ...

随机推荐

  1. 国内好用的maven仓库,添加到本地nexus中

    速度快的maven仓库真的难找,国外网站很多被封了.前天在网上找,有人说阿里有个公开的,速度很快.确实很快! 我添加到本地nexus中,结果不能更新索引,我是这么添加的,如下: 这个地址在浏览器中能够 ...

  2. SharePoint 2010 GridView/SPGridView完全应用系统样式

    自定义开发页面如果用到了GridView或SPGridView默认跟列表的样式是不一样的,如要要一样,需要: 1)aspx <asp:GridView DataKeyNames="ID ...

  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q109-Q111)

    Question  109  Your company uses a third-party service to host its SharePoint 2010 site. The hosting ...

  4. 自定义AlertDialog控件的使用(AndroidStudio)

    AlertDialog 第一种:可随意自定义控件 第一步:自定义弹出的页面 ,新建一个XML页面 如下图  不需要Activity 第二步:在主页面设置一个按钮弹出上图页面  (下面是主要代码  调用 ...

  5. TortoiseSVN与VisualSVN Server搭建SVN版本控制系统

    本片主要介绍如何搭建SVN版本控制系统,主要使用工具: 1 客户端:TortoiseSVN (小乌龟) 2 服务端:VisualSVN Server 搭建出图形化管理,以及右键菜单版本控制管理的SVN ...

  6. Maven基础配置—本地Maven配置

    1.下载客户端 通过http://maven.apache.org/download.cgi#下载Maven本地客户端. 我下载的是apache-maven-3.2.5-bin.zip,在D盘解压. ...

  7. ORACLE等待事件: log file parallel write

    log file parallel write概念介绍 log file parallel write 事件是LGWR进程专属的等待事件,发生在LGWR将日志缓冲区(log_buffer)中的重做日志 ...

  8. SQL Server 2008 R2——使用数字辅助表(master..spt_values)实现用计数字段对记录进行重复显示

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  9. springmvc学习资料整理

    springmvc接口开发返回XML/JSON数据 1.SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上):http: ...

  10. InfluxDB学习之InfluxDB数据保留策略(Retention Policies)

    InfluxDB每秒可以处理成千上万条数据,要将这些数据全部保存下来会占用大量的存储空间,有时我们可能并不需要将所有历史数据进行存储,因此,InfluxDB推出了数据保留策略(Retention Po ...