Jenkins&Gitlab持续集成、交付、布署

1、术语介绍

1.1、集成、交付、布署 <->CI、CD、CD全称

持续集成(Continuous Integration)
持续交付(Continuous Delivery) 
持续布署(Continuous Deployment)

1.2、DevOps介绍

让开发人员可以持续集成,运维人员可以持续交付和持续部署.让整个开发过程自动部署,上线。

Development -> 开发
Operation -> 运维

1.3、DevOps流程图

2、git

2.1、git环境准备

2.1.1、Linux

yum install git -y

2.1.2、MacOS

brew install git

2.1.3、Ubuntu/Debian

apt install git -y

2.1.4、Windows

https://git-scm.com/downloads

2.2、git基本操作

2.2.1、创建演示目录

mkdir ygbhTest

2.2.2、初始化git

git init

2.2.3、编写测试的代码

cat > index.html << 'EOF'
test 50%
EOF

2.2.4、查看版本的状态

git status

2.2.5、将编写好的代码加入版本控制

git add index.html

2.2.6、配置git用户信息

git config --global user.email "test@qq.com"
git config --global user.name "Bort"
git config --global color.ui true
git config --global --list

2.2.7、提交至本地仓库

git commit -m "index.html 50%"

2.2.8、继续更新编写的代码

cat >> index.html << 'EOF'
test 100%
EOF

2.2.9、将最新的代码提交至仓库

按如下流程操作:
2.2.5、将编写好的代码加入版本控制

2.2.7、提交至本地仓库
git commit -m "index.html 100%"

2.2.10、查询版本id

# 支持查看所有的提交记录
git reflog
847a3c5 HEAD@{0}: commit: index.html 100%
24a707f HEAD@{1}: commit (initial): index.html 50%

# 只支持当前版本以前的记录
git log

2.2.11、回滚到指定的版本

git reset --hard 24a707f7

2.3、Git四种空间模式

2.3.1、空间模式流程图【命令总结】

图不漂亮,不要见怪。

 

工作区:即是代码的实际存放的位置。分为:已经版本控制的文件和新增或修改文件
暂存区:使用git add增加,称为暂存区
本地仓库:在本地使用git commit
远程仓库:使用git pull推至github、gitee、gitlab等服务上存放的

2.3.2、git空间切换命令总结

git init                # 初始化本地仓库目录
git config --global     # 邮箱,用户名,颜色
git add                 # 提交数据到缓冲区(暂存区) git add .(所有文件)或 git add 文件
git commit              # 把暂存区的数据提交到本地仓库 git commit -m"标记/说明"
git status              # 显示工作空间的状态
git reset               # 回滚
git reset HEAD          # 暂存区-->工作空间(被修改的状态)
git reset --soft 版本号  # 把指定的版本本地仓库数据内容下载到暂存区
git reset --mix 版本号   # 把本地仓库-->工作空间(被修改的状态)
git reset --hard 版本号  # 把本地仓库指定版本信息数据下载到工作目录中
git checkout            # 文件下载到工作空间并可以使用git checkout .或git checkout 文件
git show # 查看当前的版本

2.4、git分支的管理

2.4.1、分支整体的流程图

2.4.2、分支命令的总结

git branch           # 查看分支
git branch name      # 创建分支
git branch -d name   # 删除分支
git checkout name    # 切换分支
git merge name       # 合并分支
git checkout -b name # 切换分支并且创建分支
git push origin [master|branch_name] # 远程推送指定的分支
git pull origin [master|branch_name] # 远程拉取指定的分支

2.5、远程仓库Gitee推送和下载

2.5.1、远程创建仓库

2.5.2、Git 全局设置

git config --global user.name "xxxxx"
git config --global user.email "xxxx@qq.com"

2.5.3、创建公钥和密钥并且复到到gitee

# 创建密钥公钥
ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"  

# 复制公钥到gitee上
cat /root/.ssh/id_ed25519.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILXvYeBS5kjB+4rP34QmC7PVGEdJ4fEhIAJEhVe/6H/u 277667028@qq.com

2.5.4、创建git仓库,上传至远程仓库

mkdir test-submission
cd test-submission
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:xxx/test-submission.git
git push -u origin "master"

2.5.5、已有git仓库,上传至远程仓库

cd existing_git_repo
git remote add origin git@gitee.com:xxx/test-submission.git
git push -u origin "master"

2.5.6、查看是否推送完成

2.6、git标签

2.6.1、当前版本打标签

git tag -a 'v2.0' -m "开发完成的版本"

2.6.2、指定版本打标签

git tag -a "v1.0" 5e14c27 -m "这个基础功能v1.0"

2.6.3、查看标签

git tag

2.6.4、标签推送至远程仓库

# 推送所有的标签 
git push origin --tags

# 推送指定的标签
git push origin "v1.0"

2.7、gitignore

# 在本地仓库中创建一个gitignore文件,在文件里面写忽略的文件名或模糊匹配
例如:
cat gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/

3、Gitlab

3.1、安装

3.1.1、安装依赖包

yum install curl wget openssh-server postfix -y

3.1.2、下载gitlab安装包

# 地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.9.2-ce.0.el7.x86_64.rpm

3.1.3、安装gitlab

yum localinstall gitlab-ce-15.9.2-ce.0.el7.x86_64.rpm -y

3.1.4、首次需知-配置文件位置

/etc/gitlab/gitlab.rb

3.1.5、首次需知-重新加载服务

gitlab-ctl reconfigure

3.1.6、首次需知-配置访问的URL地址

# 修改为自己的域名
[root@gitlab ~]# vi  /etc/gitlab/gitlab.rb
external_url 'http://gitlab.test.com'

3.2、配置Gitlab发送的邮箱

[root@gitlab ~]# vi  /etc/gitlab/gitlab.rb
# 设置发送时,显示的内容 gitlab_rails[
'gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = '????@126.com' gitlab_rails['gitlab_email_display_name'] = 'gitlab-email' # 配置邮件信息,这里使用163邮箱 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.126.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "?????@126.com" gitlab_rails['smtp_password'] = "?????" gitlab_rails['smtp_domain'] = "126.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['smtp_pool'] = true

3.3、关闭不常用的组件

3.3.1、优化如下组件

# 优化如下:
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
prometheus['enable'] = false
prometheus['monitor_kubernetes'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false
prometheus_monitoring['enable'] = false
grafana['enable'] = false

3.3.2、启动加载gitlab服务

[root@gitlab ~]# gitlab-ctl reconfigure

3.3.3、记得下首次登陆的帐号和密码

Notes:
Default admin account has been configured with following details:
Username: root
Password: You didn't opt-in to print initial root password to STDOUT.
Password stored to /etc/gitlab/initial_root_password. This file will be cleaned up in first reconfigure run after 24 hours.


[root@gitlab ~]# cat /etc/gitlab/initial_root_password 

Password: 1QDCoostpH1CpGp+Z9ZkPCMncCGfcalbgCtUTC5rssY=

3.4、Gitlab服务管理

3.4.1、重新加载服务

gitlab-cli reconfigure

3.4.2、查询状态服务

gitlab-cli status

3.4.3、启动服务

gitlab-cli start

3.4.4、停止服务

gitlab-cli stop

3.5、验证配置的邮箱是否正常使用

3.5.1、验证的方法

# 测试邮箱是否可以正常发送
[root@gitlab ~]# gitlab-rails console

irb(main):007:0> Notify.test_email('277667028@qq.com','gitlab-test','测试').deliver_now

3.5.2、验证成功

3.6、Gitlab网页版的使用

3.6.1、客户端配置hosts

$ vim /c/Windows/System32/drivers/etc/hosts
192.168.10.20 test.com

3.6.2、网页版登陆成功

3.6.3、创建群组

 

3.6.4、创建项目

 

3.6.5、创建用户测试

# 开发组
dev_test1  角色:Developer  # 只能修改子分支,不能提交主分支main
dev_test2  角色:Maintainer # 可以提交至主分支main

# 运维组
ops_test1

3.7、Gitlab备份与恢复

3.7.1、Gitlab备份前的配置

[root@gitlab ~]# vi /etc/gitlab/gitlab.rb 
# 备份的配置
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_gitaly_backup_path'] = "/opt/gitlab/embedded/bin/gitaly-backup"
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_keep_time'] = 604800

# 配置好,重新加载服务
gitlab-ctl reconfigure

3.7.2、Gitlab备份

一、程序的备份
# 12.2+ 备份方法
gitlab-backup create

# 12.1- 备份方法
gitlab-rake gitlab:backup:create

# 备份完成的目录
[root@gitlab ~]# ll /var/opt/gitlab/backups/
total 440
-rw-r--r-- 1 git git 450560 Mar  7 15:52 1678175541_2023_03_07_15.9.2_gitlab_backup.tar

二、配置和帐号信息的备份
# 手动备份如下:两个文件
gitlab.rb            # 配置文件
gitlab-secrets.json  # 帐号密码文件

# 建议整个配置文件都打包
[root@gitlab ~]# tar cvf gitlab.2023.3.7.info.tar.gz /etc/gitlab

3.7.3、Gitlab恢复

# 停止相关的服务
gitlab-ctl stop puma
gitlab-ctl stop sidekiq

# GitLab 12.2+ 恢复方法
gitlab-backup restore BACKUP=1678175541_2023_03_07_15.9.2

# GitLab 12.1- 恢复方法
gitlab-rake gitlab:backup:restore  BACKUP=11493107454_2018_04_25_10.6.4-ce

# 启动相关的服务
gitlab-ctl start puma
gitlab-ctl start sidekiq
gitlab-ctl reconfigure
gitlab-ctl restart

3.8、升级与迁移注意事项

3.8.1、升级的注意事项

升级方式:如果是yum安装的话,需要一个版本一个版本更新到最新的。
例如:12.0.Z  -> 13.0.a -> 13.0.Z -> 14.0.a -> 15.0.a

3.8.2、迁移的注意事项

迁移方式:如果是yum安装的话,需要一个版本一个版本更新到最新的。
例如:12.0.Z  -> 13.0.a -> 13.0.Z -> 14.0.a -> 15.0.a

升级到最新的之后,再备份,迁移

3.9、gitlab修改(重置)root用户密码

[root@gitlab ~]# gitlab-rails console -e production
# 查询用户
user = User.where(id: 1).first
# user = User.find_by(email: ‘admin@local.host‘)

user.password = 'aiai1234'
user.password_confirmation = 'aiai1234'
user.save!

 

4、Jenkins

4.1、安装

4.1.1、安装方式

1、rpm包   yum安装 【演示使用该方法】
2、war包   tomcat上运行
3、jar包   java -jar xxx.jar

4.1.2、安装JDK

# 查询jdk版本
yum --showduplicates list java*

# 安装对应的jdk版本,此版本需要安装jdk11
yum install java-11-openjdk-devel -y

4.1.3、下载jenkins

# 清华大学,yum源查询地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/

# 下载jenkins软件包
wget  --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.375.3-1.1.noarch.rpm

4.1.4、开启jenkins服务

# 如果系统安装多个jdk版的话,需要选择对应的jdk
alternatives --config java

# 开启jenkins服务
systemctl enable jenkins
systemctl start jenkins

# 检查开启状态
[root@jenkins ~]# netstat -tunlp | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      4058/java

4.2、Jenkins目录介绍

[root@jenkins ~]# rpm -ql jenkins
/etc/init.d/jenkins      # jenkins启动和停止脚本
/etc/logrotate.d/jenkins # jenkins日志切割配置文件
/etc/sysconfig/jenkins   # jenkins配置文件
/usr/bin/jenkins         # jenkins启动脚本
/usr/lib/systemd/system/jenkins.service # 服务管理
/usr/sbin/rcjenkins                     # /etc/init.d/jenkins 的软链接          
/usr/share/java/jenkins.war
/usr/share/jenkins
/usr/share/jenkins/migrate # 迁移目录
/var/cache/jenkins  # 缓存目录
/var/lib/jenkins    # 主要目录
/var/log/jenkins    # 日志目录

4.3、浏览器访问jenkins

4.3.1、配置hosts

192.168.10.21 jenkins.test.com

4.3.2、访问jenkins

http://jenkins.test.com:8080/

 

# 登陆密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
cec8b4bc0fdb4002912b57a1106c6e78

4.3.3、跳过插件安装,直接关闭对话框

因为国外网站下载速度慢,后面配置国内源,下载稳定些

4.4、插件安装

4.4.1、插件安装方式

第一种:到jenkins网页版手机点击一个一个下载。
第二种:下载离线插件安装,插件位置:/var/lib/jenkins/plugins/
第三种:到安装好插件的服务器上拷贝插件整个目录,替换到新的jenkins插件目录上

4.4.2、安装显示中文的插件

安装完成,需要重启jenkins服务才生效

4.5、jenkins第一个shell构建任务

4.5.1、创建任务

4.5.2、增加选项参数

4.5.3、构建步骤选择-执行shell

#!/bin/bash
# author: suk
if [ $env =="master" ];then
   echo "生产环境"
elif [ $env =="dev" ];then
   echo "开发环境"
else
   echo "测试环境"
fi

4.5.4、构建项目

4.5.5、构建结果

4.5.6、配置构建限额

5、Jenkins与Gitlab集成

5.1、Gitlab准备一个仓库项目

5.1.1、本地项目

cat index.html
<h1>项目1<h1>
<p>完美的项目</p>

5.1.2、演示的项目,关闭验证master上传的权限

 

5.1.3、给仓库配置访问的公钥

ssh-keygen
cat /c/Users/Administrator/.ssh/id_rsa.pub

 

5.1.4、本地项目上传至gitlab

cd existing_repo
git remote add origin git@gitlab.test.com:ops/conf-center.git
git branch -M main
git push -uf origin main


# 查看远程origin地址
git remote -v

# 删除远程origin
git remote remove  origin

 5.1.5、上传完成

5.2、配置jenkins从gitlab下载代码

5.2.1、jenkins安装所需要的插件

Git         # 集成Git
GitLab      # 允许Gitlab触发jenkins构建并在Gitlab中显示
Credentials # 存储认证的凭据
GitLab Authentication   # 身份验证插件
Generic Webhook Trigger # 自动触发jenkins构建项目

5.2.2、在Jenkins服务器上创建ssh公钥和密钥

ssh-keygen
# 将公钥复制到Gitlab仓库的公钥管理
# 将密钥复制到jenkins凭证上

5.2.3、公钥给Gitlab仓库

[root@jenkins ~]# cat .ssh/id_rsa.pub

 

5.2.4、密钥给Jenkins

[root@jenkins ~]# cat .ssh/id_rsa

5.2.5、配置hosts

192.168.10.20 gitlab.test.com

 

5.2.6、jenkins服务器需安装git

yum install git -y

 

5.2.7、关闭jenkins主机ssh校验

系统管理 -> 全局安全配置 ->Git Host Key Verification Configuration -> No verification

 

5.2.8、Jenkins配置gitlab下载相关

 

5.2.9、保存构建

5.2.9、查看服务器下载代码位置

[root@jenkins ~]# cat /var/lib/jenkins/workspace/gitlab_jenkins/index.html 
<h1>项目1<h1>

5.3、jenkins与Gitlab集成自动发布代码

5.3.1、准备主机

nginx_lsb # 192.168.10.23
nginx01   # 192.168.10.23
nginx02   # 192.168.10.23

5.3.2、nginx_lsb 配置

[root@nginx_lsb ~]# cat /usr/local/nginx-1.12.2/conf.d/web_lsb.conf 
upstream html {
  server 192.168.10.24:80;
  server 192.168.10.25:80;
}

server {
  listen 80;
  server_name html.test.com;
  location / {
    proxy_pass http://html;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

5.3.3、jenkins主机分发公钥用于免钥登陆

nginx01 ssh-copy-id root@192.168.10.24
nginx02 ssh-copy-id root@192.168.10.25

5.3.4、需要jenkins用户给布署端设置免密登陆

# 修改支持bash
[root@jenkins ~]# vi /etc/passwd
jenkins:x:998:996:Jenkins Automation Server:/var/lib/jenkins:/bin/bash

[root@jenkins ~]# su - jenkins
ssh-keygen
ssh-copy-id root@192.168.10.24
ssh-copy-id root@192.168.10.25

5.3.5、编写一键布署脚本

[root@jenkins ~]# cat /opt/script/test_deploy.sh 
#!/bin/bash
# author:suk
# 2023-3-8

#pro_dir=$WORKSPACE/$JOB_NAME

pro_dir=/var/lib/jenkins/workspace/gitlab_jenkins

pkg_name=gitlab_jenkins_`date +%F-%H-%M`

upload_dir=/opt

nginx_html=/usr/local/nginx-1.12.2/html

# 打包文件
make_pkg(){
  cd ${pro_dir} && tar -Pczf ${pkg_name}.tar.gz . --exclude '*.git' --exclude '*.tar.gz'
}

scp_pkg(){
  for ip in 24 25
  do
     scp ${pro_dir}/${pkg_name}.tar.gz root@192.168.10.${ip}:/opt/
  done
}

deploy_pkg(){
  for ip in 24 25
  do
    ssh root@192.168.10.${ip} "mkdir ${upload_dir}/${pkg_name} &&\
cd ${upload_dir}/${pkg_name} &&\
tar -xf ../${pkg_name}.tar.gz  .&&\
rm -rf ${nginx_html} &&\
ln -s ${upload_dir}/${pkg_name} ${nginx_html}"
  done
}

main(){

# 打包
make_pkg

# 发送安装包
scp_pkg

# 布署安装包
deploy_pkg
}
main

 

5.3.6、配置到jenkins运行脚本

 

5.3.7、构建结果

5.3.8、访问SLB测试

[root@jenkins ~]# curl 192.168.10.23 
<h1>项目1<h1>
<p>完美的项目</p>[

5.3.9、修改代码,将仓库的代码重新拉取,jenkins重新构建,重新访问SLB服务看看有没有更新

5.4、jenkins与Gitlab持续集成、发布

5.4.1、jenkins开启Hook链接

# 记录下链接地址:http://jenkins.test.com:8080/project/gitlab_jenkins

 

 

5.4.2、jenkins生成密钥

# 点击高级,创建密钥,记录下密钥:7489b04b84a00dad61af66ef647aee61

 

 

5.4.3、jenkins配置完成-点击保存

5.4.4、gitlab仓库配置hook URL

 

5.4.5、配置gitlab的hosts配置文件

192.168.10.21 jenkins.test.com

5.4.6、配置Gitlab允许向哪台机器发送WebHook

5.4.7、测试推送是否成功

5.4.8、查看jenkins是否构建成功

 

5.5、Jenkins gitlab tags选择发布

5.5.1、jenkins git 插件安装

Git Parameter

 

5.5.2、jenkins可选择git分支或标签的配置

 

 

5.5.3、给项目打标签

# 原来版本打标签 1.0
git tag -a 'v1.0_release' -m '1.0'
git push origin main --tags

# 增加一个test.html,打标签 2.0
git tag -a 'v2.0_release' -m 'v2.0'
git push origin dev --tags

5.5.4、查看构建的选择

5.5.5、把打包名字增加标签名

[root@jenkins script]# cat tags_deploy.sh 
#!/bin/bash
# author:suk
# 2023-3-8

#pro_dir=$WORKSPACE/$JOB_NAME

pro_dir=/var/lib/jenkins/workspace/gitlab_jenkins

pkg_name=gitlab_jenkins_${tag}_`date +%F-%H-%M`

upload_dir=/opt

nginx_html=/usr/local/nginx-1.12.2/html

# 打包文件
make_pkg(){
  cd ${pro_dir} && tar -Pczf ${pkg_name}.tar.gz . --exclude '*.git' --exclude '*.tar.gz'
}

scp_pkg(){
  for ip in 24 25
  do
     scp ${pro_dir}/${pkg_name}.tar.gz root@192.168.10.${ip}:/opt/
  done
}

deploy_pkg(){
  for ip in 24 25
  do
    ssh root@192.168.10.${ip} "mkdir ${upload_dir}/${pkg_name} &&\
cd ${upload_dir}/${pkg_name} &&\
tar -xf ../${pkg_name}.tar.gz  .&&\
rm -rf ${nginx_html} &&\
ln -s ${upload_dir}/${pkg_name} ${nginx_html}"
  done
}

main(){

# 打包
make_pkg

# 发送安装包
scp_pkg


# 布署安装包
deploy_pkg
}

main
tag_deplay.sh

5.5.6、构建结果

[root@jenkins script]# ll /var/lib/jenkins/workspace/gitlab_jenkins
total 3
gitlab_jenkins_v2.0_release_2023-03-10-12-06.tar.gz
-rw-r--r-- 1 jenkins jenkins 167 Mar 10 10:38 index.html
-rw-r--r-- 1 jenkins jenkins   5 Mar 10 11:52 test.html

 

posted @ 2023-03-10 12:09  小粉优化大师  阅读(224)  评论(0编辑  收藏  举报