网站开发的作用,电子商务网站关键技术,c语言做网站的代码,网站设置密码由于公司没有运维#xff0c;写go服务时各个环境编译部署还是略显麻烦#xff0c;由于代码管理使用的是 gitlab#xff0c;所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署#xff0c;这样每次提交代码以后就可以自动部署到服务器上了。
gitlab 本身只有 CI/CD 的接…由于公司没有运维写go服务时各个环境编译部署还是略显麻烦由于代码管理使用的是 gitlab所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署这样每次提交代码以后就可以自动部署到服务器上了。
gitlab 本身只有 CI/CD 的接口真正执行 CI/CD 任务的是 gilab runner它负责与 gitlab 通信接受 CI/CD 任务并交给 Executor 执行Executor 有7种类型
DockerShellKubernetesSSHVirtualBoxParallelsCustom
Executor的类型在注册 Runner 的时候确定比较常用的是 Docker 和 SSH。GitLabRunner 和 Executor 之间的关系如下图所示(图片来自GitLab官方文档)。
安装gitlab-runner
gitlab 的CI/CD 任务是通过 runner 来运行的runner 也是 go 语言实现的。我们需要单独安装 runner而且可以在任意位置安装。
runner 有 docker 版和可执行程序版这里我选择的是可执行程序版安装方式可以参考官网。
我的服务器是 linux使用官方提供的脚本安装
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash可执行程序名叫 gitlab-runner 被放在 /usr/bin/ 目录下。
注册runner
runner 需要注册到 gitlab其实就是把 runner 的信息告诉 gitlab这样 gitlab 才知道把 CI/CD 任务交给谁运行。
注册 runner 的命令是 gitlab-runner register 回车后会以交互式的方式注册 runner其中比较重要的几个参数是 executor运行流水线的环境也就是前面说的7种 Executor 类型我使用本地 shell 运行流水线所以输入 shell 。 url 和 registration-tokenrunner 和项目是挂钩的所谓的注册其实也就是把 runner 和某个项目关联起来。打开项目的 setting→CI/CD找到 Runners 点击展开在 Specific runners 栏下面就是我们需要的 url 和 token。如下图所示
当然为每个项目注册一个 runner 也不太合适我们可以为一个组注册一个 runner点开某个组url 和 token 可以在同样的地方找到。这样组内每个项目就都能使用这个 runner 了。此外也可以给整个 gitlab 注册 runner但是这需要 root 账号。
另外同样的 url 和 token 可以注册多个runner然后通过 tag 来决定项目使用哪个 runner。 注册 runner 和安装 runner 是两个概念也就是说即便我们只安装了一个 runner也能注册多个 runner。安装 runner 是下载可执行程序而注册只是往 gitlab 设置一些配置信息它和 runner 本身其实没太大关系注意此时我们的 runner 还没有开始运行。
除了使用交互式注册还可以使用非交互方式命令如下
gitlab-runner register \--non-interactive \--url https://gitlab.com/ \--registration-token $PROJECT_REGISTRATION_TOKEN \--executor shell \--description share-runner \--maintenance-note Free-form maintainer notes about this runner \--tag-list shell,share \--run-untaggedtrue \--lockedfalse \--access-levelnot_protected注意到 --run-untagged 选项它表示是否运行在没有标签的的分支上运行流水线。如果没有设置这个参数也可以在 gitlab 页面上设置。就在我们查看 url 和 registration token 的地方如果 runner 注册成功的话可以看到下面的信息 点击那个铅笔图标可以设置 runner在这里我们也可以勾选 run untagged jobs如下图所示。 上面我的 runner 前面小圆点是绿色的那是因为我的 runner 已经运行起来了。
注册完 runner 会生成配置文件 /etc/gitlab-runner/config.toml 可以打开查看我们配置的信息都在里面。
启动runner
在启动 runner 之前我们可以先创建一个专门的用户来运行 runner比如
useradd --comment GitLab Runner --create-home gitlab-runner --shell /bin/bash这里我们添加的用户叫 gitlab-runner 你也可以使用被的用户甚至 root 或者为了方便部署使用部署的用户。 然后安装并启动 gitlab 服务
gitlab-runner install --usergitlab-runner --working-directory/home/gitlab-runner
gitlab-runner start所谓安装就是设置为系统服务它会在 /etc/systemd/system/ 目录下生成 gitlab-runner.service 文件。 其他命令
gitlab-runner stop 停止 gitlab-runner 服务。gitlab-runner start 启动 gitlab-runner 服务。gitlab-runner restart 重启 gitlab-runner 服务。gitlab-runner status 查看 gitlab-runner 服务状态。gitlab-runner uninstall 卸载 gitlab-runner 服务。gitlab-runner list 列出所有注册的 runner。
编写流水线
我们通过在项目根目录下创建一个叫 .gitlab-ci.yml 的文件来定义流水线也就是 CI/CD 如何执行。
流水线分为阶段和作业阶段通过 stages 关键字定义阶段是作业的容器每个阶段内可以定义多个作业。阶段之间是串行执行的阶段内的多个作业是并行执行的。
关于流水线的编写可以参看官方文档或者《GitLab CI/CD 从入门到实战》这本书。当然 gitlab 官方也提供了很多示例各种语言都有如果不知到如何开始可以参考官方示例。
基本结构如下
stages: # 定义阶段- test # 阶段名- build # 阶段名- deploy # 阶段名unit_test: # 作业名stage: test # 作业属于 test 阶段script: # 作业执行的命令- echo unit testcompile: # 作业名stage: build # 作业属于 build 阶段script: # 作业执行的命令- echo builddeploy_test: # 作业名stage: deploy # 作业属于 deploy 阶段secipt: # 作业执行的命令- echo deploy test我用的是 go 语言使用 shell 运行和部署只有测试环境和正式环境。
default:interruptible: true # 允许打断流水线variables:GOBIN: /usr/local/go/bin/goGOINSECURE: git.i****d.comGOPRIVATE: git.i****d.comGOPROXY: https://goproxy.cn,directimage: golang:lateststages:- test- build- deployformat:stage: testscript:- echo 单元测试- pwd- echo ~- echo $CI_COMMIT_BRANCH- echo $CI_DEFAULT_BRANCE- export GOINSECURE$GOINSECURE- export GOPRIVATE$GOPRIVATE- export GOPROXY$GOPROXY- $GOBIN version- $GOBIN mod tidy- $GOBIN test -v 21 | go-junit-report -set-exit-code report.xmlartifacts:when: alwaysreports:junit: report.xmlcompile:stage: buildscript:- echo 编译- pwd- echo ~- export GOINSECURE$GOINSECURE- export GOPRIVATE$GOPRIVATE- export GOPROXY$GOPROXY- $GOBIN version- $GOBIN mod tidy- mkdir -p _build- $GOBIN build -o _build/$CI_PROJECT_NAME main.goartifacts:expire_in: 1 hourpaths:- _build# 部署生产环境仅release分支
deploy_prod:stage: deployvariables:SERVER_IP: 1**.**.**.*script: - echo 部署生产环境- ssh z**j$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 创建项目文件夹- ssh z**j$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 创建配置文件夹- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ [ -f run.sh ] ./run.sh stop || : # 停止服务- scp _build/$CI_PROJECT_NAME z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝可执行文件- scp run.sh z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝run.sh- scp config/application.prod.toml z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷贝配置文件- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ chmod x run.sh- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ ./run.sh start # 重启服务only:- release # 仅release分支部署到生产环境environment: production# 部署测试环境非main和release分支
deplog_test:stage: deployvariables:SERVER_IP: 1**.**.**.*script:- echo 部署测试环境- ssh z**j$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 创建项目文件夹- ssh z**j$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 创建配置文件夹- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ [ -f run.sh ] ./run.sh stop || : # 停止服务- scp _build/$CI_PROJECT_NAME z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝可执行文件- scp run.sh z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝run.sh- scp config/application.test.toml z**j$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷贝配置文件- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ chmod x run.sh- ssh z**j$SERVER_IP cd /data/z**j/$CI_PROJECT_NAME/ ./run.sh start # 重启服务except:- $CI_DEFAULT_BRANCH- releaseenvironment: test
多环境部署通过不同的分支来实现 .gitlab-ci.yml 中的 environment 关键字只是对部署任务做一个记录和分类方便管理和查询部署任务并无实际区分部署环境的功能。