【gitlab+jenkins+docker】第二節 docker版gitlab安裝和配置

【gitlab+jenkins+docker】手把手教你搭建基於gitlab+jenkins+docker的項目的自動化部署流程

前言

使用現成的docker容器能夠快速搭建gitlab服務,且管理起來很方便,具有容災、可移植等優點

路徑創建

爲了避免不必要的錯誤,建議數據存放路徑與我這裏保持一致:

[root@JackRoy ~]# mkdir -p /opt/dockers/docker_tool_gitlab/online
[root@JackRoy ~]# mkdir -p /opt/dockers/docker_tool_gitlab/gitlab_data
[root@JackRoy ~]# mkdir -p /opt/dockers/docker_tool_gitlab/gitlab_data/config
[root@JackRoy ~]# mkdir -p /opt/dockers/docker_tool_gitlab/gitlab_data/logs
[root@JackRoy ~]# mkdir -p /opt/dockers/docker_tool_gitlab/gitlab_data/data

封裝docker啓動命令

這裏借用一下同事劉某源(感謝老源~)編寫的docker啓動命令,直接編輯輸入:

[root@JackRoy online]# vim /usr/bin/dockerutils
#!/bin/bash
# Settle issue (e.g.: SELINUX) of when mount host directory, it has no privilege to access. 
chcon -Rt svirt_sandbox_file_t $dir > /dev/null 2>&1
container_name=
TOP_PID=$$
trap 'exit 127' TERM
gate_way=`route | grep 'default' | awk '{print $2}'`
code=0
find_name(){
    _container_name=`cat $dir/docker-compose.yml  | grep container_name | awk -F ':' '{print $2}' |  sed  's/^[       ]*//g'  | sed  's/[ ]*$//g'`
    _container_name=${_container_name//\"/}
    container_name=${_container_name//\'/}
    if [ x$container_name == x ]
       then
         echo -e "\033[31mERROR : please set container_name in your docker-compose.yml file \033[0m"
         kill -s TERM $TOP_PID
    fi
}
check(){
    _host_name=`cat $dir/docker-compose.yml  | grep hostname | awk -F ':' '{print $2}' |  sed  's/^[       ]*//g'  | sed  's/[ ]*$//g'`
    _host_name=${_host_name//\"/}
    host_name=${_host_name//\'/}
echo "-------------------------------------------------"$host_name
    if [ x$host_name == x ]
       then
         echo -e "\033[31mERROR : hostname not set !  \033[0m"
		 code=1
    fi	
   _ip=`cat $dir/docker-compose.yml  | grep ipv4_address | awk -F ':' '{print $2}' |  sed  's/^[       ]*//g'  | sed  's/[ ]*$//g'`
   _ip=${_ip//\"/}
   ip=${_ip//\'/}
   if [ $1 = y ] ; then
      fail=`ping $ip -c 3 -s 1 -W 1 | grep "100% packet loss" | wc -l`
      if [ $fail -eq 0 ] 
         then
         echo -e "\033[31mERROR : address is already in use \033[0m"
         code=1
      fi
    
   fi
   if [ $code -ne 0 ] ; then  kill -s TERM $TOP_PID  ;fi 

}
up(){
    check n
    docker-compose -f $dir/docker-compose.yml up -d
    start
}
reup(){
   docker rm -f $container_name
   up
}
start(){
   docker start $container_name
}

stop(){
   docker stop $container_name
}

restart(){
   docker stop $container_name
   sleep 3
   docker start $container_name
}
usage(){
     echo -e " Usage : \n \t $0 [ usage ] |  < up | reup | start | stop | restart > "
     echo -e "\t ============= nat docker ==============="
     echo -e "\t up : create container and start app"
     echo -e "\t reup : re-create container and start app" 
     echo -e "\t start : start container and app"
     echo -e "\t stop : stop container and app"
     echo -e "\t restart : restart container and app" 
     kill -s TERM $TOP_PID
}
if [ "$1"x = ""x ] || [ "$1"x = "usage" ] ; then
   usage
fi
find_name
$@ 
exit $?

創建啓動配置文件

進入/opt/dockers/docker_tool_gitlab/online目錄下:

[root@JackRoy online]# cd /opt/dockers/docker_tool_gitlab/online

編輯deploy_comm.sh並輸入:

#!/bin/bash
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
.  dockerutils $@

編輯docker-compose.yml並輸入:

version: '2'
services:
    gitlab:
      image: 'gitlab/gitlab-ce'   # 使用鏡像
      container_name: "gitlab"    # 容器名
      restart: unless-stopped     # 容器退出時總是重新啓動
      privileged: true            # 開通權限
      hostname: 'gitlab'          # 主機名
      environment:
       TZ: 'Asia/Shanghai'        # 時區
      ports:
         - '9090:9090'           # 宿主機端口:docker端口  有端口占用的情況請換宿主機端口
         - '2222:22'
      volumes:
         - ../gitlab_data/config:/etc/gitlab     # 內外路徑映射關係
         - ../gitlab_data/data:/var/opt/gitlab
         - ../gitlab_data/logs:/var/log/gitlab
      networks:
        aidata_network:                         # 使用網絡 
          ipv4_address: 10.111.113.3            # 分配ip

networks:
  aidata_network:
    external: true

啓動

在/opt/dockers/docker_tool_gitlab/online路徑下,執行啓動命令

# deploy_comm.sh 支持 reup up stop多種命令
[root@JackRoy online]# sh deploy_comm.sh reup
-------------------------------------------------gitlab
Pulling gitlab (gitlab/gitlab-ce:)...
Trying to pull repository docker.io/gitlab/gitlab-ce ... 
latest: Pulling from docker.io/gitlab/gitlab-ce
3386e6af03b0: Pull complete
49ac0bbe6c8e: Pull complete
d1983a67e104: Pull complete
1a0f3a523f04: Pull complete
0a1871e024e9: Pull complete
22db415dc935: Pull complete
7a635a8736d3: Pull complete
cc0ef2dfa7c2: Pull complete
816bca05932d: Pull complete
9aff335224a3: Pull complete
Digest: sha256:ad3988896b5c7ccf8272bc6987ce5cff132164e9a6bfc252976b6a2a98bd4896
Status: Downloaded newer image for docker.io/gitlab/gitlab-ce:latest
Creating gitlab ... done
gitlab

執行啓動命令以後我們進入docker容器,如果能成功進入那便是執行成功了:

[root@JackRoy online]# docker exec -it gitlab bash
root@gitlab:/# 
root@gitlab:/# exit
exit

頁面配置

訪問url:

http://10.20*.4.5*:9090/users/password/edit?reset_password_token=1G_Ns5rhU_gDrppdfVJR

效果如下:
在這裏插入圖片描述
這個頁面需要設置密碼,設置完了用root登錄:
在這裏插入圖片描述
成功登錄以後,先創建一個空項目:
在這裏插入圖片描述
在這裏插入圖片描述
項目創建完成以後,我們將我們存放代碼的本機公鑰配置到用戶的sshkey中:

在這裏插入圖片描述
在這裏插入圖片描述

上傳代碼

上傳代碼前需要說明,這裏凡是spring boot項目都需要自帶兩個文件,分別是:logback.xml和start-app.sh,其中logback.xml是用來規範打印日誌格式,start-app.sh用來在docker中啓動項目jar包。
請把logback.xml文件放於resources目錄下與application.yml同級:
在這裏插入圖片描述
logback.xml內容(無需更改):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="fileBasePath" value="./logs" />
    <!-- 控制檯 appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 出錯日誌 appender  -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滾 daily -->
            <!-- log.dir 在maven profile裏配置 -->
            <fileNamePattern>${fileBasePath}/sales-error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日誌最大的歷史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日誌 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 訪問日誌 appender  -->
    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滾 daily -->
            <fileNamePattern>${fileBasePath}/sales-access-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日誌最大的歷史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- info日誌 appender  -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滾 daily -->
            <fileNamePattern>${fileBasePath}/sales-info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日誌最大的歷史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日誌 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--日誌打印的包的範圍,及分類日誌文件存儲 -->
    <logger name="com.lvmama.dstools" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ERROR"/>
        <appender-ref ref="ACCESS"/>
        <appender-ref ref="INFO" />
    </logger>

    <!--控制檯打印資源加載信息-->
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

同時,在項目根(注意一定是項目根目錄,與src同級)目錄下創建config目錄,並新建一個名爲start-app.sh的腳本:
在這裏插入圖片描述
start-app.sh明細(需要修改APP_NAME和APP_JAR):

#!/usr/bin/sh
JAVA_HOME=/opt/jdk1.8
PATH=$PATH:$JAVA_HOME/bin:.
export JAVA_HOME PATH

dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)

conf=${dir}/config

APP_NAME='euraka-server'                          # 修改點1
APP_JAR=${dir}/euraka-server-1.0.0-SNAPSHOT.jar   # 修改點2
LOG_PATH=${dir}/logs


command="nohup java -Xms2g -Xmx2g -Dlog.path=$LOG_PATH  -Dlogback.configurationFile=$conf/logback.xml  -jar $APP_JAR"
log_file_url="logs/log.`hostname`.log"
pid_file="ds-platformawareness.$(hostname).pid"
log_path="logs"


cd $dir


start(){
    if [ "$log_file_url" != "" ]; then
        echo "STARTING $APP_NAME ....."
        exec $command  > "$log_file_url" 2>&1 &
        echo $! > "$pid_file"
    else
        echo "STARTING $APP_NAME ....."
        exec $command &
        echo $! > "$pid_file" &
    fi
}
stop(){
    echo "STOPING $APP_NAME ....."
    PID=$(cat "$pid_file")
    kill -9 $PID
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        printf 'Usage: %s {start|stop|restart}\n'
        exit 1
        ;;
esac

在windows本地使用gitbash上傳代碼至gitlab倉庫,如果沒有裝gitlab先裝一下(網上教程很多,我這裏就不贅述了),確保安裝了gitlab以後,我們打開交互窗口進到項目目錄,依次執行(注意:ssh://[email protected]*.4.5*:2222/root/ucash-servers.git從gitlab項目主頁面處獲取,不要直接copy這裏的):

$ cd d:
$ cd project/ucash-servers/
$ rm -rf .git
$ git init
# ssh://[email protected]*.4.5*:2222/root/ucash-servers.git從gitlab項目主頁面處獲取,不要直接copy這裏的
$ git remote add origin ssh://[email protected]*.4.5*:2222/root/ucash-servers.git
$ git add .
$ git commit -m "JackRoy test"
$  git push -u origin master

上傳完成以後,可以去gitlab項目主頁確認一下:
在這裏插入圖片描述

後記

寫博客的時候我重新找了臺乾淨的機器進行部署,整個流程沒有出現任何問題(以前踩過坑,但都被規避了,這裏的流程就是最精簡的),大家如果在部署過程遇到什麼問題,可以留言交流

跳轉

第一節 基礎環境介紹與準備
第二節 docker版gitlab安裝和配置
第三節 docker版jenkins安裝和配置
第四節 docker版mysql安裝和配置
第五節 docker信息明細表設計與實現(含收集腳本)
第六節 docker容器自動化生成腳本
第七節 自動生成docker容器並啓動項目

發佈了48 篇原創文章 · 獲贊 71 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章