Bootstrap

Jenkins+GitLab自动化部署

一、安装Jenkins

由于内网环境安装Git插件,缺少很多依赖,所以把外网环境下Jenkins安装好插件的plugins复制到内网。

  • 上传插件包

    scp /Users/adam/Downloads/soft/docker_soft/soft/plugins.zip [email protected]:/root
    
  • 创建用户(本文用root)

    sudo groupadd jenkins
    # 创建jenkins用户,创建用户主目录,指定用户默认shell
    sudo useradd -g jenkins -d /home/jenkins -m -s /bin/bash jenkins 
    # 给jenkins用户使用sudo的权限
    sudo echo "jenkins ALL=(ALL:ALL) ALL" >> /etc/sudoers 
    # 给jenkins用户指定密码
    sudo passwd jenkins 
    
  • 安装配置

    # 本地到处镜像
    docker save jenkins > /Users/adam/Downloads/soft/docker_soft/soft/jenkins.tar.gz
    # 上传Jenkins镜像
    scp /Users/adam/Downloads/soft/docker_soft/soft/jenkins.tar.gz [email protected]:/root
    # 登录服务器
    ssh [email protected]
    # 服务器导入镜像
    docker load < /root/jenkins.tar.gz
    # 使用root用户启动镜像
    docker run -d -p 8080:8080 --name jenkins --restart always --privileged=true  -v /root/jenkins/config:/var/jenkins_home -u root jenkins/jenkins
    
  • 替换插件包

    # 插件:Gitlab Plugin 
    scp /Users/adam/Downloads/soft/docker_soft/Jenkins/plugins.zip [email protected]:jenkins/config
    unzip plugins.zip
    # 必须重启容器
    
  • 日志

    docker logs -f jenkins
    
  • 访问

    http://192.168.x.x:8080
    
  • 配置

    • 新建一个Freestyle项目

      image-20201103141916793

    • 丢弃旧的构建,保持7天

      image-20201103142512367

    • 选择Shell构建

      # 查看当前执行shell的用户
      whoami
      

      image-20201103143018649

    • 立即构建(蓝色:正常;红色:异常)

      image-20201103143505513

    • 点击构建结果,查看控制台

      image-20201103143902271

二、Jenkins配置证书凭据

GitLab私有项目不能使用SSH凭据,只能使用账密凭据

image-20201105102325762

image-20201104140257897

1.创建账密凭据(GitLab私有项目)

image-20201106154625343

2.创建SSH凭据(GitLab公开项目)
  • 生成公私钥对

    # 生成密钥对
    ssh-keygen -t rsa -f ~/.ssh/jenkins_rsa
    # 私钥 - 添加到Jenkins
    cat ~/.ssh/jenkins_rsa
    # 公钥 - 添加到GitLab
    cat ~/.ssh/jenkins_rsa.pub
    
  • Jenkins添加SSH私钥

    image-20201105104410698

  • GitLab添加SSH公钥

    image-20201103152121469

    image-20201105104828529

三、配置Jenkins源码

  • 选中工程 - 配置

    image-20201104171719806

  • 源码管理

    image-20201104172050007

  • 立即构建

    image-20201104172259522

  • 查看构建地址

    cd /var/jenkins_home/workspace/first-test
    

四、构建

1.Maven构建

//TODO,外网很方便

2.脚本构建

1.由于内网环境,使用pom.xml构建需要maven插件,遂使用脚本构建。

2.在Jenkins服务器上编写同步脚本,将构建结果复制到Web服务器。

1.与Web服务器进行免密登录
1.Jenkins部署在CentOS中
# ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,拥有远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利
# 第一次需要密码登录
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
  • 异常:

    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

  • 解决:

    # 删除之前的认证再执行
    vi ~/.ssh/known_hosts
    
2.Jenkins部署在Docker中

如果Jenkins部署在docker中,则需要在docker容器内配置免密登录

# 进入容器
docker exec -it 0 /bin/bash
# 如果没有,则生成公私钥对
cd /root/.ssh
# 生成密钥对
ssh-keygen -t rsa
# 私钥 - 添加到Jenkins
cat ~/.ssh/id_rsa
# 公钥 - 添加到GitLab
cat ~/.ssh/id_rsa.pub
# 配置免密登录
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2.Jenkins服务器上编写同步脚本

vim deploy.sh

#!/bin/bash
# 打印执行过程
set -ex
echo "当前用户:" && whoami
# Jenkins环境
jenkins_pro="cbei_isp"
jenkins_workspace="/var/jenkins_home"

# Web服务器宿主机
web_user="adam"
web_ip="192.168.x.x"

# 宿主机目录,只有宿主机/home/adam权限
# 将docker中/opt/apache-tomcat-8.0.52/webapps挂载到宿主机的/home/adam/tomcat/webapps/
tomcat_webapps="/home/adam/tomcat/webapps"
tomcat_logs="/home/adam/tomcat/logs"

echo "删除旧WAR和日志开始"
ssh $web_user@$web_ip "rm -rf $tomcat_webapps/*.war"
ssh $web_user@$web_ip "rm -rf $tomcat_logs/*"
echo "删除旧WAR和日志结束"
sleep 3

echo "复制WAR到Web服务器,并重命名"
scp $jenkins_workspace/workspace/$jenkins_pro/target/demo-0.0.1-SNAPSHOT.war $web_user@$web_ip:$tomcat_webapps/demo.war

echo "结束"
  • 授权

    chmod 777 deploy.sh
    # ./deploy.sh
    
  • 调用脚本进行构建

    image-20201104173938192

  • 执行脚本当前位置可以在shell中输入pwd查看日志,默认在 j e n k i n s h o m e / w o r k s p a c e / jenkins_home/workspace/ jenkinshome/workspace/pro

    image-20201106144015570

五、配置构建触发器

1.Web hook方式
1.Jenkins配置触发器

推荐使用Gitlab插件方式。(内网环境可以直接将外网环境下plugins包复制替换,并重启Jks。)

image-20201106161850428

安装完插件以后才会有该选项。

image-20201106165218147

允许分支触发该job。

image-20201106165456681

2.GitLab配置触发器认证

image-20201106164509137

将Jenkins配置的请求地址和Token填写到GitLab。

image-20201106165026584

添加成功

image-20201106171803969

由于安全问题,GitLab默认不允许请求本地网络,需要管理员权限设置为允许。

image-20201106165636754

管理员账户才有Admin Area

image-20201110102453347

设置允许本地网络进行web hooks和services。

image-20201110103318815

2.轮询方式

公司网络处于安全问题,Jenkins可以访问GitLab,但是GitLab无法访问Jenkins,所以采用轮询模式触发。设定轮询时间,定时检查GitLab是否有更新,更新则触发构建。

image-20201110105822529

六、GitLab配置Jenkins返回状态

1.GitLab中生成Access Token

image-20201106172236843

2.Jenkins配置GitLab生成的Token

image-20201106172500714

配置全局GitLab API token。

image-20201106172646609

将GitLab中生成的Access Token填入Jenkins中。

image-20201106172907388

七、构建后操作

image-20201106173224906

;