• Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品


    前言

    之所以写这篇文章是由于存在以下场景:

    当前的项目编译需要依赖别的项目协同编译,如何将别的项目也pull到该项目里,编译成品如何打包镜像并保存到registry中。

    本文主要写在某项目进行CI流程编译时,如何拉取该项目依赖项目,中间会涉及到gitlab-runner的配置,runner运行服务器的配置,CI(.gitlab-ci.yml)流程文件编写,Dockerfile文件编写等。

    配置流程

    注册ssh-key

    新注册一个gitlab_ci的账户拥有admin权限,在gitrunnr运行的服务器上生成新的ssh-key,博主使用的是ssh-rsa。生成添加方法可以参考如下博文——简单易用多git服务器ssh密钥配置管理

    该文件保存在~/.ssh/id_rsa

    git runner映射文件

    [[runners]]
      name = "build"
      url = "http://gitlab.DOMAIN.com/"
      id = 7
      token = "*********"
      token_obtained_at = 2023-05-17T08:02:32Z
      token_expires_at = 0001-01-01T00:00:00Z
      executor = "docker"
      [runners.cache]
        MaxUploadedArchiveSize = 0
      [runners.docker]
        tls_verify = false
        image = "registry.gitlab.DOMAIN.com/docker_git:latest"
        #pull_policy = "if-not-present"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache","/home/dev/.ssh:/home/dev/.ssh","/var/run/docker.sock:/var/run/docker.sock"]
        shm_size = 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里添加.ssh文件夹的映射,docker.sock lock在docker in docker时使用。

    方法1 .gitlab-ci.yml使用

    .build:
      image: registry.gitlab.DOMAIN.com/docker_git:latest
      stage: test
      before_script:
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
        - eval $(ssh-agent -s)
        - ssh-add ~/.ssh/id_rsa
        - ssh -T git@gitlab.DOMAIN.com
      after_script:
        - rm -rf build install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    跑CI可以看到输出的ssh访问成功

    Welcome to GitLab, @gitlab_ci!

    本文结合如下几种方法综合实现,官网教程如下:

    Using SSH keys with GitLab CI/CD| GitLab

    Docker executor | GitLab

    方法2 docker build 实现

    这个需要在方法一的基础上去做,大概原理是通过ssh-agent做代理,docker build时将ssh相关参数传入docker中使其能够调用ssh-key。

    ssh -vvT会打印更多详细信息。Dockerfile如下所示

    # syntax=docker/dockerfile:1
    FROM alpine
    RUN apk add --no-cache openssh-client
    RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
    RUN --mount=type=ssh \
      ssh -vvT git@gitlab.DOMAIN.com 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考CI执行脚本如下:

    .build:
      image: registry.gitlab.DOMAIN.com/docker_git:latest
      stage: test
      before_script:
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
        - eval $(ssh-agent -s)
        - ssh-add ~/.ssh/id_rsa
        - IMAGE_NAME=$CI_REGISTRY_IMAGE/test:v0.0.1
        - docker buildx build --ssh default=$SSH_AUTH_SOCK .
        - docker push $IMAGE_NAME
      after_script:
        - docker rmi $IMAGE_NAME
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这两种写法均可,根据习惯选择。

    # 写法1
    docker buildx build --ssh default=$SSH_AUTH_SOCK .
    # 写法2
    DOCKER_BUILDKIT=1 docker build --ssh default=$SSH_AUTH_SOCK .
    
    • 1
    • 2
    • 3
    • 4

    注意image需要安装buildx否则会报错,可以参考如何建立并使用docker

    docker build 的整体官方教程如下:

    Dockerfile reference | Docker Docs

    总结

    本篇博文整理一种相对简单实现目标需求的方法,其实还有使用CI Job token1,生命周期短并且可以通过Settings -> CI/CD -> Token Access -> Limit access to this project设置该token作用范围。

    通过CI/CD Variables 去设置SSH_PRIVATE_KEY等方式,大家有兴趣可以深入研究。以后该部分也会持续跟新,随着实际生产加工环境逐步优化。


    1. GitLab CI/CD job token | GitLab ↩︎

  • 相关阅读:
    科技前沿:IDEA插件Translation v3.6 带来革命性更新,翻译和发音更智能!
    7.canvas图形颜色设置
    在CentOS 7.7 x86_64上安装python3.11.0实录
    springBoot视频在线播放,支持快进,分片播放
    GBJ2510-ASEMI电机专用25A整流桥GBJ2510
    寒假12 图论
    Java基础函数式编程
    基于Spark的电影推荐系统实现
    iOS ijkplayer 硬解H265(hevc)4k视频问题解决
    RuoYi-Vue 在Swagger和Postman中 上传文件测试方案
  • 原文地址:https://blog.csdn.net/Bing_Lee/article/details/134452782