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

文章目录

  • 前言
  • 配置流程
    • 注册ssh-key
    • [git runner映射文件](#git runner映射文件)
    • [方法1 .gitlab-ci.yml使用](#方法1 .gitlab-ci.yml使用)
    • [方法2 docker build 实现](#方法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映射文件

bash 复制代码
[[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使用

yaml 复制代码
.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如下所示

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执行脚本如下:

yaml 复制代码
.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

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

yaml 复制代码
# 写法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 token[1](#1),生命周期短并且可以通过Settings -> CI/CD -> Token Access -> Limit access to this project设置该token作用范围。

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


  1. GitLab CI/CD job token | GitLab ↩︎
相关推荐
用户962377954482 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主3 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954485 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954485 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star5 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954485 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher7 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行10 天前
网络安全总结
安全·web安全