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. MySQL5.7升级到8.0过程详解

    前言: 不知不觉,MySQL8.0已经发布好多个GA小版本了.目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了.本篇文章主要介绍从 ...

  2. CRM客户关系管理系统有哪些优缺点?

    CRM系统不仅仅是一种技术,也是面向企业的客户管理系统.客户关系管理软件可以帮助销售员快速地找到客户信息,帮助销售员跟踪客户直到完成订单.为提高企业销售效率,CRM被越来越多的企业所采用. 那么,作为 ...

  3. [java] XML DTD XSD

    XML是用来干什么的 https://bbs.csdn.net/topics/120762 https://blog.csdn.net/Rain722/article/details/52925828 ...

  4. 如何访问pod --- service(7)

    一.通过service访问pod 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller ...

  5. vue2路由之指定滑动位置scrollBehavior-(载转)

    看源码的时候看到这个属性: 新手自然不知道这个是什么东西了,查了下vue  API: https://router.vuejs.org/en/advanced/scroll-behavior.html ...

  6. node.js module初步理解-(转载)

    在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组 ...

  7. 3.socket编程示例

    #block_server.py 非阻塞IO示例#有个疑惑:下面的connfd的blockind要设置为True,不然会出错,待解决from socket import *from time impo ...

  8. lua中求table长度--(转自有心故我在)

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  9. linux各文件夹的作用-(转自玉米疯收)

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

  10. centos更新git

    安装完centos 7后默认的git版本为1.8,有些软件需要更新版本的git,但是在yum库中并没有更高的git版本,所以需要下载安装包进行手动安装,git下载地址:https://git-scm. ...