持续集成(Continuous integration)
docker +jenkins + gitosc
git clone https://git.oschina.net/99fu/CI.git




下载jenkins镜像:

启动jenkins:


基于官方jenkins,配制一个可以执行docker的jenkins:
FROM jenkins:latest
ENV JENKINS_HOME /var/jenkins_home
ENV JENKINS_SLAVE_AGENT_PORT 50000
# Jenkins is ran with user `root`, so can operate docker
USER root
RUN apt-get update \
&& apt-get install -y sudo \
&& rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
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



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
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
ouch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
If the directory is empty:
sudo chown 1000 volume_dir
If the directory already contains files:
sudo chown -R 1000 volume_dir


sudo docker exec -it jenkins /bin/bash

sudo docker logs jenkins


sudo docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword










sudo docker run hello-world


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


****
选择增加构建步骤,然后Excute shell
REGISTRY_URL=192.168.80.146:5000
cp /root/apache-maven-3.3.9-bin.tar.gz $WORKSPACE/maven
sudo docker build -t $REGISTRY_URL/fu/maven:3.3.9 $WORKSPACE/maven
if sudo docker ps -a | grep -i maven ;then
sudo docker rm -f maven
fi
sudo docker create --name maven $REGISTRY_URL/fu/maven:3.3.9
sudo docker cp maven:/hello/target/hello.war $WORKSPACE/hello
sudo docker build -t $REGISTRY_URL/fu/hello:1.0 $WORKSPACE/hello
sudo docker push $REGISTRY_URL/fu/hello:1.0
if sudo docker ps -a | grep -i hello; then
sudo docker rm -f hello
fi
sudo docker run -d -p 80:8080 --name hello $REGISTRY_URL/fu/hello:1.0
- 注:须要在registry中加入REGISTRY_URL=192.168.80.146:5000 的过滤,如{ "insecure-registries":["99fu.cn:5000","192.168.80.146:5000"] }
设置registry路径
copy maven的tar包到项目maven中( $WORKSPACE为git pull下来项目中)
build maven 项目
查看当前容器,-i 忽略大小写,如果存在刚删除
然后再创建一个新的maven容器
从新创建的容器中取出maven项目下的hello的war包,到hello中
然后再构建hello项目
将hello应用push到registry中,以便别的服务可以拉取
如果hello容器已存在,须先删除,容器名字相同会使容器启动失败
启动hello容器,可从浏览器中查看更改



配制gitosc上的webHooks:
http://fu:8b1a616bb9f22c01542465b81c3e5ad7@192.168.80.147:8080/job/docker-app/build?token=java-token
fu:8b1a616bb9f22c01542465b81c3e5ad7@ 从jenkins中获取
/job/docker-app/build?token=java-token

docker pull sameersbn/gitlab:8.13.3





docker pull sameersbn/gitlab:8.13.3
第一种:
wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
docker-compose up
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
docker run --name gitlab-redis -d \
--volume /srv/docker/gitlab/redis:/var/lib/redis \
sameersbn/redis:latest
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 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
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




git init
git remote add origin http://192.168.80.147:10080/root/app-test.git
git add .
git commit -m "init"
git push -u origin master



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'






Use the following URL to trigger build remotely: JENKINS_URL/job/CI/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME
Optionally 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>


Hook executed successfully: HTTP 201



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 parameter2个参数Registry_URLimage_repository--Registry_URL默认值:localhost描述:registry仓库地址例如:139.129.21.58:443--image_repository描述:应用镜像名csphere/my-web-app--githttps://git.oschina.net/2839543/springemp.git--Execute Shell 4 step# build imagedocker build -t ${Registry_URL}/${image_repository}:$GIT_COMMIT $WORKSPACE/# push image to registrydocker push ${Registry_URL}/${image_repository}:$GIT_COMMIT# tag with latestdocker tag -f ${Registry_URL}/${image_repository}:$GIT_COMMIT ${Registry_URL}/${image_repository}:latest# push image to registrydocker push ${Registry_URL}/${image_repository}:latest============================> test-springemp <============================--persistent String parameter4个参数Registry_URLimage_repositoryimage_tagtest_url--githttps://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 parameter4个参数Registry_URLimage_repositoryimage_tagimage_new_tag--Execute Shell# new tagdocker tag -f ${Registry_URL}/${image_repository}:${image_tag} ${Registry_URL}/${image_repository}:${image_new_tag}# docker push imagedocker push ${Registry_URL}/${image_repository}:${image_new_tag}
持续集成(Continuous integration)的更多相关文章
- Docker与CI持续集成/CD
背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...
- Jenkins+Gitlab搭建持续集成(CI)环境
利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...
- 用持续集成工具Travis进行构建和部署
用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...
- 基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...
- <自动化测试方案_9>第九章、持续集成平台搭建
第九章.持续集成平台搭建 (一)什么是持续集成 参考文章地址:https://blog.csdn.net/qq_32261399/article/details/76651376 敏捷软件开发(英语: ...
- 基于 CODING 的 Spring Boot 持续集成项目
本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...
- CI/CD持续集成/持续部署 敏捷开发
敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...
- 持续集成①安装部署jenkins从git获取代码
持续集成①安装部署jenkins从git获取代码 一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部 ...
- Docker与CI持续集成/CD(转)
背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会 ...
- Jenkins持续集成【简介】
1.1 目前主流网站部署的流程 目前主流网站部署方法,通过Hudson/Jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台 ...
随机推荐
- JavaScript学习笔记7 之DOM文档对象模型
一.什么是DOMDocument Object Model 文档 -------对象 ----模型-------缩写DOM DOM是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘 ...
- jQuery插件之——简单日历
最近在研究js插件的开发,以前看大神们,对插件都是信手拈来,随便玩弄,感觉自己要是达到那种水平就好了,就开始自己研究插件开发了.研究了一段时间之后,就开始写了自己的第一个日历插件,由于是初学插件开发, ...
- ArcGIS 的 Oracle 数据库的要求
[ArcGIS必打补丁]ArcGIS 10.2.2 for Desktop连接Oracle(2014年10月发布)数据库崩溃的问题 http://blog.csdn.net/linghe301/art ...
- 初识java之变量、数据类型和运算符(一)
博友目标: 1.掌握变量的概念 2.引子----会使用常用数据类型 众所周知,每台电脑都有一个内存这么个必不可少的元素,那么到底内存到底是用来干什么的呢?其实啊,计算机内存相当于人类的大脑,计算机在处 ...
- 操作系统开发系列—1.HelloWorld ●
org 07c00h ;伪指令,告诉编译器程序会被加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ;调用显示字符串例程 jmp $ ;无限 ...
- ant+findbugs 扫描代码生成报告
1. 下载安装ant.findbugs 下载ant.findbugs最新压缩包解压到本地磁盘合适位置,比如: D:\Program Files\apache-ant-1.9.7 D:\Program ...
- SSRS 2008 ReportServerTempDB增长异常分析
这两天收到一SQL 2008 R2数据库服务器的磁盘空间告警,在检查过程中发现ReportServerTempDB已经暴增到60多GB,其中数据文件接近60G,日志文件9G大小左右.如下截图所示 我们 ...
- SQL Server修改数据库对象所有者(Owner)浅析
在SQL Server数据库中如何修改数据库对象(表.视图.存储过程..)的所有者(Owner)呢?一般我们可以使用系统提供的系统存储过程sp_changeobjectowner来修改. 我们先看看s ...
- 数据库设计范式1——三范式
一讲到数据库设计,大家很容易想到的就是三范式,但是第四.第五范式又是什么,不是很清楚,三范式到底怎么区分,也不清楚,作为数据库设计的基础概念,我再讲解下数据库范式. Normal form Bri ...
- Linux下查找文件:which、whereis、locate、find 命令的区别
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.which 查看可执行文件的位置,通过环境变量查whereis 查看文件的位置,通过数据库查,每 ...