使用gitlab runner ci 通过ssh部署项目到远程服务器

标签:   

使用gitlab runner ci 通过ssh部署项目到远程服务器

Use gitlab runner ci to deploy projects to remote servers through ssh

逻辑:

  1. 在gitlab上创建pipelines任务

  2. 触发gitlab runner执行相关job,如构建、测试、部署

  3. 在部署阶段runner通过ssh将构建的产物scp到远程服务器,并在远程服务器执行相关部署逻辑

本文重点是记录runner通过ssh操作远程服务器

逻辑:

生成ssh相关证书,将公钥置于远程服务器相关文件,私钥置于runner,完成runner通过证书登录远程服务器,然后再执行相关操作

具体步骤

演示过程中的远程服务器为centos

  1. (此步骤可跳过)开启远程服务器ssh密码登录到服务器的设置

    # ssh登录出现Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 解决方法
    # 出现此问题是由于服务器未开启ssh密码登录或未开启root账号登录
    
    # 修改配置文件 /etc/ssh/sshd_config
    vim /etc/ssh/sshd_config
    # 增加如下修改:
    PasswordAuthentication yes #允许密码登录
    PermitRootLogin yes #允许root用户登入
    
    systemctl restart sshd #重启服务
  2. 远程服务器单独创建一个用户组和用户,用于gitlab-runner部署项目操作,为方便记忆和使用这里定为gitlab-runner

    groupadd gitlab-runner
    useradd gitlab-runner -g gitlab-runner
  3. 生成证书用于服务器登录

    收集所有需要登录服务器的用户公钥,一般公钥位于~/.ssh/id_rsa.pub文件中(不存在可使用命令ssh-keygen -t rsa创建),把我们的公钥导入到/home/用户名/.ssh/authorized_keys文件里,一行一个。

    此处由于runner每次运行后就销毁,所以不用在实际运行的runner上生成自己的证书,只要在自己电脑上生成证书然后部署到远程服务器和runner即可

    1. 自己电脑创建一个 ssh 证书 ssh-keygen -t rsa (运行命令后,提示输入保存路径、密码(因为是给runner使用的此处密码留空)、再次输入密码,到你保存的路径中找到文件 id_rsa.pub(尽量不要使用默认路径,防止自己之前正在使用的证书被覆盖) ,并将其文件中的内容放入服务器/home/用户名(上一步创建的)/.ssh/authorized_keys 文件中)

      # 此时得到两个文件
      id_rsa #私钥 之后放入runner中   
      id_rsa.pub #公钥 之后放入远程服务器中
    2. 将公钥放入远程服务器中

      服务器创建authorized_keys文件并设置权限,并放入公钥

      # 下方的‘gitlab-runner’为之前创建的用户名
      cd /home/gitlab-runner/
      mkdir .ssh
      touch .ssh/authorized_keys # 创建authorized_keys文件
      chmod 644 .ssh/authorized_keys
      # 复制公钥放入 (可存放多个公钥一行一个(一行放一个电脑的公钥))
      # 将id_rsa.pub内容复制粘贴到/home/用户名/.ssh/authorized_keys文件中
    3. 此时使用之前创建证书的机器就可以ssh登录到远程服务器了

      需要后续将证书私钥放到runner中,runner即可使用ssh登录到远程服务器了

      # 命令格式:ssh 用户名@服务器地址
      # 示例:
      ssh gitlab-runner@192.168.1.1
  4. 将证书私钥部署给runner,然后runner即可进行正常部署项目流程

    此处逻辑:创建CI/CD变量用于存放私钥,runner运行时动态将私钥放入runner,即可正常进行作业

    下边放出简化的job示例

    # 部署job
    deploy:
        stage: deploy
        image: alpine:latest
        before_script:
           # 此处进行放入ssh私钥 注意以下命令是基于alpine镜像
           - sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
           - apk update && apk add openssh-client
           - eval $(ssh-agent -s)
           - ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
           - mkdir -p ~/.ssh
           - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
        script:
         - echo 'this is test'>test.txt
         - scp -r test.txt "$SSH_USER_DEV"@"$SSH_SERVER_IP":~  # 将打包好的文件上到发布项目的服务器中

发表评论 登录

目前评论:0