跳转至

DroneCI 使用SSH协议Git操作

概要: 使用自定义的Docker镜像实现DroneCI代码库的ssh git操作

创建时间: 2022.10.16 21:50:40

更新时间: 2022.10.16 22:28:20

DroneCI默认下载代码库的方式

在DroneCI的官方文档中,指明了其下载代码库的方式是通过 https 而不是 ssh ,但是这样做有以下弊端

  1. 不能下载私有代码库
  2. 没有直接推送代码库的权限
  3. 不能见出Git子模块内容

虽然Drone提供了其使用的默认git插件,但此镜像依然不支持通过 ssh 协议下载代码,所以需要使用其他的Docker镜像解决此问题

使用ssh下载代码库

警告

如果要使用自定义的ssh操作代码库,那么首先要将DroneCI自带的 clone step关闭

YAML
clone:
  disable: true

Docker镜像选取

Git的Docker镜像选用的是vmware官方出品的 bitnami/git ,比较靠谱,然后还需要解决如下问题

  1. 如何传入自己的ssh私钥文件?
  2. 如何免除ssh首次握手的交互式问答?
  3. 如何检出到本次构建的commit?

ssh密钥注入

DroneCI 使用SCP插件上传制品 中,我们可以通过把原私钥文件的换行改为换行符 \n放到DroneCI的Secrets中 ,然后通过 from_secret 的方式写入并更改权限即可

ssh文件扫描

假定目标代码库托管的主机名是 github.com,那么使用如下的命令进行扫描

Bash
ssh-keyscan github.com
image.png
如果存在端口,命令扩展为
Bash
ssh-keyscan -p 2222 192.168.2.177

提示

github.comgitee.comgitlab.com 等网站,默认端口号是22

通过如上命令可以获取到主机的ssh远端信息,注入到 $HOME/.ssh/known_hosts 后即可免除首次握手的交互式操作

Bash
ssh-keyscan -p 22 git.lzwang.ltd >> $HOME/.ssh/known_hosts

检出到当前构建的commit

使用DroneCI的内置环境变量 DRONE_COMMIT 即可

Bash
git checkout $DRONE_COMMIT

其他git操作

在使用 bitnami/git 创建的容器后,我们本身已经在一个完整的Git环境中,并且拥有ssh私钥,其他的git操作,理论上在本地能完成的在容器内也可以完成
如初始化/更新Git子模块

Bash
git submodule update --init --recursive

完整示例

YAML
kind: pipeline
name: default
name: "Git via ssh demo"

clone:
  disable: true

steps:
  - name: "Checkout"
    image: bitnami/git
    pull: if-not-exists
    environment:
      SSHKEY:
        from_secret: drone_ci_sshkey_file
      GIT_HOST:
        from_secret: git_server_host
      GIT_PORT:
        from_secret: git_server_port
    commands:
      - ls -la
      - mkdir -p $HOME/.ssh/
      - echo $SSHKEY > $HOME/.ssh/id_rsa && chmod 600 $HOME/.ssh/id_rsa
      - ssh-keyscan -p $GIT_PORT $GIT_HOST > $HOME/.ssh/known_hosts 2> /dev/null
      - git clone $DRONE_GIT_SSH_URL .
      - git submodule update --init --recursive
      - git -c advice.detachedHead=false checkout $DRONE_COMMIT
      - git status

参考