原创

Gitlab+Jenkins实现自动化构建(持续集成)

一、Gitlab配置

gitlab安装部署:https://www.supernb.cn/article/58.html

1、Gitlab一定要有个项目,用于发布代码


2、创建账号的 access token , 用于 Jenkins 调用 GitLabAPI


创建之后的令牌



二、Jenkins配置

安装配置文章:https://www.supernb.cn/article/60.html

1、Jenkins安装插件:

Git Parameter ( 用于参数化构建中动态获取项目分支 )
Generic Webhook Trigger ( 用于解析 Webhook 传过来的参数 )
GitLab ( 用于推送构建结果给 GitLab )

2、Jenkins设置root用户启动

部分构建会调用系统的一些命令需要用到root权限,建议用root用户启动

jenkins配置文件修改

vim /etc/sysconfig/jenkins
# 将启动用户设置为root
#JENKINS_USER="jenkins" 
JENKINS_USER="root"

jenkins启动文件修改

vim /lib/systemd/system/jenkins.service
# 将User、Group修改成root
User=root
Group=root

设置jenkins目录权限

chown -R root:root /var/lib/jenkins

重新启动Jenkins

systemctl stop jenkins
systemctl start jenkins

3、添加Gitlab凭据


  • 填写凭据信息

    4、在jenkins设置里连接Gitlab


    5、配置GItlab 密钥

    在jenkins上生成ssh密钥(ssh-keygen,后面直接回车就可以)

    [root@jenkins_test ~]# ssh-keygen

    查看root的ssh公钥和jenkins的公钥

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

    添加上面查看的密钥,两个密钥分两次添加哈



    6、创建Jenkins项目

    在Jenkin首页点击“新建Item”>输入名称>选择“Freestyle project”



    7、配置项目

    如果提示没有权限,检查一下gitlab添加密钥是否正确


    8、获取代码测试

    可以看到获取代码成功了,可以点进去查看详细信息


    9、通过执行脚本发布代码

    本次测试的是发布一个静态文件,不需要构建过程(脚本内容在后面附上)


    ①/data/script/rsyncCode.sh是发布用的脚本,分发到服务器

    ②test 是jenkins项目名,也是项目目录(用于脚本找到项目路径)

    ③192.168.30.131 是目标服务器

    ④ 22 是目标服务器的ssh端口(jenkins和目标服务器需要做免密哈)

    ⑤/data/www/wwwroot/test  目标服务器代码存放目录

    发布脚本附上(由于富文本编辑器高亮问题,可能部分脚本看不清,复制出来看):

    [root@jenkins_test ~]# cat /data/script/rsyncCode.sh
    #!/bin/bash
    set -x
    
    SRC_FILE="/var/lib/jenkins/workspace/"$1"/"  #$1 为 Jenkins任务名称
    HOSTS=`echo $2|sed 's/,/ /g'` #项目主机,多个IP使用英文空格隔开,例: 1.1.1.1 或者 1.1.1.1,2.2.2.2
    DEPLOY_DST_DIR=$4   # 目标目录
    
    # 指定密钥文件
    ssh_key=/root/.ssh/id_rsa
    ssh_conf=/etc/ssh/ssh_config
    ssh_port=$3
    
    
    # 变量检查
    
    if [ -z ${SRC_FILE} ]
    then
       echo "The Jenkins job name must be specified!"
       exit 1
    fi
    
    if [ -z ${HOSTS} ]
    then
      echo "The server address must be specified!"
      exit 1
    fi
    
    if [ -z ${DEPLOY_DST_DIR} ]
    then
      echo "The destination directory address must be specified!"
      exit 1
    fi
    
    # 代码同步
    for HOST in ${HOSTS}
    do
        echo “Start updata ${HOST}#rsync --progress -raz --no-o --no-g --rsh="ssh -p ${ssh_port} -i $ssh_key -F $ssh_conf" --exclude={'.git','.env','.gitignore','.idea','showdoc.db.php'}  ${SRC_FILE}  ${HOST}:${DEPLOY_DST_DIR}
        #if [ $? -ne 0 ];then exit 1; fi    
    
        # 20200818 :Add retry code
        for sync_count in $(seq 3)
        do
    
            #rsync --timeout=10 --progress -raz --no-o --no-g --rsh="ssh -p ${ssh_port} -i $ssh_key -F $ssh_conf" --exclude={'.git','.env','.gitignore','.idea','showdoc.db.php'}  ${SRC_FILE}  ${HOST}:${DEPLOY_DST_DIR}
            rsync --timeout=10 --progress -raz --no-o --no-g --rsh="ssh -p ${ssh_port} -i $ssh_key -F $ssh_conf" --exclude={'.git','.env','.gitignore','.idea','showdoc.db.php','.DS_Store'}  ${SRC_FILE}  ${HOST}:${DEPLOY_DST_DIR}
    
            if [ $? -eq 0 ];then
                break;
            else
                syncStatus=${syncStatus}1
            fi
    
            if [[ "${syncStatus}" -eq "111" ]];then
                echo "run here"
                exit 1
            fi
        done
    
    
        echo "Sync ${HOST} complete"
    
        echo "modify privileges for web/files"
        #ssh -p ${ssh_port} -i $ssh_key -F $ssh_conf ${HOST} "chown -R www.www ${DEPLOY_DST_DIR}";date
        #if [ $? -ne 0 ];then exit 1; fi
    
        # 20200818 :Add retry code
        for sync_count in $(seq 3)
        do
    
            ssh -p ${ssh_port} -i $ssh_key -F $ssh_conf ${HOST} "chown -R www.www ${DEPLOY_DST_DIR}";date
    
            if [ $? -eq 0 ];then
                break;
            else
                syncStatus=${syncStatus}1
            fi
    
            if [[ "${syncStatus}" -eq "111" ]];then
                echo "run here"
                exit 1
            fi
        done
    
        echo "Deploy finished."
    done

    三、自动发布代码

    当gitlab有代码更新是自动触发jenkins发布代码

    1、jenkins

    设置“构建触发器”,将webhook URL和Secret tocken复制出来,gitlab里会用到



    2、gitlab

    设置webhook允许地址连接



    3、可以在gitlab的项目上修改代码测试一下啦



    正文到此结束
    评论

    登录后才能发表评论 登录/注册

    0评论
    • 还没有评论,快来抢沙发吧!