DevOps实战笔记--1(机器配置;基础服务;Docker;GitLab;JDK+Maven;Jenkins+CI+CD;SonarQube)

喻增
2023-12-01

0. 机器配置(node1):

运行内存:6 G
磁  盘:50G
镜像文件:CentOS-7-x86_64-Everything-2009.iso
注意:使用最小安装时,系统命令不完整,个别命令需手动重新安装(例如 vim 、 wget 、 curl 、 ifconfig( net-tools) 、 zip、unzip)

0.1 基础服务:

0.1.1 网络配置:

在配置好虚拟网卡的情况下,修改/etc/sysconfig/network-scripts/下的网卡配置文件,设置BOOTPROTO=staticONBOOT=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

重启网络服务。

0.1.2 ssh:

yum list installed | grep ssh

查看机器是否安装ssh服务,进行ssh的相关配置

0.1.3 防火墙关闭:

systemctl stop firewalld #停止防火墙服务
systemctl disable firewalld #禁止防火墙开机自启

0.2 Docker

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启动命令忘了)

0.3 docker-compose

登录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 #验证安装

0.3.1 准备docker-compose.yml

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'

1. GitLab服务器搭建

1.1 检索现有的镜像

docker search gitlab

1.2 拉取镜像

docker pull gitlab/gitlab-ce

1.3 启动容器

yml文件放在容器的自定义启动目录下,在该目录下使用启动命令启动docker容器:

docker-compose up -d #使用更名后的docker-compose进行启动

1.4 等待服务器启动

期间可以监控docker-compose日志:

docker-compose logs -f

初次登录需要等待较长的启动时间,Gitlab消耗内存较大,建议机器内存4G以上

1.5 登录Gitlab

初次登录root用户需要原始密码,进入容器并查看inital_root_password:

docker exec -it gitlab cat /etc/gitlab/initial_root_password

更改密码后需要重新登录。

2. JDK与Maven安装(以下内容需要对node1进行克隆,并在新的机器上进操作,命名为node2)

2.1 去官网下载相关.tar.gz文件

2.2 解压到指定目录下

2.3 配置*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>

3.Jenkins安装与配置

3.1 拉取镜像

前往Jenkins官网查看当前Jenkins版本,本次使用2.387.1的LTS长期支持版本:

docker pull jenkins/jenkins:2.387.1-lts

3.2 创建启动目录

cd /usr/local 
mkdir -p docker/jenkins_docker #在/usr/local下创建启动目录

3.3 准备docker-compose.yml

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/

3.4 启动容器

在启动目录下使用启动命令启动jenkins容器:

docker-compose up -d

由于jenkins的家目录要映射到./data下,可能会因为权限问题导致该文件夹下的某些文件无法创建,查看容器日志:

docker logs jenkins -f

此时需要更改./data的权限:

chmod -R 777 data

3.5 更改jenkins默认下载地址

由于初次启动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>

3.6 重新启动容器

docker-compose restart

3.7 登录Jenkins

首次登录的管理员密码可以在日志中查看,也可进入容器内部查看:

docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

3.8 配置Jenkins

在使用管理员登录Jenkins后,系统会提示进行插件的安装,本次选择安装自定义选项中的默认选项。等待插件安装完成后,进入Jenkins。若遇到个别插件安装失败的问题,可以直接去往Jenkins官网进行插件的单独下载。

下载完成后,由于业务需求,需要前往插件管理页面下载另外几个插件Git ParameterPublish Over SSH

由于Jenkins的功能是将代码从仓库拉取下来并进行构建,所以需要将JDKMaven映射到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中使用容器内的路径添加JDKMaven,在没有本地配置的情况下,可以选择勾选自动安装。

插件Publish Over SSH的目的在于将代码远程地部署到目标服务器上,此插件安装成功后,可以在Manage Jenkins -> Configure System中找到Publish Over SSH选项,在此处新增SSH服务器,指定该服务器的远程操作目录,设定用户并在高级选项中设置密码,本次使用root用户。
测试连接,查看结果。

4. 使用Jenkins进行基础CI/CD操作

基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现CI持续集成

基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD持续部署

4.1 基础CI操作

Jenkins拉取代码:
开发人员编写项目后,在本地测试无异常,推送到GItlab的对应项目中。在Jenkins中新建项目,配置源码拉取,在首页进行构建。此时进入Jenkins容器内部可以在workspace目录下看到拉取下来的项目。

Jenkins打包并上传目标服务器:
使用Jenkins对项目进行打包需要配置Maven,在构建选项下找到调用顶层Maven选项,配置打包命令,在构建后(Post build)选项下配置源文件路径,指定后会将该路径下的对应文件发布到目标服务器。回到项目,在项目中添加Dockerfiledocker-compose文件,并将docker相关文件发布至目标服务器,可以使测试代码基于docker运行。

4.2 CI操作可能遇到的问题以及注意事项

在实验过程中发现,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的文件

4.3 基础CD操作

CD操作需要配合版本控制,实现参数化构建,需要用到之前下载的插件Git parameter

回到Jenkins,在工程(Project) -> 配置(Configure)中,通用配置(General)下找到参数化构建选择Git Parameter,自定义版本标签,例如tag。在下方的Build Steps中添加Shell命令git checkout $tag使Jenkins可以构建指定版本的代码,$符号后即为自定义版本标签名。需要注意的是,Jenkins的构建步骤配置支持拖拽,需要将新添加的版本控制命令放在构建的第一步。

进入GitLab,为不同版本的代码创建标签,Jenkins可以根据不同的标签构建不同版本的代码。使用Jenkins进行参数化构建的优点在于,当新版本项目上线时遇到不可预测的问题时,可以及时回滚到之前的版本,节约了大量时间。

5. SonarQube安装与配置

5.1 拉取镜像

前往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

5.2 创建启动目录

本次选择将SonarQube启动目录与Jenkins启动目录同级放置:

cd /usr/local/docker
mkdir sonarqube_docker

5.3 准备docker-compose.yml

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

5.4 启动容器

等待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

5.5 登录SonarQube

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删除不需要的镜像
 类似资料: