运行内存:6 G
磁 盘:50G
镜像文件:CentOS-7-x86_64-Everything-2009.iso
注意:使用最小安装时,系统命令不完整,个别命令需手动重新安装(例如 vim 、 wget 、 curl 、 ifconfig( net-tools) 、 zip、unzip)
在配置好虚拟网卡的情况下,修改/etc/sysconfig/network-scripts/
下的网卡配置文件,设置BOOTPROTO=static
;ONBOOT=yes
;设置网络例如
IPADDR=192.168.140.110
NETMASK=255.255.255.0
GATEWAY=192.168.140.2
如若碰到可以ping通本地但无法ping通外网的问题,须在文件/etc/resolv.conf
中添加nameserver 8.8.8.8
进行尝试。
service network restart
重启网络服务。
yum list installed | grep ssh
查看机器是否安装ssh服务,进行ssh的相关配置
systemctl stop firewalld #停止防火墙服务
systemctl disable firewalld #禁止防火墙开机自启
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #设置下载源为阿里云
yum install docker #安装docker
systemctl enable docker #加入自启队列
reboot #重启(docker启动命令忘了)
登录Github,搜索compose
,选择docker/compose
,在tag中选择最新版本下载,本次选择docker-compose-linux-x86_64
,放在自定义目录(本次选择放在/usr/local/bin
)下,更改文件名为docker-compose
。从Github上下载二进制文件的速度可能较慢,可使用curl
从daocloud下载。
mv docker-compose-linux-x86_64 docker-compose #更名
chmod +x docker-compose #对其赋予可执行权限
docker-compose --version #验证安装
version: '3.1' #yml版本,3版本是目前最新版,也是推荐版本
services:
gitlab:
image: 'gitlab/gitlab-ce:latest' #镜像文件名
container_name: gitlab #容器名
restart: always #启动模式
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.140.110:8929' #Gitlab访问地址
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports: #端口映射
- '8929:8929'
- '2224:2224'
volumes: #数据卷映射
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
docker search gitlab
docker pull gitlab/gitlab-ce
将yml
文件放在容器的自定义启动目录下,在该目录下使用启动命令启动docker容器:
docker-compose up -d #使用更名后的docker-compose进行启动
期间可以监控docker-compose日志:
docker-compose logs -f
初次登录需要等待较长的启动时间,Gitlab消耗内存较大,建议机器内存4G以上
初次登录root用户需要原始密码,进入容器并查看inital_root_password:
docker exec -it gitlab cat /etc/gitlab/initial_root_password
更改密码后需要重新登录。
.tar.gz
文件*maven*/conf
下的settings.xml文件配置以下三点:
#1.在<mirrors></mirrors>标签下配置国内镜像地址
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
#2.在<profiles></profiles>标签下配置JDK1.8的编译插件
<profile>
<id>jdk8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
#3.在<activeProfiles></activeProfiles>标签下配置启动该插件
<activeProfiles>
<activeProfile>jdk8</activeProfile>
</activeProfiles>
前往Jenkins官网查看当前Jenkins版本,本次使用2.387.1的LTS长期支持版本:
docker pull jenkins/jenkins:2.387.1-lts
cd /usr/local
mkdir -p docker/jenkins_docker #在/usr/local下创建启动目录
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.387.1-lts #拉取的镜像版本
container_name: jenkins #容器名
ports: #端口映射
- 8080:8080
- 50000:50000
volumes: #本地的数据卷映射,是jenkins的家目录
- ./data/:/var/jenkins_home/
在启动目录下使用启动命令启动jenkins容器:
docker-compose up -d
由于jenkins的家目录要映射到./data
下,可能会因为权限问题导致该文件夹下的某些文件无法创建,查看容器日志:
docker logs jenkins -f
此时需要更改./data
的权限:
chmod -R 777 data
由于初次启动Jenkins时需要下载大量内容,使用默认地址进行下载可能耗费大量时间,此时需要将该地址修改为国内的镜像源,本次使用的源http://mirror.esuni.jp/jenkins/updates/update-center.json
:
vi data/hudson.model.UpdateCenter.xml #修改数据卷下的hudson.model.UpdateCenter.xml
修改链接为:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
</site>
</sites>
docker-compose restart
首次登录的管理员密码可以在日志中查看,也可进入容器内部查看:
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
在使用管理员登录Jenkins后,系统会提示进行插件的安装,本次选择安装自定义选项中的默认选项。等待插件安装完成后,进入Jenkins。若遇到个别插件安装失败的问题,可以直接去往Jenkins官网进行插件的单独下载。
下载完成后,由于业务需求,需要前往插件管理页面下载另外几个插件Git Parameter
,Publish Over SSH
。
由于Jenkins的功能是将代码从仓库拉取下来并进行构建,所以需要将JDK
与Maven
映射到Jenkins中:
cd /usr/local/docker/jenkins_docker #进入容器目录
mv /usr/local/jdk ./ #将jdk移动到容器目录下
mv /usr/local/maven ./ #将maven移动到当前目录下
进入容器验证是否有二者的映射:
docker exec -it jenkins bash #进入容器
cd /var/jenkins_home #进入Jenkins家目录
ls #查看是否有jdk与maven的映射
在Jenkins网页端进行全局配置:在Manage Jenkins -> Global Tool Configuration
中使用容器内的路径添加JDK
与Maven
,在没有本地配置的情况下,可以选择勾选自动安装。
插件Publish Over SSH
的目的在于将代码远程地部署到目标服务器上,此插件安装成功后,可以在Manage Jenkins -> Configure System
中找到Publish Over SSH
选项,在此处新增SSH服务器,指定该服务器的远程操作目录,设定用户并在高级选项中设置密码,本次使用root用户。
测试连接,查看结果。
基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现CI持续集成
基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD持续部署
Jenkins拉取代码:
开发人员编写项目后,在本地测试无异常,推送到GItlab的对应项目中。在Jenkins中新建项目,配置源码拉取,在首页进行构建。此时进入Jenkins容器内部可以在workspace
目录下看到拉取下来的项目。
Jenkins打包并上传目标服务器:
使用Jenkins对项目进行打包需要配置Maven,在构建
选项下找到调用顶层Maven
选项,配置打包命令,在构建后(Post build)
选项下配置源文件路径,指定后会将该路径下的对应文件发布到目标服务器。回到项目,在项目中添加Dockerfile
和docker-compose
文件,并将docker相关文件发布至目标服务器,可以使测试代码基于docker运行。
在实验过程中发现,docker文件与文件路径是导致发布失败的两个主要原因。由于Dockerfile
分层构建,联合挂载的特性,在编写时应当非常注意:
1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
2.Dockerfile中相对路径默认都是Dockerfile所在的目录
3.Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行
4.Dockerfile中每一条指令被视为一层
DockerFile
:
From daocloud.io/library/java:openjdk-8u40-jdk #拉取java作为基础镜像
COPY SpringTestJAR.jar /usr/local/ #将打包好的jar包放到工作目录
WORKDIR /usr/local/ #指定工作目录
CMD java -jar SpringTestJAR.jar #使用cmd运行jar
Execute command in post build steps
:
cd /usr/local/test/docker #为了预防错误,使用绝对路径
mv ../target/*.jar ./ #根据Dockerfile特性,将需要运行的jar包放置在与Dockerfile同一级目录下
docker-compose down #关闭之前启动的项目
docker-compose up -d --build #使用docker-compose进行项目的构建
docker image prune -f #删除之前多次构建产生的文件名为none的文件
CD操作需要配合版本控制,实现参数化构建,需要用到之前下载的插件Git parameter
。
回到Jenkins,在工程(Project) -> 配置(Configure)
中,通用配置(General)
下找到参数化构建
选择Git Parameter
,自定义版本标签,例如tag
。在下方的Build Steps
中添加Shell命令git checkout $tag
使Jenkins可以构建指定版本的代码,$
符号后即为自定义版本标签名。需要注意的是,Jenkins的构建步骤配置支持拖拽,需要将新添加的版本控制命令放在构建的第一步。
进入GitLab,为不同版本的代码创建标签,Jenkins可以根据不同的标签构建不同版本的代码。使用Jenkins进行参数化构建的优点在于,当新版本项目上线时遇到不可预测的问题时,可以及时回滚到之前的版本,节约了大量时间。
前往SonarQube官网查看当前版本,选择长期支持版。本次选择7.8社区版。
需要注意的是,SonarQube与JDK的版本是有对应关系的,考虑到编写项目与maven构建时使用的JDK版本都是1.8,所以应当选用支持的SonarQube版本。SonarQube支持JDK1.8的最后一个版本是7.8社区版,故本次实验选择的镜像版本为sonarqube:7.8-community
。
建议在商业环境中采用PostgreSQL,也需要拉取PostgreSQL的镜像:
docker pull postgres
docker pull sonarqube:7.8-community
本次选择将SonarQube启动目录与Jenkins启动目录同级放置:
cd /usr/local/docker
mkdir sonarqube_docker
version: "3.1"
services:
db: #指定数据库服务
image: postgres #数据库镜像名
container_name: db #数据库容器名
ports: #数据库端口映射
- 5432:5432
networks: #指定网络控制
- sonarnet
environment: #配置数据库用户名与密码
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
sonarqube: #指定sonarqube服务
image: sonarqube:7.8-community #sonarqube镜像名
container_name: sonarqube #sonarqube容器名
depends_on: #设置数据库服务在sonarqube启动前启动
- db
ports: #sonarqube端口映射
- "9000:9000"
networks: #指定网络控制,使两个容器都处于一个网络服务下
- sonarnet
environment: #设置数据库连接、用户名与密码
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
networks: #设置网络控制模式为桥接
sonarnet:
driver: bridge
等待SonarQube启动,等待时可以查看容器日志:
docker logs sonarqube -f
若报错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
说明虚拟内存不足,需增添虚拟内存。修改/etc/sysctl.conf
,在文末添加:
vm.max_map_count=262144
重新启动容器:
docker-compose restart
SonarQube的初始账户与密码都是admin
,直接登陆后更新密码即可。可下载中文支持插件。若启动后登录时遇到Sonarqube is under maintenance
的提示,代表SonarQube正在维护,管理员运行*(SonarQube链接)/setup
即可开始系统升级。
对于5.1拉取镜像
中提到的,若SonarQube不支持项目使用的JDK版本,可能会出现UnsupportedClassVersion
错误。此时需要删除容器并重新部署兼容的SonarQube。在删除容器时应当按照如下步骤进行:
docker ps -a #查看docker全部容器,观察状态为UP的容器
docker stop * #根据容器ID停止容器,对于容器数量较少的情况使用ID前三位即可
docker rm * #在容器停止后根据容器ID删除容器
docker images #查看docker现有镜像
docker rmi * #根据镜像ID删除不需要的镜像