use gitlab runner ci to deploy projects to remote servers through ssh
逻辑:
-
在gitlab上创建pipelines任务
-
触发gitlab runner执行相关job,如构建、测试、部署
-
在部署阶段runner通过ssh将构建的产物scp到远程服务器,并在远程服务器执行相关部署逻辑
本文重点是记录runner通过ssh操作远程服务器
逻辑:
生成ssh相关证书,将公钥置于远程服务器相关文件,私钥置于runner,完成runner通过证书登录远程服务器,然后再执行相关操作
具体步骤
演示过程中的远程服务器为centos
-
(此步骤可跳过)开启远程服务器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 #重启服务
-
远程服务器单独创建一个用户组和用户,用于gitlab-runner部署项目操作,为方便记忆和使用这里定为gitlab-runner
groupadd gitlab-runner useradd gitlab-runner -g gitlab-runner
-
生成证书用于服务器登录
收集所有需要登录服务器的用户公钥,一般公钥位于~/.ssh/id_rsa.pub文件中(不存在可使用命令
ssh-keygen -t rsa
创建),把我们的公钥导入到/home/用户名/.ssh/authorized_keys文件里,一行一个。此处由于runner每次运行后就销毁,所以不用在实际运行的runner上生成自己的证书,只要在自己电脑上生成证书然后部署到远程服务器和runner即可
-
自己电脑创建一个 ssh 证书
ssh-keygen -t rsa
(运行命令后,提示输入保存路径、密码(因为是给runner使用的此处密码留空)、再次输入密码,到你保存的路径中找到文件 id_rsa.pub(尽量不要使用默认路径,防止自己之前正在使用的证书被覆盖) ,并将其文件中的内容放入服务器/home/用户名(上一步创建的)/.ssh/authorized_keys 文件中)# 此时得到两个文件 id_rsa #私钥 之后放入runner中 id_rsa.pub #公钥 之后放入远程服务器中
-
将公钥放入远程服务器中
服务器创建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文件中
-
此时使用之前创建证书的机器就可以ssh登录到远程服务器了
需要后续将证书私钥放到runner中,runner即可使用ssh登录到远程服务器了
# 命令格式:ssh 用户名@服务器地址 # 示例: ssh gitlab-runner@192.168.1.1
-
-
将证书私钥部署给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