第十一周gitlab及jenkins

1、安装配置gitlab服务,在gitlab新建一个仓库,配置本地密钥,并通过ssh方式拉取gitlab仓库代码

https://packages.gitlab.com/gitlab/gitlab-ce?page=1 gitlab包下载地址

wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.3.4-ce.0.el7.x86_64.rpm/download.rpm


修改配置文件,并启动服务

root@gitlab:~# grep "^[a-Z]" /etc/gitlab/gitlab.rb

external_url 'http://192.168.1.196.3'

#可选邮件通知设置

gitlab_rails['smtp_enable'] = true

gitlab_rails['smtp_address'] = "smtp.qq.com"

gitlab_rails['smtp_port'] = 465

gitlab_rails['smtp_user_name'] = "961161266@qq.com"

gitlab_rails['smtp_password'] = "授权码"

gitlab_rails['smtp_domain'] = "qq.com"

gitlab_rails['smtp_authentication'] = :login

gitlab_rails['smtp_enable_starttls_auto'] = true

gitlab_rails['smtp_tls'] = true

gitlab_rails['gitlab_email_from'] = "2973707860@qq.com"

user["git_user_email"] = "961161266@qq.com"


执行配置并启动服务:

 gitlab-ctl reconfigure #修改完配置文件要执行此操作


# gitlab-rails #用于启动控制台进行特殊操作,比如修改管理员密码、打开数据库控制

台( gitlab-rails dbconsole)等

# gitlab-psql #数据库命令行

root@s1:~# gitlab-psql

psql (9.6.11)

Type "help" for help.

gitlabhq_production=# \db

List of tablespaces

Name | Owner | Location

------------+-------------+----------

pg_default | gitlab-psql |

pg_global | gitlab-psql |

(2 rows)

# gitlab-rake #数据备份恢复等数据操作

# gitlab-ctl #客户端命令行操作行

# gitlab-ctl stop #停止 gitlab

# gitlab-ctl start #启动 gitlab

# gitlab-ctl restar #重启 gitlab

# gitlab-ctl status #查看组件运行状态

# gitlab-ctl tail nginx #查看某个组件的日志


设置密码。

默认用户为root,口令没有第一次登陆时需要设置口令


使用管理员 root 创建组,一个组里面可以有多个项目分支,可以将开发添加到组里

面进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不

同的开发即可实现对开发设置权限的管理。





git 客户端测试 clone 项目:


编辑文件并测试提交:root@jenkins:/source

# cd test-project/

# git config --global user.name  #配置一个用户名

# git config --global user.email 2973707860@qq.com #配置一个邮箱

# vim index.html

 cat index.html

11111111111

22222222222

# git add index.html #添加至本地

# git commit -m "v1"#将代码打上标签


git config --global user.name “name“ #设置全局用户名

git config --global user.email xxx@xx.com #设置全局邮箱

git config --global --list #列出用户全局设置

git add index.html / . #添加指定文件、目录或当前目录下所有数据到暂存区

git commit -m “11“ #提交文件到工作区

git status #查看工作区的状态

git push #提交代码到服务器

git pull #获取代码到本地

git log #查看操作日志

vim .gitignore #定义忽略文件

git reset --hard HEAD^^ #git 版本回滚, HEAD 为当前版本,加一个^为上一个,^^为上上一个版本

git reflog # #获取每次提交的 ID,可以使用--hard 根据提交的 ID 进行版本回退

git reset --hard 5ae4b06 #回退到指定 id 的版本

# git branch #查看当前所处的分支

#git checkout -b develop #创建并切换到一个新分支





复制ssh链接





2、安装配置jenkins,并实现jenkins和gitlab集成,实现jenkins自动化更新回滚


配置 java 环境并部署 jenkins:

https://jenkins.io/zh/download/下载地址

vim /etc/sysconfig/jenkins #修改配置文件,为了后面的权限设置问题,将用户改为root

JENKINS_USER="root"


systemctl start jenkins #启动服务

tail -f  /var/log/jenkins/jenkins.log

查看日志,在第一次启动jenkins时,会生成一串秘钥。后面安装时需要提供

/var/lib/jenkins/secrets/initialAdminPassword #在此文件中也会生成字符串





选择推荐安装




4.1.11:jenkins 插件管理及安装:

4.1.11.1:插件安装目录:

插件下载地址:http://updates.jenkins-ci.org/download/plugins/



4.1.12:配置 jenkins 权限管理:

基于角色的权限管理,先创建角色和用户,给角色授权,然后把用户管理到角色。



4.1.12.3:更改认证方式:

Jenkins—系统管理—全局安全配置

默认创建的用户登录后可以做任何操作,取决于默认的认证授权方式。





在系统配置中可以添加邮箱认证

新建自由风格项目

在凭据中添加私钥,用于链接gitlab仓库

在项目中可以添加gitlab仓库。使用ssh秘钥认证


启动tomcat 使用jenkins自动部署代码至tomcat

yum install java-1.8.0-openjdk-devel #安装devel版本,会自动解决其他依赖关系

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz #下载tomcat二进制安装包

tar xf apache-tomcat-8.5.45.tar.gz -C /usr/local/ #解压至usr/local目录中

ln -s apache-tomcat-8.5.45.tar.gz tomcat #创建软连接方便以后修改

useradd tomcat #添加用户,修改属组 ,tomcat默认以普通身份运行,需要修改文件权限

chown -R .tomcat .

chmod g+r conf/*

chmod g+rx conf/

chown -R tomcat logs/ temp/ work/

vim /etc/profile.d/cols.sh #修改tomcat命令行配置。

PS1='[\e[32;40m\u@\h \W\e[m]$ '

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tomcat/bin

更好一下tomcat中的appbase目录

启动catalina.sh start

配置gitlab仓库地址,使用秘钥认证连过去


使用shell执行命令

进入jenkins中。系统自带目录(默认创建项目时会创建根项目同名的目录在/var/lib/jenkins/workspace中)

拉取代码至本地。远程停止tomcat服务。在将文件替换至目标目录,之后启动服务

输出信息


添加slave节点


4.3:pipline:

官方介绍;https://jenkins.io/2.0/

pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核

心插件,简单来说 Pipline 就是一套运行于 Jenkins 上的工作流框架,将原本独立运行

于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而

实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline 的实现方式是一套

Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。

4.3.2:pipline 语法:

Stage:阶段,一个 pipline 可以划分为若干个 stage,每个 stage 都是一个操作,比如

clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个 node

执行。

Node:节点,每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是

jenkins agent,node 是执行 step 的具体服务器。

Step:步骤,step 是 jenkins pipline 最基本的操作单元,从在服务器创建目录到构建容


4.3.2.2:测试简单 pipline job 运行:

node {

stage("clone 代码"){

echo "代码 clone"

}

stage("代码构建"){

echo "代码构建"

}

stage("代码测试"){

echo "代码测试"

}

stage("代码部署"){

echo "代码部署"

}

}



5.1:代码测试工具 SonarQube:

官方网站:http://www.sonarqube.org/

SonarQube 是一个用于代码质量管理的开放平台,通过插件机制,SonarQube可以

集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如

Hudson/Jenkins 等)不同,SonarQube 并不是简单地把不同的代码检查工具结果(例

如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再

加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种

类的工程进行代码质量管理。在对其他工具的支持方面,Sonar不仅提供了对 IDE的支

持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持

续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube,此外,

SonarQube 的插件还可以对 Java以外的其他编程语言提供支持,对国际化以及报告

文档化也有良好的支持。


5.2.1:编辑配置文件:

https://www.sonarqube.org/downloads/下载地址

sonar 依赖于 java 环境,而且 java 版本必须是 1.8 版本或更高,否则 sonar 启动失败

6.7.X 版本的 sonar 需要调用 elasticsearch,而且默认需要使用普通用户启动

$ unzip sonarqube-6.7.6.zip

$ln -sv /usr/local/src/sonarqube-6.7.6 /usr/local/sonarqube

$grep "^[za-Z]" /usr/local/sonarqube/conf/sonar.properties

[root@s1 local]# grep "^[za-Z]" /usr/local/sonarqube/conf/sonar.properties

sonar.jdbc.username=sonar

sonar.jdbc.password=123456

sonar.jdbc.url=jdbc:mysql://192.168.7.106:3306/sonar?useUnicode=true&characterEncodi

ng=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.web.host=0.0.0.0

sonar.web.port=9000

5.2.2:启动 sonarqube:

# /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start

默认登录名及密码为admin


5.1.2:Mysql 数据库创建及授权:

#yum install vim gcc gcc-c++ wget autoconf net-tools lrzsz iotop lsof iotop bash-completion

curl policycoreutils openssh-server openssh-clients postfix -y

#cd mysql-5.6.42-linux-glibc2.12-x86_64

#ln -sv /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64 /usr/local/mysql

#useradd mysql -s /sbin/nologin

#chown mysql.mysql /usr/local/mysql/ -R

#/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --

basedir=/usr/local/mysql/

#cp /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64/support-files/mysql.server

/etc/init.d/mysqld

#cp my.cnf /etc/my.cnf

#chmod a+x /etc/init.d/mysqld

#/etc/init.d/mysqld start

#ln -sv /usr/local/mysql/bin/* /usr/bin/

#mkdir /var/lib/mysql

#ln -sv /data/mysql/mysql.sock /var/lib/mysql/

5.3:部署扫描器 sonar-scanner:

5.3.1:部署 sonar-scanner:

sonarqube 通过调用扫描器 sonar-scanner 进行代码质量分析,即扫描器的具体工作就

是扫描代码:

#下载地址:http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

# unzip sonar-scanner-2.6.1.zip

# ln -sv /usr/local/src/sonar-scanner-2.6.1 /usr/local/sonar-scanner

# cd /usr/local/sonar-scanner/

# grep "^[a-Z]" conf/sonar-scanner.properties

sonar.host.url=http://localhost:8800

sonar.sourceEncoding=UTF-8

sonar.jdbc.username=sonar

sonar.jdbc.password=123456

sonar.jdbc.url=jdbc:mysql://192.168.1.195:3306/sonar?useUnicode=true&character

Encoding=utf8

5.3.4:jenkins 关联到 SonarQube :

首先安装插件,在 jenkins 插件安装界面安装 Sonar 插件 SonarQubePlugin

其次配置 SonarQube server,系统管理-系统设置

5.3.5:让 jenkins 关联到 Sonarscanner

添加扫描器:

系统管理-Global Tool Configuration

5.3.6:配置扫描:

选择自己的项目(demo)-构建-execute sonarqube scanner,将配置文件的内容修改成如

下格式填写完成后点保存:

sonar.projectKey=test-demo1

sonar.projectName=test-demo1

sonar.projectVersion=1.0

sonar.sources=./

sonar.language=php

sonar.sourceEncoding=UTF-8




5.3.6:配置扫描:

选择自己的项目(demo)-构建-execute sonarqube scanner,将配置文件的内容修改成如

下格式填写完成后点保存:

sonar.projectKey=test-demo1

sonar.projectName=test-demo1

sonar.projectVersion=1.0

sonar.sources=./

sonar.language=php

sonar.sourceEncoding=UTF-8


使用脚本自动更新,需要传递参数,

#!/bin/bash

DATE=`date +%Y-%m-%d_%H-%M-%S`

GROUP_LIST=$2

function IP_list(){

  if [[ ${GROUP_LIST} == "online-group1" ]];then

    Server_IP="192.168.8.4"

    echo ${Server_IP}

  elif [[ ${GROUP_LIST} == "online-group2" ]];then

    Server_IP="192.168.8.5"

    ssh root@192.168.8.2 ""echo enable  server web_port/192.168.8.4" | socat stdio /var/lib/haproxy/haproxy.sock"

    ssh root@192.168.8.6 ""echo enable  server web_port/192.168.8.5" | socat stdio /var/lib/haproxy/haproxy.sock"

    echo ${Server_IP}

  elif [[ ${GROUP_LIST} == "online-all" ]];then

    Server_IP="192.168.8.4 192.168.8.5"

    echo ${Server_IP}

  fi

}

#function pull_code(){

#  rm -rf /home/tomcat/.jenkins/workspace/testweb

#  cd /home/tomcat/.jenkins/workspace

#  git clone git@192.168.7.202:testgroup/testweb.git

#}

function make_zip(){

  cd /var/lib/jenkins/workspace/test-demo1  && zip testweb.war.zip ./*

}

function down_node(){

  for node in ${Server_IP};do

    echo ${node}

    ssh root@192.168.8.2 ""echo disable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"

    ssh root@192.168.8.6 ""echo disable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"

    echo "${node} 关闭成功!"

  done 

}

function stop_tomcat(){

  for node in ${Server_IP};do

    ssh tomcat@${node} "/etc/init.d/tomcat stop"

    echo "${node} 关闭成功!"

  done 

}

function start_tomcat(){

  for node in ${Server_IP};do

    ssh tomcat@${node} "/etc/init.d/tomcat start"

    echo "${node} 关闭成功!"

  done 

}

function scp_codefile(){

  cd /var/lib/jenkins/workspace/test-demo1

  for node in ${Server_IP};do

    scp testweb.war.zip  tomcat@${node}:/apps/tomcat_appdir

    ssh tomcat@${node} "cd /apps/tomcat_appdir && unzip testweb.war.zip -d /apps/tomcat_webdir/testweb-${DATE} && rm -rf /data/tomcat_webdir/testweb && ln -sv /apps/tomcat_webdir/testweb-${DATE} /data/tomcat_webdir/testweb"

  done

}

function web_test(){

  #sleep 30

  for node in ${Server_IP};do

    NUM=`curl -s  -I -m 10 -o /dev/null  -w %{http_code}  http://${node}:8080/testweb/index.html`

    if [[ ${NUM} -eq 200 ]];then

      echo "${node} 测试通过,即将添加到负载"

      add_node ${node}

    else

      echo "${node} 测试失败,请检查该服务器是否成功启动tomcat"

    fi

  done

}

function add_node(){

  node=$1

    echo ${node},"----->"

    if [ ${node} == "192.168.8.100" ];then

      echo "192.168.8.100部署完毕,请进行代码测试!"

    else

      ssh root@192.168.8.2 ""echo enable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"

      ssh root@192.168.8.6 ""echo enable  server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"

    fi

}

function rollback_last_version(){

  for node in ${Server_IP};do

    NOW_VERSION=`ssh tomcat@${node} ""/bin/ls -l  -rt /data/tomcat_webdir/ | awk -F"->" '{print $2}'  | tail -n1 | awk -F"/apps/tomcat_webdir/" '{print $2}'""`

    NAME=`ssh tomcat@${node}  ""/bin/ls -l  -rt -d  /apps/tomcat_webdir/testweb* | grep -B 1 ${NOW_VERSION} | head -n1 | awk '{print $9}'""`

    ssh tomcat@${node} "rm -rf /data/tomcat_webdir/testweb && ln -sv ${NAME} /data/tomcat_webdir/testweb"

  done

}

main(){

  case $1  in

      deploy)

        IP_list;       

        #pull_code;

        make_zip;

        down_node;

        stop_tomcat;

        scp_codefile;

        start_tomcat;

        web_test;

        ;;

      rollback_last_version)

        IP_list;

        echo ${Server_IP}

        down_node;

        stop_tomcat;

        rollback_last_version;

        start_tomcat;

        web_test;

        ;;

    esac

}

main $1 $2

#需要自建两个参数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容