zoukankan      html  css  js  c++  java
  • 升级Gogs版本

    今天早上收到阿里云发的报警短信,大致内容如下:

    前提分析:
    公司代码代码仓库使用是Gogs搭建的,版本是0.11.34,二进制方式安装的,连接的是其他主机上的MySQL数据库,因此被检测到有这个漏洞

    处理方式:

    1. 先登录Gogs官网,查看Gogs的最新版本,如下图所示:
      地址:https://gogs.io/docs/installation/install_from_binary

    同时看到官方提供的有这个信息:如何通过二进制升级?

    但是不要被这个信息骗了,升级Gogs版本不能采用这种方式。

    注意到官方页面左侧导航有从二进制升级,这个是具体的升级方式,可以参考这个进行操作:
    地址:https://gogs.io/docs/upgrade/upgrade_from_binary

    1. 接下来按照官方文档提供的升级方式升级就行了
      (1) 先停止主机上的Gogs应用程序进程,直接kill就行了
    ps -ef | grep gogs # 查看进程pid
    lsof -p pid # 查看进程具体路径, 默认位置在 git 用户下的家目录
    kill -9 pid # 杀死进程
    
    # 这里写的有一个gogs.sh脚本,停止进程的话执行这个脚本也行
    # gogs.sh
    #!/bin/bash
    
    function starT(){
            nohup /home/git/gogs/gogs web &
    }
    
    function stoP(){
            kill -9 `lsof -i:3000 |awk 'NR==2{print $2}'`
    }
    
    case $1 in
    'start')
        starT;
    ;;
    'stop')
        stoP;
    ;;
    'restart')
        stoP;
        starT;
    ;;
    *)
        echo '请输入有效的命令(start|stop|restart)'
    ;;
    esac
    

    (2) 原有程序目录重命名,下载最新的二进制文件等

    # # 默认位置在 git 用户下的家目录
    $ sudo su - git
    $ cd ~
    $ pwd
    /home/git
    $ ls
    gogs gogs-repositories
    
    # gogs 目录是程序目录
    # gogs-repositories 存放仓库文件的目录,在配置文件中指定的
    
    # 将当前目录移动到另一个临时的位置,但不是删除!
    $ mv gogs gogs_old
    载并解压新的二进制:
    
    # 请根据系统和类型获取相应的二进制版本
    $ wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz
    $ tar -zxvf gogs_0.12.3_linux_amd64.tar.gz
    $ ls
    gogs gogs_old  gogs-repositories gogs_0.12.3_linux_amd64.tar.gz
    
    # 复制 custom、data 和 log 目录到新解压的目录中:
    $ cp -R gogs_old/custom gogs
    $ cp -R gogs_old/data gogs
    $ cp -R gogs_old/log gogs
    
    # 最后,运行并打开浏览器进行测试:
    
    $ cd gogs
    $ ./gogs web
    
    
    1. 升级中出现的问题
      (1) 启动的时候报错:"./gogs: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./gogs)"
      分析:当前系统是CentOS release 6.8 (Final),系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的
      查看当前系统支持的glibc版本:
    # strings /lib64/libc.so.6 |grep GLIBC_
    GLIBC_2.2.5
    GLIBC_2.2.6
    GLIBC_2.3
    GLIBC_2.3.2
    GLIBC_2.3.3
    GLIBC_2.3.4
    GLIBC_2.4
    GLIBC_2.5
    GLIBC_2.6
    GLIBC_2.7
    GLIBC_2.8
    GLIBC_2.9
    GLIBC_2.10
    GLIBC_PRIVATE
    

    当前最高版本是GLIBC_2.10,需要升级到GLIBC_2.14才行。

    使用命令:yum update glibc会报错,提示当前使用的yum仓库不可用,查看发现得知使用的是官方的yum仓库,这里更换成使用腾讯云的yum仓库

    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos6_base.repo # 适用于6.x系统的
    

    然后使用命令:yum update glibc进行更新,不过才更新到GLIBC_2.12版本,还不是GLIBC_2.14版本。

    采用源码编译方式更新危险性太大,幸好找到了rpm更新包:
    地址:https://files.cnblogs.com/files/sanduzxcvbnm/glibc-2.14.1-rpm-all.zip

    rpm -Uvh glibc-2.14.1-6.x86_64.rpm glibc-common-2.14.1-6.x86_64.rpm glibc-headers-2.14.1-6.x86_64.rpm glibc-devel-2.14.1-6.x86_64.rpm nscd-2.14.1-6.x86_64.rpm glibc-static-2.14.1-6.x86_64.rpm glibc-utils-2.14.1-6.x86_64.rpm
    

    再次查看发现已经顺利升级成功

    t# strings /lib64/libc.so.6 |grep GLIBC_
    GLIBC_2.2.5
    GLIBC_2.2.6
    GLIBC_2.3
    GLIBC_2.3.2
    GLIBC_2.3.3
    GLIBC_2.3.4
    GLIBC_2.4
    GLIBC_2.5
    GLIBC_2.6
    GLIBC_2.7
    GLIBC_2.8
    GLIBC_2.9
    GLIBC_2.10
    GLIBC_2.11
    GLIBC_2.12
    GLIBC_2.13
    GLIBC_2.14
    GLIBC_PRIVATE
    

    (2) 再次启动后报这个错误:[TRACE] Log Mode: File
    看这个不知道啥原因,不过通过查看gogs.log文件可以知道:

    tail -n 30 /home/git/gogs/log/gogs.log # 日志文件路径
    # 最新的日志有这么一句话
    [FATAL] [gogs.io/gogs/internal/db/repo.go:121 NewRepoContext()] Gogs requires Git version greater or equal to 1.8.3
    

    通过查看本机使用的git版本,发现是1.7.1的,看来还需要升级git版本

    # git --version
    git version 1.7.1
    

    但是使用命令:yum update git进行升级,最新软件版本还是1.7.1,看来只能通过其他方式进行升级了。

    这里不采用git源码的方式进行升级,而是通过下载其他的git 仓库源进行升级

    yum -y install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
    yum install git # 这一步安装比较慢
    

    升级成功后再次查看版本,版本大于1.8.3,符合要求了

    t# git --version
    git version 2.22.0
    

    (3) 注意:若是使用root用户启动,则会报错:
    "[FATAL] [gogs.io/gogs/internal/cmd/web.go:161 runWeb()] Failed to initialize application: init configuration: user configured to run Gogs is "git", but the current user is "root""

    需要切换到git用户启动才行

    $ sudo su - git
    $ cd ~
    $ cd gogs
    $ ./gogs web
    
    # 我这操作是切换到git用户后,使用gogs.sh脚本进行启动的,脚本内容见上面:bash gogs.sh start
    

    升级总结

    1.最新的软件包上没有说明一些注意事项,或者前提条件,比如gilibc和git的版本要求
    2.下载软件界面上面有二进制升级方式,若真按照这种方式升级,后果不敢想象

  • 相关阅读:
    etcd+confd管理nginx
    k8s基础
    nginx配置总结
    Golang相关
    docker基础
    celery结合django使用配置
    常用算法
    python3和paramiko安装
    git使用总结
    Linux系统入门实操经验分享
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/14344758.html
Copyright © 2011-2022 走看看