1.相关概念
互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:编码 –> 构建 –> 集成 –> 测试 –> 交付 –> 部署
持续集成(CI)上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。它的好处主要有两个:
- 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续交付 持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
持续部署(CD) 持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。持续部署的前提是能自动化完成测试、构建、部署等步骤
1.客户端发起代码push到gitlab上 2.gitlab配置了webhook的东西,它可以出发jenkins的构建 jenkins做的事情就比较多 3.1 构建代码 3.2 静态分析 3.3 单元测试 3.4 build镜像 3.5 推送push镜像仓库 3.6 调用k8s的apik8s拉取镜像仓库的进行部署。
2. Jenkins介绍及相关软件的安装
Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
开源的java语言开发持续集成工具,支持CI,CD;
易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;
消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;
分布式构建:支持Jenkins能够让多台计算机一起构建/测试;
文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;
丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。
2.1Jenkins的安装
一定要看官网官网
Jenkis依赖Java,但是需要注意的是java9是不可以使用的,所以我们需要安装Java8,在安装Java8的时候,又出现一个坑,Oracle需要登录才可以下载sdk,如果不想登录的话,可以使用sudo apt-get install oracle-java8-installer
来安装。
下面开始安装Jenkins。
- 添加key
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
- 修改/etc/apt/sources.list: 添加下面的源:
deb https://pkg.jenkins.io/debian-stable binary/
3 apt的方式安装 `sudo apt-get update
sudo apt-get install jenkins`
如果我们需要修改端口的话,以Ubuntu 18.04为例:vim /etc/default/jenkins
,在这个地方把8080改成相应的端口即可。然后注意把Jenkins重新启动,/etc/init.d/jenkins restart
。然后我们需要获取密钥,在Jenkins初始化的时候会需要,cat /var/lib/jenkins/secrets/initialAdminPassword
,我们把密钥复制。在浏览器输入http://ip:port即可。接下来是傻瓜式操作。在我配置完成之后,遇到了一个坑爹的问题,浏览器变成了白屏,最后的解决方案是重新启动Jenkins服务,重启解决一切问题啊。
- jar包的方式安装 或者可以直接下在jar包, 我们有多种方法启动,我们选择使用jar包的方法,
java -jar jenkins.war –httpPort=31000
然后操作方法同上。
- docker jenkins安装
我使用的这一中。
使用dockers拉去镜像,docker pull jenkins
,经过等待后,我们使用docker images查看下载的镜像。
也可以使用docker来启动:
docker run -p 8080:8080 -p 50000:50000 -d -v /your/home:/var/jenkins_home jenkins
我们来看看各个参数的含义:
-d: 后台运行容器,并返回容器ID;
-p 8080:8080 将镜像的8080端口映射到服务器的8080端口; 50000:50000 将镜像的50000端口映射到服务器的50000端口;
-v jenkins:/your/home:/var/jenkins_home,jenkins工作目录和宿主机目录进行映射,必须保证当前用户具有your/home访问权限。
除此之外,我们还可能遇到这样的权限问题,
原因是Jenkins镜像内部使用的用户是jenkons,但是我启动容器时的账号是root,导致没有权限操作内部目录,我们可以稍微改一下上面的命令:
docker run -p 8080:8080 -p 50000:50000 -d -v /your/home:/var/jenkins_home -u 0 jenkins
这样就可以成功启动了,该命令的作用是覆盖掉用户jenkons微root。
也可以使用
docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home jenkins
。
这个和前面不太一样,生成的密钥在docker容器中,使用docker ps -a,查看当前运行的容器,在使用docker exec -it 76b66ca806f7 /bin/bash
,记得替换为自己的容器id。
在容器中执行cat /var/jenkins_home/secrets/initialAdminPassword,获得相应密钥即可进行初始化,同上。
其实Jenkins的插件的安装还是有很多的坑的,主要的原因还是在于网络的原因,我们可以把把源替换为清华的源。 在系统管理—》插件管理-》高级 里面进行设置。 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
此外,我还遇到一个坑爹的问题,服务器的访问特别的缓慢,配置文件根本打不开,我一度怀疑是网络的问题,切换微我的手机流量,问题依然无法解决,我甚至把改容器给删除,镜像重新下载,还是无法解决问题,直到最后我发现容器的状态是unhealthy,我使用docker logs contained –tail 100, 查看了docker的日志。这样就很明确了,硬盘空间不够啦。
下面,我使用df -xh命令查看当前硬盘的使用率,很明显,就是这个问题。
我的解决思路是把docker的镜像和容器给迁移到其他富余的空间,如下:
1.停止docker服务。systemctl stop docker
2.创建一个目录用于保存docker的镜像和容器,mkdir -p /opt/docker/lib
3.迁移/var/lib/docker到上面的目录中,rsync -avz /var/lib/docker /opt/docker/lib
4.配置docker的配置文件,Ubuntu下的docker配置文件在,/lib/systemd/system/docker.service,修改
ExecStart=/usr/bin/dockerd -H fd:// –graph=/opt/docker/lib/docker –containerd=/run/containerd/containerd.sock
或者我们可以修改/etc/docker/daemon.json。
{ //… “graph”: “/opt/docker/lib/docker”, //… }
值得注意的是,graph在v17.05.0中被废弃了,所以我们可以使用data-root来代替graph即可。
5.重写加载docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
- 查看是否成功 docker info
deal。。。。
docker images查看镜像,docker ps -a 查看容器。
- 收尾 如果没有任何问题,就可以把/var/lib/docker删除即可。
2.2 docker gitlab的安装
写在前面:在安装之前,我们需要弄明白一件事情,搞明白gitlab和GitHub的区别,多余的废话不说,主要体现在github相当于我们需要把代码部署到别人的服务器上,而我们可以使用gitlab在我们自己的服务器上搭建一个git环境,代码也可以放在我们自己的服务器上,这样我们即享受了git的方便,也保护了代码的安全。
先参考官网:gitlab docker官网
使用 docker pull gitlab/gitlab-ce
来安装。
接下来使用
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
不幸的是,服务器报了下面的错误,大意是说,服务器端口22被占用了。 使用lsof -i:22查看: 知道了问题,解决起来也不难,我们把端口映射修改一下即可,即
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
下面这个表是gitlab的映射关系
我们可以修改gitlab的配置
docker exec -it gitlab /bin/bash
然后修改/etc/gitlab/gitlab.rb即可,
sudo docker run --detach \
--hostname gitlab.example.com \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \ --restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
最后 sudo docker restart gitlab
接下来我们可以在浏览器打开gitlab,输入http://ip:port,这里port因为是80,所以可以省略。然后是让设置新的密码。再然后就要登录,登录的时候千万要注意,这个地方不是输入你在gitlab官方上的用户名和密码,用户名应该是root,密码是刚才设置的。
小贴士:如果你不幸的忘记了密码,自然是有办法补救的。
重置密码 ,我们需要进入到gitlab容器中,注意必须是root账户,然后
gitlab-rails console production
,注意这个过程需要花费时间,耐心等待即可,
完成之后,我们可以使用两种方式来找到用户名或者邮箱,user = User.where(id: 1).first
或者是
user = User.find_by(email: 'admin@local.host')
。最后我们修改密码即可,
user.password = 'secret_pass'
user.password_confirmation = 'secret_pass'
不要忘记保存哦。
user.save!
退出控制台,重新登录即可。
好的,我们回到前面,登录到http://ip:port之后,我们创建组,创建用户,把用户添加到组里面,创建项目,这些比较简单,不在贴出来了。
在项目创建好之后,我遇到了这么一个问题,说是我没有配置ssh,所以不能通过ssh的方式来获取代码,这个很简单,配置下ssh就可以了。
此外,我们还可以配置我们服务器的IP地址。操作如下,打开vim /etc/gitlab/gitlab.rb文件,将external_url = ‘http://git.example.com’修改成自己的HostName。 接下来我们可以配置邮件服务器,需要安装邮件服务,apt-get install postfix,apt-get install mailutils,安装完成后可以进行测试 echo “Test mail from postfix” | mail -s “Test Postfix” @qq.com
到这里,我们就完成了公司级别的gitlab服务器的搭建。
3. jenkins实战
3.1 流水线
Jenkinsfile 。
声明式流水线:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any //在任何可用的代理上,执行流水线或它的任何阶段。
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
脚本化流水线:
enkinsfile (Scripted Pipeline)
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}