当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 配置流程
    • 注册ssh-key
    • git runner映射文件
    • 方法1 .gitlab-ci.yml使用
    • 方法2 docker build 实现
  • 总结

前言

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

当前的项目编译需要依赖别的项目协同编译,如何将别的项目也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

这里添加.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

跑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 

参考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
docker buildx build --ssh default=$SSH_AUTH_SOCK .
# 写法2
DOCKER_BUILDKIT=1 docker build --ssh default=$SSH_AUTH_SOCK .

注意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 ↩︎

相关文章:

  • 这款开源神器,让聚类算法从此变得简单易用
  • 【MATLAB源码-第80期】基于蚯蚓优化算法(EOA)的无人机三维路径规划,输出做短路径图和适应度曲线
  • C# 集合用法介绍
  • Apache SCXML2 RCE漏洞
  • mysql常用命令
  • Mallab勒索病毒的最新威胁:如何恢复您的数据?
  • 腾讯云优惠服务器有哪些?腾讯云服务器优惠券领取入口汇总
  • Go 理解零值
  • docker入门
  • Django(三、数据的增删改查、Django生命周期流程图)
  • STM32 寄存器配置笔记——GPIO配置输出
  • 【Amazon】云上探索实验室—了解 AI 编程助手 Amazon Codewhisperer
  • 【数据分享】1961—2022年全国范围的逐日降水栅格数据
  • 【java】idea可以连接但看不到database相关的files
  • Java版本spring cloud + spring boot企业电子招投标系统源代码
  • 基于GPTs个性化定制SCI论文专业翻译器
  • web前端开发网页设计课堂作业/html练习《课程表》
  • ARM课程发送一个字符,接收一个字符
  • 区域入侵AI算法如何应用在工地场景,保卫工地施工安全?
  • 【Linux】Ubuntu16.04配置repo
  • 中国物流集团等10家央企11名领导人员职务任免
  • 自然资源部:不动产登记累计化解遗留问题房屋2000多万套
  • 澳大利亚首例“漂绿”诉讼开庭:能源巨头因“碳中和”承诺遭起诉
  • 商务部:中方敦促美方尽快停止232关税措施
  • 宜昌谱写新叙事:长江大保护与高质量发展如何相互成就
  • 订婚不等于性同意!山西订婚强奸案入选最高法案例