持续集成(Continuous integration)

docker +jenkins + gitosc

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

进入到 /home/fu  
   
   
   
   
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:
   
   
   
   
FROM jenkins:latestENV JENKINS_HOME /var/jenkins_homeENV JENKINS_SLAVE_AGENT_PORT 50000# Jenkins is ran with user `root`, so can operate dockerUSER rootRUN apt-get update \&& apt-get install -y sudo \&& rm -rf /var/lib/apt/lists/*RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoersUSER jenkinsCOPY plugins.txt /usr/share/jenkins/plugins.txtRUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

咱们须要赋予jenkins用户sudo权限以便能在容器内运行Docker命令。固然,也能够将jenkins用户加入到Docker组中来避免在全部Docker命令前使用‘sudo’,不过因为这个组gid的不一样会形成不可移植(如Pini文中所述)。html

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

$ cat plugins.txt
scm-api:latest
git-client:latest
git:latest
greenballs:latest
plugins.txt 为空,由于新版的能够UI选择安装:
      
      
      
      

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

 
 
 

 启动容器:

    
    
    
    
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
或者用变量代替:
     
     
     
     
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加入挂载目录吧,这样不当心误删,少去插件配制:
     
     
     
     
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
报错提示:
     
     
     
     
ouch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission deniedCan not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?


解决方法:
     
     
     
     
If the directory is empty:sudo chown 1000 volume_dirIf the directory already contains files:sudo chown -R 1000 volume_dir



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

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

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

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

查看初始密码:
    
    
    
    
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”
   
   
   
   
sudo docker run hello-world
保存后,点击 当即构建
 点击前面的小地图,能够看到控制台输出,看到如下命令,成功!


 注:

   
   
   
   
在容器中调用docker的方式如今的问题是,jenkins是运行docker容器中,没法感知docker的存在。Docker中使用Docker有三种方:DooDDocker-outside-of-Docker咱们须要赋予jenkins用户sudo权限以便能在容器内运行Docker命令。固然,也能够将jenkins用户加入到Docker组中来避免在全部Docker命令前使用‘sudo’,不过因为这个组gid的不一样会形成不可移植DinDDocker in Dockerdocker镜像中要再安装docker服务。此时,在容器中的docker和宿主机的docker是两个不一样的程序,相互没有关联,DinD并不比使用特权模式的容器安全性高,不过确实能避免使用sudoDinD最主要的劣势是你没法重用宿主缓存的镜像(不过若是须要为测试容器提供一个与宿主隔离的干净环境,这将颇有用)。使用HTTPSDocker后台程序通信jenkins配置docker插件,而且docker进行端口配置。经过HTTPS暴露socket不须要sudo而且可使用宿主的镜像,但由于打开了端口增长了攻击面,能够说是最不安全的

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

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

**** 

选择增长构建步骤,而后Excute shell

*****
   
   
   
   
REGISTRY_URL=192.168.80.146:5000cp /root/apache-maven-3.3.9-bin.tar.gz $WORKSPACE/mavensudo docker build -t $REGISTRY_URL/fu/maven:3.3.9 $WORKSPACE/mavenif sudo docker ps -a | grep -i maven ;then sudo docker rm -f mavenfisudo docker create --name maven $REGISTRY_URL/fu/maven:3.3.9sudo docker cp maven:/hello/target/hello.war $WORKSPACE/hellosudo docker build -t $REGISTRY_URL/fu/hello:1.0 $WORKSPACE/hellosudo docker push $REGISTRY_URL/fu/hello:1.0if sudo docker ps -a | grep -i hello; then sudo docker rm -f hellofisudo 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"] }
    
    
    
    
设置registry路径copy maventar包到项目maven中( $WORKSPACEgit pull下来项目中)build maven 项目查看当前容器,-i 忽略大小写,若是存在刚删除而后再建立一个新的maven容器重新建立的容器中取出maven项目下的hellowar包,到hello而后再构建hello项目hello应用pushregistry中,以便别的服务能够拉取若是hello容器已存在,须先删除,容器名字相同会使容器启动失败启动hello容器,可从浏览器中查看更改

保存,而后设置webHooks:

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

 配制gitosc上的webHooks:


    
    
    
    
http://fu:8b1a616bb9f22c01542465b81c3e5ad7@192.168.80.147:8080/job/docker-app/build?token=java-token
     
     
     
     
   
    /job/docker-app/build?token=
      java-token


fu:8b1a616bb9f22c01542465b81c3e5ad7@ jenkins中获取

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



下载gitlab镜像,由于咱们是本地,没法用gitosc上的勾子(webHooks)

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

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

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

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


从新用link启动,咱们用mysql做为数据存储:
咱们删除以前的gitlab, postgresql 而后再运行如下执行容器命令,不然会提示容器名称重复。
   
   
   
   
docker run --name gitlab -d \ --link gitlab-mysql:mysql --link gitlab-redis:redisio \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \ --volume /srv/docker/gitlab/gitlab:/home/git/data \ sameersbn/gitlab:8.13.3


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

而后登录进去:
 咱们新建一个项目为 app-test:
(能够看到我用的root用户)
 咱们上传项目到 app-test:
由于咱们是新项目,进入项目文件夹:

    
    
    
    
git initgit remote add origin http://192.168.80.147:10080/root/app-test.gitgit add .git commit -m "init"git push -u origin master
(需要多来几回,我是push啦好几回的)

打开慢的缘由,以前用的vmwart 的NAT模式,内存为1G,发现特别慢
而后,停掉全部容器,而后用将内存提高到3G,网络改为啦桥接,呵呵,网一会儿快啦,看来跟数据库不要紧的。

验权:

 

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

咱们遇到以下问题:
    
    
    
    
remote: GitLab: You are not allowed to push code to protected branches on this project.To http://192.168.1.103:10080/fu/CI.git ! [remote rejected] master -> master (pre-receive hook declined)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中获取
   
   
   
   
Use the following URL to trigger build remotely: JENKINS_URL/job/CI/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAMEOptionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.


 
提交,能够测试。
这里,我遇到啦问题。
   
   
   
   
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中,关闭(去掉勾选:  防止跨站点请求伪造
 
而后再测试:
   
   
   
   
Hook executed successfully: HTTP 201

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


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

新增长一个mysql给hello项目用

   
   
   
   
docker run --name mysql -d -p 3307:3306 \ --env 'DB_NAME=xc' \ --env 'DB_USER=admin' --env 'DB_PASS=admin' \ --volume /srv/docker/mysql_data/mysql:/var/lib/mysql \ 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}


相关文章
相关标签/搜索