gitlab构建CI/CD

准备

docker部署gitlab

通过docker-compose启动gitlab

version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: '1.1.1.1'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://1.1.1.1:9001'
gitlab_rails['gitlab_shell_ssh_port'] = 1022
unicorn['port'] = 8888
nginx['listen_port'] = 9001
ports:
- '9001:9001'
- '443:443'
- '1022:22'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./losg:/var/log/gitlab

使用二进制部署gitlab-runner

可参考官方的安装方式Install GitLab Runner manually on GNU/Linux

gitlab-runner注册

安装完成之后使用注册命令注册

$ gitlab-runner register

然后会提示输入gitlab的地址以及token信息

地址信息和token我们在下面可以看到

根据提示输入信息,需要注意的是里面的tags就是我们编写.gitlab-ci.yml对应填写的tag

之后在gitlabrunner中就可以看到我们注册的gitlab-runner

配置Variables

在gitlab中可以配置我们gitlab-runner需要的变量,比如我们的docker-hub的密码,gitlab的账号密码等信息

简单先来个测试

先来个简单的gitlab-ci.yml测试下

stages:
- test
- build variables:
GOPROXY: https://goproxy.cn lint:
stage: test
script:
- echo "hello world lint"
only:
- branches
tags:
- golang-runner test:
stage: test
script:
- echo "hello world test"
only:
- branches
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner

开始构建

通过helmbazel实现在gitlab-runner中k8s应用的自动编译,发布。

镜像推送到docker-hub中,gitlab-runner中的helm需要配置好,这里我是用了helm默认初始化的charts结构来发布应用

gitlab-ci.yml

stages:
- test
- build
- deploy variables:
GOPROXY: https://goproxy.cn lint:
stage: test
script:
- export GO_PROJECT_PATH="/home/gitlab-runner/goWork/src"
- mkdir -p $GO_PROJECT_PATH
- ln -s $(pwd) $GO_PROJECT_PATH/test
- cd $GO_PROJECT_PATH/test
- bash build/lint.sh
only:
- branches
tags:
- golang-runner test:
stage: test
script:
- go mod vendor
- bash build/bazel-test.sh
only:
- branches
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner build:
stage: build
before_script:
- url_host=`git remote get-url origin | sed -e "s/http:\/\/gitlab-ci-token:.*@//g"`
- git remote set-url origin "http://$GIT_ACCESS_USER:$GIT_ACCESS_PASSWORD@${url_host}"
- git config user.name $GIT_ACCESS_USER
- git config user.email $GIT_ACCESS_EMAIL
- git fetch --tags --force
script:
- docker login -u $DOCKER_ACCESS_USER -p $DOCKER_ACCESS_PASSWORD
- go mod vendor
- bash build/bazel-build.sh
only:
- master
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner include: '/.gitlab/deploy.yaml'

镜像打包

test::util:build_docker_images() {
local docker_registry=$1
local docker_tag=$2
local base_image="alpine:3.7" query=$(test::util::find_changes) if [ "$query" == "" ]; then
test::util::log "no change and exit..."
exit 0
fi for b in ${query}; do
b=${b//\/\/src/"/src"} if [[ $b == *test* ]]
then
continue
fi local binary_file_path=$(test::util::find_binary "$b")
local binary_name=$(test::util::get_binary_name "$b")
local docker_build_path="dockerbuild/${binary_name}"
local docker_file_path="${docker_build_path}/Dockerfile"
local docker_image_tag="${docker_registry}/${binary_name}:${docker_tag}" test::util::log "Starting docker build for image: ${binary_name}"
(
rm -rf "${docker_build_path}"
mkdir -p "${docker_build_path}"
cp "${binary_file_path}" "${docker_build_path}/${binary_name}"
cat <<EOF >"${docker_file_path}"
FROM ${base_image}
COPY ${binary_name} /usr/local/bin/${binary_name}
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update --no-cache \
ENTRYPOINT ["/usr/local/bin/${binary_name}"]
EOF
docker build -q -t "${docker_image_tag}" "${docker_build_path}"
docker push ${docker_image_tag}
) cat <<EOF >>".gitlab/deploy.yaml"
${binary_name}:
stage: deploy
script:
- bash build/deploy.sh ${docker_registry} ${binary_name} ${docker_tag}
only:
- tags
when: manual
environment:
name: test
tags:
- golang-runner
EOF done test::util::log "Docker builds done"
}

整体的处理思路是

1、通过bazel构建go项目。

2、构建的时候找到有改动的项目,编译,打包镜像,生成deploy脚本。

3、打上tag,推到gitlab中。

4、最后通过手动触发项目的deploy,通过helm发布对应的项目到k8s中。

项目的地址gitlab-runner构建go项目

最后附上build的截图

遇到的报错

go: writing go.mod cache: mkdir /home/goWork: permission denied

给用户gitlab-runner添加最用目录的执行权限

sudo chown -R $(whoami):gitlab-runner /Users/zhushuyan/go/pkg && sudo chmod -R g+rwx /Users/zhushuyan/go/pkg

需要预备的知识点

这里主要使用到了helmbazel

helm使用

bazel使用

小白学k8s(9)-gitlab-runner实现go项目的自动化发布的更多相关文章

  1. 小白学k8s(7)helm[v3]使用了解

    helm使用 什么是helm 安装helm Helm V2 & V3 架构设计 配置kube config helm使用 添加仓库 helm安装nginx helm的核心概念 Chart Co ...

  2. 小白学k8s(8)-Bazel部署go应用

    Bazel使用了解 Bazel产生的背景 什么是Bazel 快(Fast) 可伸缩(scalable) 跨语言(multi-language) 可扩展(extensible) Bazel中的主要文件 ...

  3. K8s 部署 Gitlab CI Runner

    K8s 版本:1.20.6 GitLab CI 最大的作用是管理各个项目的构建状态.因此,运行构建任务这种浪费资源的事情交给一个独立的 Gitlab Runner 来做就会好很多,而且 Gitlab ...

  4. GitLab Runner部署(kubernetes环境)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Gitlab Runner的分布式缓存实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. 小白学Docker之Compose

    承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 概念 Compose是一个编排和运行多容器Docker应用的工具,主要是 ...

  7. 小白学Docker之Swarm

    承接上篇文章:小白学Docker之Compose,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之基础篇 小白学Docker之Co ...

  8. gitlab runner安装与使用

    今天来讲一下如何使用gitlab-runner 下载runner,根据自己对应服务器的型号自行选择下载: # Linux x86- sudo wget -O /usr/local/bin/gitlab ...

  9. 超详细Gitlab Runner环境配置中文教程

    配置GitlabRunner环境 GitLab Runner 是一个开源项目, 它用来运行你定制的任务(jobs)并把结果返回给 GitLab. GitLab Runner 配合GitLab CI(G ...

随机推荐

  1. helium的浏览器启动及option配置 - 1

    helium的浏览器启动及option配置 前言 helium只支持chrome和firefox两个浏览器,其中option配置是基于selelium来配置的,所以所调用的也是seleium的配置方式 ...

  2. 一种巧妙的使用 CSS 制作波浪效果的思路

    在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...

  3. mysql 索引十连问| 剑指 offer - mysql

    以下是结合网上及此前面试时遇到的一些关于mysql索引的面试题. 若对mysql索引不太了解可先翻阅相关文章 大白话 mysql 之深入浅出索引原理 - 上 大白话 mysql 之深入浅出索引原理 - ...

  4. Linux 根目录所在分区被脏数据占满

    背景: ​ 公司在做一个项目,大概功能就是一个通行闸机的人脸识别系统,要经过门禁的人注册了之后,系统就会存储一张原始的图片在服务器的数据文件夹里面,包括了永久的存储和一些访客注册临时存储.一天周五的时 ...

  5. 使用Wok管理kvm虚拟机

    [Centos7.4] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# ...

  6. 6.2 gzip:压缩或解压文件

    gzip命令 用于将一个大的文件通过压缩算法(Lempel-Ziv coding(LZ77))变成一个小的文件.gzip命令不能直接压缩目录,因此目录需要先用tar打包成一个文件,然后tar再调用gz ...

  7. 西门子 S7-200 以太网模块连接 WINCC步骤

    北京华科远创科技有限研发的远创智控ETH-YC模块,PLC转以太网型号有MPI-ETH-YC01和MPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-20 ...

  8. [leetcode] 45. 跳跃游戏 II(Java)(动态规划)

    45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...

  9. GO学习-(30) Go语言操作kafka

    go操作kafka Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和接收 ...

  10. Django框架中logging的使用

    Django框架中logging的使用 日志是我们在项目开发中必不可少的一个环节,Python中内置的logging已经足够优秀到可以直接在项目中使用. 本文介绍了如何在DJango项目中配置日志. ...