Drone如何使用GIT+SSH

慎终如始,则无败事。 ——《道德经》

在本文开始之前,我已经按官网的说明将 drone server 和 runner 都成功的部署在自己的服务器上。部署完之后创建了一条更新 github.io 的流水线,然而现在 github 的 https 通道弱不禁风,跑十次“失联”九次,所以需要换成用 ssh 来 git clone 和 push。

我们都知道 CI 流水线的第一步一般是 在 drone 的官方文档中并没有很直接的说明如何使用 ssh 来连接 git,只说明可以禁用默认的 clone 步骤并自定义 clone 流程,但并没看到有 ssh key 相关的参数或者环境变量之类的,不是很清楚怎么使用。

随后找到一篇博客,muxueqz 大佬的静态博客持续集成大法,看到他是自己写了 drone 的插件来定义参数和调用命令的,不过该博客写于2019年,于是我坚信这个步骤应该有并且可能两年时间已经优化了 ssh 的更简单的使用方法,于是又去找别的办法。

Drone官方讨论区 搜索了一下 git ssh,找到一些帖子:

这两个是 19 年的提问以及解决,还有一些更久远的就没看了

提问1 提问2

官方在 github 上给出的脚本:

# write the ssh key.
mkdir /root/.ssh
echo -n "$SSH_KEY" > /root/.ssh/id_rsa
chmod 600 /root/.ssh/id_rsa

# add github.com to our known hosts.
touch /root/.ssh/known_hosts
chmod 600 /root/.ssh/known_hosts
ssh-keyscan -H github.com > /etc/ssh/ssh_known_hosts 2> /dev/null

基本解决方法就是自己定义一个流水线环境变量然后用 from_secret 传入,然后当我使用的时候出现了一个问题:

截屏2021-09-07 15.27.44

报错私钥的格式不对,第一反应是换行,文件结束符之类的问题,因为 ssh key 是在 web 页面上直接粘贴进去的。再三确认我的 ssh key 是准确无误并具有权限的,然后找了很多关于这个报错的信息,试了很多解决办法,包括:

  1. 将 ssh 手动用 \n 连接在一起再复制到 secret 的 value 中。
  2. 用 drone-cli 来写入 secret:drone secret add --repository muxueqz/muxueqz-blog --name GIT_PUSH_SSH_KEY --data @/tmp/iam_logs/pages_id_rsa,其中@是文件语法,这也是 muxueqz 使用的方法,但在我这里还是报错“invalid format”。
  3. 用了一些 drone 的 git 插件,包括 plugins/gh-pages,plugins/git-action:1,muxueqz/drone-git-push-by-bash,无一例外均报错。
  4. 用官方给出的写入命令。

提问3,这个是21年1月的一个老哥,跟我一样的问题,最终他换了另外的 CI,有点尴尬。

最后发现,echo -n 会把 ssh key 写成一行,于是格式错误,不知道为何官网会用这个参数,改成 -e 后无论是直接粘贴还是用 /n 连接都可行。

不带参数 -e -n
直接粘贴 ❌ invalid format
用/n连接为一行字符串 ❌ invalid format ❌ invalid format

以下为我的 .drone.yml 文件中 clone 的部分:

kind: pipeline
type: docker
name: sync-tifinity-io

clone:
  disable: true
  
- name: clone
  image: centos
  environment:
    SSH_KEY:
      from_secret: SSH_KEY
  commands:
    - yum install -y git
    - yum install -y openssh-clients
    - mkdir $HOME/.ssh
    - echo -e "$SSH_KEY" > $HOME/.ssh/id_rsa
    - chmod 600 $HOME/.ssh/id_rsa
    - touch $HOME/.ssh/known_hosts
    - chmod 600 $HOME/.ssh/known_hosts
    - ssh-keyscan -H github.com > $HOME/.ssh/known_hosts
		# 带子模块的最好用这个参数,而不是先clone再update,否则子模块的clone默认用的还是 https
    - git clone --recursive git@github.com:Tifinity/Tifinity-Blog.git
  when:
    branch:
    - master

经过漫长的调试过程之后总算成功。