基于GolangWeb项目的Gitlab CICD部署
前言
#工程化
前置
- 对 React 有基本认知,如
npm run dev
- 对 Golang 有基本认知, 会按照教程按安装,启动 Web 项目
- 对 Docker 有基本认知, 会使用基本命令. 如
run, exec
- 对 Nginx 有基本认知, 会按照教程安装, 配置
- 至少准备 2 台 Unix 服务器(虚拟机也可)
准备
本地环境
创建一个 Go Web 项目, 目录结构如下 目录结构: config: 配置文件目录
project
├─ config
└─ main.go
Web
-
安装 Node 环境
-
安装 PNPM 环境
npm install pnpm
- 在项目根目录的
web
目录使用 Vite 安装一个React
的Typescript
模板
cd project/web
pnpm create-vite . --template react-ts
- 初始化
git
仓库
cd project/web
git add .; git commit -m "build: :tada: initial"; git push -u main main --force
- 安装项目依赖
pnpm i
Golang
-
准备 Golang 环境
-
初始化
git
仓库 URI: web 项目的 git 的 URI 地址
cd /project
git init
git submodule add <URI> web
- 编写代码 main.go
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
)
func main() {
server := gin.Default()
server.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Pong")
})
if err := server.Run("0.0.0.0:4000"); err != nil {
log.Fatalln("运行gin服务失败,请检查端口是否被占用", err.Error())
}
}
- 安装依赖
如果该命令失败,则手动创建
go.mod
文件
go mod tidy
安装
前置
Gitlab
- 通过
Docker
安装GitLab - 测试登录
浏览器输入服务器 URL,登录服务器, 默认账号为
root
, 密码为root
![[Pasted image 20230305192600.png]]
如果忘记,或者密码错误. 进入 Docker 的 Gitlab 镜像中
输入sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
查看默认密码
- 在 Gitlab 新建项目 -> 新建空白项目 ![[Pasted image 20230305193207.png]]
- 链接到本地仓库
branch: 你的分支名, 本文为
main
, URI: 克隆按钮选择一项, 本文使用 SSH 克隆
cd project
git remote add <branch> <URI>
GitLab-Runner
进入 Docker
user: 用户名, 一般为 root
host: 主机 IP, 例如: 192.168.0.152
port: 端口, 默认为22
ssh <user>@<host> -p <port>
-
通过
Docker
安装GitLab-Runner,查阅该文章的三级标题**注册 Gitlab-Runner **部分 -
创建一个名为
runner1
的 Gitlab-Runner
mkdir -p /data/gitlab-runner/runner1/config //创建一个保存配置文件的目录
docker run \
-d \
--name runner1 \
--restart always \
-v /data/gitlab-runner/runner1/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
-
注册 runner 1. 登录 Gitlab, 默认账号为
root
,密码为root
2. 找到你的网站的 URL 与 TOKEN(注册令牌) ![[Pasted image 20230305035332.png]] -
注册 CI 通道 参考
/data/gitlab-runner/confi
替换为你的gitlab-runner/config
配置文件路径
docker run \
-it \
-v /data/gitlab-runner/runner1/config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest register
部署
编写自动化脚本
从本地 git push 提交触发 git hook 钩子时, gitlab-runner CI 管道监听触发事件, 然后进行处理, 那么就需要编写 gitlab 的 CI 自动化流程 如何编写自动化流程脚本?
- 思考以前手动的方式
- 自动化与手动有什么不同?
最佳实践是在项目根目录创建.gitlab-ci.yml
,也可以起为别的名称作为 gitlab 的 ci
stages:
- web
- golang
- deploy
cache:
key: edu_system
paths:
- ./web/node_modules
- ./web/client/node_modules
- ./web/client/dist
- ./app
- .cache
job_web:
stage: web
image: node:14-alpine
tags:
- edu-front-end
script:
- npm install pnpm -g
- cd ./web && pnpm install && cd ./client && pnpm install
- pnpm eslint:fix && pnpm stylelint:fix && pnpm build
only:
- main
artifacts:
paths:
- ./web/client/dist
job_golang:
stage: golang
image: golang:alpine # 利用Golang容器进行打包Golang项目
tags:
- edu-back-end
script:
- mkdir -p .cache
- export GOPATH="$CI_PROJECT_DIR/.cache"
- go env -w GOPROXY=https://proxy.golang.com.cn,direct
- go get
- go test ./test/
- go build -o app
- chmod +x app
artifacts:
paths:
- ./app
job_deploy:
stage: deploy
image: rockylinux
only:
- main
tags:
- edu-front-end
script:
- yum makecache # 生成索引缓存索引提供搜索安装速度
- yum install -y sshpass rsync openssh-clients # 下载`sshpass`,`openssh-clients`用于`SSH`登录服务器
- tar -czvf ./web/client/distdist.tar.gz --exclude=node_modules ./web/client/* # 进入打包后的`dist`目录,对里面所有文件进行压缩,并排除`node_modules`,压缩后名文件为`dist.tar.gz`
- export SSHPASS="$PASSWORD" # 设置生产服务器的密码的变量为`SSHPASS`,从gitlab的环境变量获取
- sshpass -e scp -o stricthostkeychecking=no ./config/dir.sh ./dist.tar.gz root@192.168.0.158:/home/nginx/html/web/ # 发送`dist.tar.gz`文件至生产服务器的`nginx`路径
- sshpass -e rsync -av -e "ssh -o stricthostkeychecking=no" --exclude="web" --exclude=".git" --exclude=".cache" --exclude=".idea" . root@192.168.0.158:/home/nginx/html/web/temp # 发送go项目二进制文件与Dockerfile和deploy.sh
- sshpass -e ssh -o stricthostkeychecking=no root@192.168.0.158 'cd /home/nginx/html/web && bash dir.sh && tar -xzvf ./dist.tar.gz -C /home/nginx/html/web && rm -rf dist.tar.gz' # 进入到生产服务器的`nginx`路径, 对`dist.tar.gz`文件进行解压, 解压完成后删除`dist.tar.gz`文件
- sshpass -e ssh -o stricthostkeychecking=no root@192.168.0.158 'cd /home/nginx/html/web/temp && bash ./deploy.sh' #部署go项目至Docker镜像