从零开始的gitlab-cicd环境搭建

一、gitlab的搭建

这两个搭建有两种方式,一种是docker的搭建方式(这种相对比较简单),一种是安装宿主机上(配置可能稍微繁琐了些),这里只讲docker的方式:

1、docker的安装

首先我们可以使用ssh工具连到linux(ubuntu)服务器中,

先安装好docker环境,具体安装docker的如下:

1.1. 更新源
apt-get update
1.2. 安装docker,安装及自动启动
apt-get install docker.io -y
1.3. 查看版本
docker --version
1.4. 查看正在运行的容器的信息
docker ps

当我们看到入下图,则说明我们docker环境安装成功:
在这里插入图片描述

2、docker部署gitlab

2.1. 拉取gitlab镜像
docker pull gitlab/gitlab-ce
2.2. 运行gitlab容器
docker run -d -p 80:80 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
2.3. 修改配置文件

修改gitlab.rb配置文件
(这里挂载了gitlab容器中的文件到了宿主机,直接修改宿主机上的相应路径的文件,便修改了容器内的文件)

vim /home/gitlab/config/gitlab.rb  

配置http协议所使用的访问地址,不加端口号默认为80,这里修改为该服务器的ip地址,如:

external_url 'http://192.168.1.245'

进入到容器内部,修改gitlab.yml文件

vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

如下图:

在这里插入图片描述
另外有邮箱其他的配置信息,根据需要配置,修改完成之后,保存退出.

:wq!
2.4. 重启容器
docker restart gitlab
2.5. 浏览器访问

浏览器访问ip即可,如:

192.168.1.245

注: 刚开始可能重启会有点慢,会有502页面,稍等片刻,再次刷新就可以了,然后修改密码,登入即可.

二、gitlab-runner搭建

首先需要在宿主机安装好java环境

1、准备java环境

1.1. 下载安装openjdk-8
apt install openjdk-8-jdk

安装成功后,则查看java环境

java -version

jdk安装路径为:

/usr/lib/jvm/java-8-openjdk-amd64/
1.2. 配置环境变量
vi etc/profile

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

修改完了保存并退出,执行命令使配置生效:

source /etc/profile

这里理论上是不需要了,但我后面需要把jdk挂载到容器中,需要用到。

2、准备maven环境

2.1. 安装maven

这里我是拷贝了自己电脑上的maven和本地仓库到宿主机,如图:
在这里插入图片描述
当然需要重新配置maven的本地仓库的地址:
在这里插入图片描述

2.2. 配置maven环境变量
vim /etc/profile

追加配置信息,如下图所示:
在这里插入图片描述
修改完了保存并退出,执行命令使配置生效:

source /etc/profile

查看maven环境:

mvn -v

在这里插入图片描述
看到输出信息,说明宿主机的maven环境配置成功了

3、准备nodejs环境

3.1. 下载nodejs包

这里我使用的10.16.3的版本

wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
3.2. 解压压缩包
tar xvf node-v10.16.3-linux-x64.tar.xz
3.3. 移动/重命名文件夹

修改名字并移动到usr/local/目录下

mv node-v10.16.3-linux-x64 nodejs

配置,需要创建软链接,以便全局使用

ln -s /usr/local/nodejs/bin/node /usr/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm
3.4. 完成检验

执行命令

node -v  && npm -v

如下图:

在这里插入图片描述
看到以上输出信息说明成功

4、gitlab-runner的安装

4.1. 拉取镜像&运行容器
docker run --name=gitlab-runner --restart=always --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=DEBIAN_FRONTEND=noninteractive --volume=/srv/gitlab-runner/config:/etc/gitlab-runner:rw --volume=/var/run/docker.sock:/var/run/docker.sock:rw --volume=/usr/bin/docker:/usr/bin/docker:rw --volume=/usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib64/libltdl.so.7:rw --volume=/usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64:rw --volume=/java_environment:/java_environment:rw --volume=/etc/profile:/etc/profile:rw --volume=/usr/local/nodejs:/usr/local/nodejs:rw --volume=/home/gitlab-runner --volume=/etc/gitlab-runner --restart=always --detach=true gitlab/gitlab-runner:latest run --user=root --working-directory=/home/gitlab-runner
4.2. docker run的参数说明
--restart=always 
#Docker重启后该容器也为随之重启

-u root          
#以root的身份去运行镜像(避免在容器中调用Docker命令没有权限)
#最好使用docker用户去运行

-v /usr/bin/docker:/usr/bin/docker
#将宿主机的docker命令挂载到容器中
#可以使用which docker命令查看具体位置
#或者把挂载的参数改为: -v $(which docker):/usr/bin/docker

-v /var/run/docker.sock:/var/run/docker.sock
#容器中的进程可以通过它与Docker守护进程进行通信

-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
#libltdl.so.7是Docker命令执行所依赖的函数库
#容器中library的默认目录是 /usr/lib/x86_64-linux-gnu/
#把宿主机的libltdl.so.7 函数库挂载到该目录即可
#可以通过whereis libltdl.so.7命令查看具体位置
#centos7位置/usr/lib64/libltdl.so.7
#ubuntu位置/usr/lib/x86_64-linux-gnu/libltdl.so.7

--volume=/etc/profile:/etc/profile:rw
#挂载了/etc/profile环境配置文件,用来使java和maven环境生效

--volume=/usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64:rw 
--volume=/java_environment:/java_environment:rw
--volume=/usr/local/nodejs:/usr/local/nodejs:rw
#挂载宿主机的java的配置文件路径,使用宿主机的java环境、maven环境和nodejs环境

这里需要注意的事

gitlab安装和gitlab-runner的安装地址作用不一样

根据我们开发的需要来安装

比如,我们私有的代码仓库是在192.168.1.1,而我们开发环境是在192.168.1.2,测试环境在192.168.1.3

那么我们在192.168.1.1搭建了gitlab,gitlab-runner这个应该分别在192.168.1.2和192.168.1.3的服务器上,这样做的意义,

在项目的配置文件中则只要利用设置对应的tag(标签)来区分我们要部署到的对应环境即可。

5、gitlab-runner的注册

5.1. 获取gitlab-ci的Token和地址

需要使用管理员账号登录到gitlab上
在这里插入图片描述

5.2. 注册gitlab-runner

进入192.168.1.2服务器中,

docker exec -it gitlab-runner /bin/bash

执行命令注册gitlab-runner

gitlab-runner register

注册步骤:

1.输入gitlab的服务URL,这个使用的是https://gitlab.com/
2.输入gitlab-ci的Toekn,获取方式参考上图
3.关于集成服务中对于这个runner的描述
4.给这个gitlab-runner输入一个标记,这个tag非常重要,在后续的使用过程中需要使用这个tag来指定gitlab-runner
5.是否运行在没有tag的build上面。在配置gitlab-ci的时候,会有很多job,每个job可以通过tags属性来选择runner。这里为true表示如果job没有配置tags,也执行
6.是否锁定runner到当前项目
7.选择执行器,gitlab-runner实现了很多执行器,可用在不同场景中运行构建,详情可见GitLab Runner Executors,这里选用Shell模式

刷新页面就可以看到新增的一个Runner:
在这里插入图片描述

5.3. 配置runner

在这里插入图片描述
把项目加到该runner到便可以了。

三、部署

1、后端(Java)部署

.gitlab-ci.yml 文件需要放在项目的根目录下

1.1. pom文件配置

pom.xml 需要配置maven插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </build>
1.2. 关于.gitlab-ci.yml的预设变量的说明

预设变量

1.3. gitlab-ci.yml 文件配置和说明
variables:
  ENVIRONMENT: test  # 开发环境设置为dev、生产环境为prod,测试环境为test
  HOST_PORT: port  # 宿主机端口
  CONTAINER_PORT: port  # 容器端口
  PROJECT_NAME: project_name  # 项目名称

#  部署阶段
stages:
  - build_deploy

build_dev:
  stage: build_deploy
  tags:
    - cloud_test # 开发环境设置为cloud_dev、生产环境为cloud_prod,测试环境为cloud_test(192.168.1.2)
  script:
    - source /etc/profile # 使容器内配置文件生效
    - mvn -v # 检查maven环境
    - java -version # 检查java环境
    - echo "$CI_JOB_STAGE"  # 预设变量
    - echo "Project will be packaged! !"
    - mvn clean package -Dmaven.test.skip=true # 跳过测试打包
    - echo "Packaged successly!"
    - echo "Build image and deploy project start!"
    - export TZ=UTC-8  # 设置当前时区
    - export CURRENT_DATE=$(date -d "now" '+%Y%m%d%H%M%S')  # 当前日期时间
    - echo "$CURRENT_DATE"  # 输出日期时间
    - ls ./target
    - cp ./target/${PROJECT_NAME}-1.0.0.jar ${PROJECT_NAME}-1.0.0.jar  # 设置从target拷贝出来的原因是在docker内找不到target下的文件...
    - ls
    - export CONTAINER=$(docker ps --format "table {{.Names}}" | grep ${PROJECT_NAME}_${ENVIRONMENT})  # 根据项目名字查看当前运行的docker
    - echo "$CONTAINER"  # 输出查找到的docker容器
    - if [ -n "$CONTAINER" ];then docker stop $CONTAINER; fi; # 如果存在相同项目名的docker容器,则把该容器停止。
    - if [ -z "$CONTAINER" ];then echo "empty~"; fi;  # 找不到则输出empty~
    - docker build -t cloud/${PROJECT_NAME}_${ENVIRONMENT}_${CURRENT_DATE}:latest . && docker run -d -it -p ${HOST_PORT}:${CONTAINER_PORT} --name ${PROJECT_NAME}_${ENVIRONMENT}_${CURRENT_DATE} cloud/${PROJECT_NAME}_${ENVIRONMENT}_$
    {CURRENT_DATE}:latest  #  构建镜像并运行起来
    - echo "Deploy finished!"  # 完成部署
    - echo "Project already be deployed in Development environment"
1.4. 关于Dockerfile

该文件放在项目的根目录

project_name #项目名称

version #版本

spring.profiles.active=test #打包环境
如下图配置:

在这里插入图片描述

# 基础镜像使用java
FROM java:8
# WORKDIR 指定了临时文件目录为/ROOT。
WORKDIR /ROOT
# 将jar包复制到项目的根目录
COPY project_name-version.jar /project_name-version.jar
# 端口开放
EXPOSE 83
## 运行jar包 (开发环境设置为dev、生产环境为prod,生产环境为test)
ENTRYPOINT ["java","-Dfile.encoding=UTF-8", "-jar", "/project_name-version.jar","--spring.profiles.active=test"]

2、前端(Vue)部署

2.1. gitlab-ci.yml 文件的配置
variables:
  ENVIRONMENT: test  # 开发环境设置为dev、生产环境为prod,测试环境为test
  HOST_PORT: port  # 宿主机端口
  CONTAINER_PORT: port  # 容器端口
  PROJECT_NAME: project_name  # 项目名称

stages:
  - build_deploy

build_dev:
  stage: build_deploy
  tags:
    - cloud_test # 开发环境设置为cloud_dev、生产环境为cloud_prod,测试环境为cloud_test(192.168.1.245)
  script:
    - echo "Starting to install node_modules..."
    - node -v  # 检查node 版本
    - npm -v   # 检查npm 版本
    - npm config get registry
    - ls -a
    - npm install --unsafe-perm=true --allow-root  #  npm 打包
    - echo "Web project will be packaged! !"
    - ls -a
    - npm run test  #  测试环境
    - echo "Package successly! "
    - export CONTAINER=$(docker ps --format "table {{.Names}}" | grep ${PROJECT_NAME}_${ENVIRONMENT})
    - echo "$CONTAINER"
    - export TZ=UTC-8
    - export CURRENT_DATE=$(date -d "now" '+%Y%m%d%H%M%S')
    - echo "$CURRENT_DATE"
    - if [ -n "$CONTAINER" ];then docker stop $CONTAINER; fi;
    - if [ -z "$CONTAINER" ];then echo "empty~"; fi;
    - docker build -t ${PROJECT_NAME}_${ENVIRONMENT}_${CURRENT_DATE}:latest . && docker run -d -it -p ${HOST_PORT}:${CONTAINER_PORT} --name ${PROJECT_NAME}_${ENVIRONMENT}_${CURRENT_DATE} ${PROJECT_NAME}_${ENVIRONMENT}_${CURRENT_DATE}:latest
    - echo "Web Projcet deploy successly! "
2.2. Dockerfile的配置
# 该项目在192.168.1.2这个服务器上, 发布的时候
FROM nginx
# 定义作者
MAINTAINER MAINTAINER _NAME
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY ./dist  /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 84
RUN echo 'echo init ok!!'
2.3. nginx文件的配置
这里根据公司/个人项目需要配置
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐