Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境

搭建 Docker 环境

WSL2 环境安装

待更新…

Docker Desktop 安装

待更新…

搭建 GitLab-CE 环境

添加 docker-compose.yml

version: '3'
services:
  gitlab:
    container_name: 'gitlab'
    image: gitlab/gitlab-ce:14.2.1-ce.0
    hostname: 'gitlab'
    restart: always
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_ROOT_PASSWORD: 'gitlab_pwd123'          # root 账号的密码
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:80'           # http协议所使用的访问地址,不加端口默认80
        gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 此端口是run时22端口映射的2224端口
    ports:
      - '80:80'
      - '4443:443'
      - '2222:22'
    volumes:
      - './config:/etc/gitlab:rw'
      - './logs/:/var/log/gitlab:rw'
      - './data:/var/opt/gitlab:rw'
    networks:
      - gitlab
networks:
  gitlab:

目录结构

Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第1张图片

执行命令

在当前目录下执行命令

docker-compose up -d

docker container 可以看到环境已经成功运行
在这里插入图片描述

验证服务可用

  1. 浏览器访问 http://localhost/,使用管理员账号root进行登录
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第2张图片

修改root密码

  1. 进入终端在这里插入图片描述

  2. 执行命令

gitlab-rails console -e production
user =User.where(id:1).first
user.password = 'gitlab_pwd123'
user.password_confirmation = 'gitlab_pwd123'
user.save!
  1. 重新登录

新建项目组及项目

  1. 在这里插入图片描述
  2. Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第3张图片
  3. Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第4张图片
  4. 在这里插入图片描述
  5. Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第5张图片
  6. Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第6张图片
  7. 以下项目为例,新建了一个test组的hello项目
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第7张图片
  8. 查看项目的cicd配置
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第8张图片
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第9张图片
    记住此处的 url 和 token,后续的 gitlab-runner 注册需要使用

搭建GitLab-Runner

新建docker-compose.yml

version: '3'
services:
  gitlab-runner:
    container_name: 'gitlab-runner'
    image:  gitlab/gitlab-runner:ubuntu-v14.2.0
    hostname: 'gitlab-runner'
    restart: always
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock  # 将宿主机的docker挂载在runner,这样就可以在runner里面执行docker命令
      - /bin/docker:/bin/docker # 将宿主机的docker挂载在runner,这样就可以在runner里面执行docker命令
      - /usr/bin/com.docker.cli:/usr/bin/com.docker.cli # 将宿主机的docker挂载在runner,这样就可以在runner里面执行docker命令
    networks:
      - gitlab-runner
networks:
  gitlab-runner:

目录结构

Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第10张图片

执行命令

在当前目录下执行命令

docker-compose up -d

docker container 可以看到环境已经成功运行
在这里插入图片描述

注册 Runner

  1. 进入终端在这里插入图片描述
  2. 执行命令
gitlab-runner register
  • 输入URL,即gitlab-ce项目cicd配置的url;
  • 输入Token,即gitlab-ce项目cicd配置的Token;
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第11张图片
  • 输入Runner 描述:
  • 输入执行者:(此次测试,使用shell的方式)
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第12张图片
  1. 注册完成,进入gitlab查询结果
    可以看到runner已经成功注册
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第13张图片
  2. 修改 runner 配置,使之每次push都触发piplines,这样方便测试
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第14张图片
    Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第15张图片

验证 Pipline

  1. 编写 .gitlab-ci.yaml 测试
stages:
  - test # 执行单元测试
  - build # 执行构建
  - deploy # 执行发布
Test:
  stage: test
  script:
      - echo "$(date +"%Y%m%d%H%M%S")" Test Done # 模拟单元测试脚本
Build:
  stage: build
  script:
      - echo "$(date +"%Y%m%d%H%M%S")" Build Done # 模拟构建脚本
Deploy:
  stage: deploy
  script:
      - echo "$(date +"%Y%m%d%H%M%S")" Deploy Done # 模拟发布脚本

  1. 提交文件后,进入ci/cd pipline 进行查看,出现一些任务,说明 runner 正常运行Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第16张图片

宿主机配置

  1. 设置 docker 可给runner共享
sudo chmod 777 /var/run/docker.sock
  1. Runner 用户加入宿主机
    gitlab-runner执行时 是以 gitlab-runner用户来执行的,当使用共享宿主机docker.sock的方式的时候,需要将runner的用户加入宿主机
sudo useradd  gitlab-runner 
sudo gpasswd -a gitlab-runner docker
  1. 查看用户是否已添加
 cat /etc/group

在 docker 组中能查看到 gitlab-runner 则表示添加成功

DockerHub 搭建

添加 docker-compose.yml

version: '3'
services:
  registry:
    image: registry:2.7.1
    container_name: registry
    volumes:
      - ./var/lib/registry:/var/lib/registry
    ports:
      - 5000:5000
    networks:
      - registry 
networks:
    registry:

目录结构

Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第17张图片

执行命令

在当前目录下执行命令

docker-compose up -d

docker container 可以看到环境已经成功运行
在这里插入图片描述

测试服务可用

docker tag registry:2.7.1 localhost:5000/registry:2.7.1
docker push localhost:5000/registry:2.7.1

如下提示代表仓库服务可用
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第18张图片

Golang Hello 自动化发布

Runner配置修改

将runner的执行者修改为 docker,并配置runner.docker,并重启 gitlab-ci runner 容器

concurrent = 1
check_interval = 0
[session_server]
  session_timeout = 1800
[[runners]]
  name = "hello runner"
  url = "http://gitlab.local.com/"
  token = "Je87UgYb7HjNjh9Y2xvZ"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    shm_size = 0
    image = "localhost:5000/golang:1.17.0"
    privileged = true
    volumes = ["/var/run/docker.sock:/var/run/docker.sock","/bin/docker:/bin/docker","/usr/bin/com.docker.cli:/usr/bin/com.docker.cli", "/cache"]

项目

目录结构

Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第19张图片

main.go

package main

import (
	"fmt"
	"time"
)

func main() {
	for {
		fmt.Printf("%v Say Hello!\n", time.Now())
		time.Sleep(time.Second)
	}
}

func Sum(a, b int) int {
	return a + b
}

main_test.go

package main

import "testing"

func TestSum(t *testing.T) {
	a := 1
	b := 2
	exp := 3
	act := Sum(a, b)
	if exp != act {
		t.Errorf("Not Equal. exp:%d,act:%d", exp, act)
	}
}

go.mod

module gitlab.local.com/test/hello
go 1.17

Dockerfile

FROM golang:1.17.0 

WORKDIR /src
COPY . .
RUN go build -v . && ls
CMD ["./hello"]

.gitlab-ci.yml

stages:
  - lint # 执行代码风格检查
  - test # 执行单元测试
  - build # 执行构建
  - deploy # 执行发布
  
Lint:
  image: localhost:5000/golangci/golangci-lint:latest # 依赖的镜像
  stage: lint
  allow_failure: true # 允许失败继续
  script:
    - echo "Lint begin"
    - go version
    - golangci-lint run -v # go 代码风格检查
    - echo "Lint end"

Test:
  image: localhost:5000/golang:1.17.0 # 依赖的镜像
  stage: test
  script:
    - echo "Test begin"
    - go version
    - go test -race -mod=vendor -v -coverprofile .testCoverage.out ./... # go 单元测试命令并生成覆盖率文件
    - echo "Test end"
Build:
  stage: build
  script:
    - echo "Build begin"
    - docker build -t localhost:5000/hello:v0.0.1 -f ./Dockerfile . # 使用dockerfile构建镜像
    - docker push localhost:5000/hello:v0.0.1 # 推送镜像到本地镜像仓库
    - echo "Build end"  # 镜像构建完成
Deploy:
  stage: deploy
  script:
    - echo "$(date +"%Y%m%d%H%M%S")" Deploy Done # 模拟发布脚本

推送代码到仓库

推送代码到仓库后,登录gitlab可以看到已经触发了runner
在这里插入图片描述
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第20张图片
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第21张图片
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第22张图片
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第23张图片

验证镜像是否已推送仓库

docker pull localhost:5000/hello:v0.0.1

能正常拉取镜像则说明推送仓库成功

docker run localhost:5000/hello:v0.0.1

容器成功启动,并执行 Say Hello ,则表示镜像是正确的
Windows 使用 Docker 搭建 Golang Gitlab CICD 持续集成环境_第24张图片

镜像自动部署到k8s

未完待续…

你可能感兴趣的:(运维,golang,docker,ci/cd,golang)