在Linux上搭建gitlab以及自动化编译部署的完整流程

文章详细介绍了如何安装GitLab,包括下载安装包,配置外部URL和SMTP服务,以及重新加载配置。接着讲述了账号管理和用户权限设置。重点在于创建CI/CD流程,包括安装runner,配置.gitlab-ci.yml文件,处理常见错误。最后,提供了一个示例的.gitlab-ci.yml文件,展示了自动化编译和打包的过程,并提到了runner的开机自启服务配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、安装gitlab

        首先下载gitlab的安装包,地址如下:

https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/bionic/main/g/gitlab-ce/

        然后安装下载的包即可,一般还需要安装openssh-server等依赖包,在安装gitlab包之前可以使用dpkg -I *.deb查看所需依赖并安装。

        修改gitlab配置,主要是一些端口用户等配置:

sudo vim /etc/gitlab/gitlab.rb

## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
#external_url 'http://gitlab.example.com'
external_url 'http://192.168.229.128' #修改为机器IP

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.server"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_pool'] = false

        修改配置之后执行命令重新加载配置:

sudo gitlab-ctl reconfigure

        执行完该条命令之后,就会生成一个初始密码,位置如下:

sudo cat  /etc/gitlab/initial_root_password

然后通过IP即可访问,输入账号root以及密码即能登入,登入之后可以修改密码。

二、账号申请管理

        有了管理员账号之后,其它用户就能申请个人账号进行使用,申请之后,由管理账号进行通过:

        然后进入以下页面,可以对申请用户进行管理,编辑权限,通过之后,就可以使用申请账号进行登录 :

 三、创建组和项目:

        管理员账号以及有权限的个人账号,都可以创建组和项目,操作比较简单。

四、自动打包发布:

         首先根据提示在组中安装所需要的包,以及申请runner,注意是在编译的服务器中安装,不是在gitlab代码托管的服务器:

        

 

 

        注意,如果runner和构建环境在一个主机上,ssh地址填localhost就可以。

         runner创建之后就可以在项目中创建CI/CI流水线:

         具体的一些配置项可以自行在网上查询.gitlab-ci.yaml的编写说明,比如设置只在特定的分支上编译等。

        同时还需要配置ssh以便于免密登录(这一步好像不需要,忘了,实际进行部署的时候可以尝试一下,也可以在两边服务器上都执行以下命令,因为我这里已经部署过一遍了,部署第二个group项目的时候没有执行下面的命令也可以,所以不太确定了):

        以下命令均在客户端执行:

        1、生成密钥:

ssh-keygen

        2、将公钥传到服务器(root和host分别对应服务端的用户名和IP):

ssh-copy-id root@host

        3、测试免密登录是否成功:

ssh root@host

        接下来在gitlab的项目组中设置CI/CD变量(也可以在具体项目中单独配置):

       

         设置的变量以及值为(注意填的是runner编译服务器的信息,SSH_KNOWN_HOSTS 和SSH_PRIVATE_KEY 可能也不需要,部署第二个group时未填,如果有端口需要填SSH_PORT):

SSH_USER = 服务器用户名
SSH_HOST = 服务器ip
SSH_KNOWN_HOSTS = 文件 ~/.ssh/known_host 中服务器ip的一行(一般为第一行)
SSH_PRIVATE_KEY = 文件 ~/.ssh/id_rsa 中的内容

        这一系列配置完之后,就可以在项目中按照.gitlab-ci.yaml进行编译了,当然,CI服务器上也需要安装一些编译各种包时所需要的依赖包。

五、常见CI错误解决:

Using SSH executor...
ERROR: Preparation failed: ssh command Connect() error: getting host key callback: open /root/.ssh/known_hosts: no such file or directory
Will be retried in 3s ...

解决:在/etc/gitlab-runner/config.toml添加:
[[runners]]
...
  [runners.ssh]
    disable_strict_host_key_checking = true
...
ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

解决:
删除 /home/用户/.bash_logout

六、.gitlab-ci.yml范例:

# 指定使用的语言环境
image: debian:latest
 
stages:
  - build
 
variables:
  #项目统一放置deb的目录
  LZOS_DIR: /home/lz/LZOS

build:
  stage: build
  script:
    - echo "*************************************************** build ***************************************************"
    - echo "LZOS_DIR:$LZOS_DIR"
 
    #安装依赖
    - |
      builddepends=$(dpkg-checkbuilddeps 2>&1 | awk '/Unmet build dependencies:/ {sub(/^.*: /, ""); gsub(/ *\([^)]*\)/, ""); print}' || true)
      export DEBIAN_FRONTEND=noninteractive
      echo "************build-depends apt install*******************"
      echo 123123 | sudo -S -p "" sh -c 'sudo apt update && sudo apt upgrade -y --allow-downgrades'
      echo 123123 | sudo -S -p "" sh -c 'sudo mk-build-deps -i -t "apt-get --yes" -r'

    #该工程的名字及路径
    - project_name=`dpkg-parsechangelog --show-field Source`
    - echo "project_name:$project_name"
    - project_dir=$LZOS_DIR/$project_name
    - echo "project_dir:$project_dir"
 
    #该工程的路径不存在则创建
    - if [ ! -d $project_dir ]; then mkdir $project_dir; fi
 
    #现存最高版本,初始化为0
    - latest_version="0"
    - all_dir=`find $project_dir -type d -regex '.*/[0-9][^/]*$' -printf "%f\n"`
    - for dir in $all_dir; do
        version=$dir;
        echo "version:$version";
        get_version=`dpkg --compare-versions $version gt $latest_version && echo 1 || echo 0`;
        if [ $get_version -eq 1 ]; then
          latest_version=$version;
        fi;
      done
    - echo "latest_version:$latest_version"  
 
    #获取debian目录下changelog文件中的版本号
    - changelog_version=`dpkg-parsechangelog --show-field Version`
    - echo "changelog_version:$changelog_version"
    
    #比较changelog中的版本号和现存最高版本号,changelog_version大则输出1
    - comparison_results=`dpkg --compare-versions $changelog_version gt $latest_version && echo 1 || echo 0`
    - echo "comparison_results:$comparison_results"
 
    #changelog版本号正确则编译,否则结束
    - if [ $comparison_results -eq 1 ]; then
        debuild_cmd="debuild-ccache";
        if [ "${PARALLEL+defined}" = "defined" ]; then
          debuild_cmd="debuild-ccache ${PARALLEL}";
        fi;
        echo "*************************************************** Starting to ${debuild_cmd} ***************************************************";
        eval "${debuild_cmd}";

        if [[ $? -ne 0 ]]; then
          echo "************* ${debuild_cmd} 命令执行失败";
          exit 10;
        fi;

        dir=$project_dir/$changelog_version;
        if [ ! -d $dir ]; then 
          mkdir $dir; 
          echo "*************************************************** mkdir dir:$dir ***************************************************";
        else
          echo "*************************************************** dir:$dir is exist ***************************************************";
        fi;
        cd ../;
        cp *.deb $dir;
        echo "cp *.deb to path:$dir";
        echo "*************************************************** build deb success ***************************************************";
      else
        echo "***************************** changelog_version($changelog_version) isNot greater than latest_version($latest_version) *****************************";
        exit 20;
      fi

      # 将生成的ddeb/deb包发送到服务器 (需要管理员在编译服务器上配置对源服务器的免密登录: ssh-copy-id,用sshpass 也可以)
    - scp -P 3535 *.deb lz@192.168.2.231:/home/lz/dongting-tmp/
    # 在目标服务器上执行命令
    - ssh -p 3535 lz@192.168.2.231 "cd /home/lz/lzos_ppa/dongting && reprepro -C main includedeb dongting /home/lz/dongting-tmp/*.deb; rm /home/lz/dongting-tmp/*.deb"

    - if ls *.ddeb >/dev/null 2>&1; then
        scp -P 3535 *.ddeb lz@192.168.2.231:/home/lz/dongting-tmp/;
        ssh -p 3535 lz@192.168.2.231 "cd /home/lz/lzos_ppa/dongting && reprepro --ignore=extension -C dbgsym includedeb dongting /home/lz/dongting-tmp/*.ddeb; rm /home/lz/dongting-tmp/*.ddeb";
      fi
  
    # 删除文件
    - rm -f *.deb *.ddeb *.changes *.buildinfo *.build

  #选择runner,注册runner时设置了tag,可用于不同平台服务器编译,arm,x86,linux,windows等    
  tags:
    - dongting
 
  only:
    - dongting 

        这里主要实现了读取changelog中的版本号与服务器中现存版本进行比较,如果编译的版本号大则继续编译。

runner开机自启服务(/etc/systemd/system/gitlab-runner.service):

sudo systemctl daemon-reload

sudo systemctl start gitlab-runner.service

sudo systemctl enable gitlab-runner.service

[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/local/bin/gitlab-runner

After=syslog.target network.target 

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "gitlab-runner"

Restart=always

RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner

[Install]
WantedBy=multi-user.target

        还想加一个自动打tag的功能,后续再补充。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值