利用Gitlab和Jenkins做CI(持续集成)

利用Gitlab和Jenkins做CI(持续集成)

最近用到持续集成顺便总结在这里,都是用的最新版。搭建过程中还有一个demo,提交代码到 gitlab 自动触发 jenkins 任务,自动编译代码和 docker 镜像并上传。

安装运行 Gitlab

gitlab 国内安装很麻烦,用官方的源装不了,因为在国外,太慢,链接会断掉。国内清华有 gitlab 的 apt 和 yum 源,但是我试过安装 CentOS 7 的 gitlab ,到最后都会一直卡住结束不了。直接下载清华 gitlab 的 rpm mirror 安装也是一样,所以我还是选择用 docker 启动 gitlab(提前配好 docker hub 加速器)

准备镜像

docker pull gitlab/gitlab-ee:latest

准备 gitlab 所需目录

mkdir gitlab
cd gitlab
mkdir config logs data

准备启动脚本 (替换想要的启动端口,ip 地址替换为访问你的 gitlab 的地址,也可以替换想要的挂载目录)

vi run
#! /bin/bash

sudo docker run -d --rm \
    -p 8088:8088 \
    --name gitlab \
    --env GITLAB_OMNIBUS_CONFIG="external_url 'http://118.24.64.246:8088/'; gitlab_rails['lfs_enabled'] = true;" \
    -v $PWD/config:/etc/gitlab \
    -v $PWD/logs:/var/log/gitlab \
    -v $PWD/data:/var/opt/gitlab \
    gitlab/gitlab-ee:latest
EOF

赋予执行权限

chmod +x run

启动 gitlab

./run

查看 gitlab 控制台输出

docker logs -f gitlab

访问 gitlab,打开脚本中配置的 external_url 地址,设置管理员密码和注册 gitlab 账号,登录并添加自己的 SSH key 。创建 repo ,git clone 到本地,后面我们提交代码到这个 repo ,触发 jenkins 的持续集成。

安装运行 Jenkins

jenkins 建议直接安装在宿主机,不用 docker 方式,因为持续集成需要安装各种我们用到的工具,这些工具可能后面根据需要才安装,重启不能让这些工具丢失。比如编译 java 源码需要装 jdk 环境,编译和上传 docker 镜像需要安装 docker 环境,并且还需要提前 docker login 好,不然上传不了。

因为 jenkins 用 java 写的,所以确保机器上装有 jdk 或 openjdk 环境,准备一个 jenkins 用的目录,下载 war 包

mkdir jenkins 
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

运行

nohup java -jar jenkins.war --httpPort=8080 &> jenkins.log &

查看 jenkins 输出

tail -f jenkins.log

第一次打开 jenkins web 界面,要求输出管理员初始密码,生成在服务器上,界面上提示有路径

查看密码

cat /root/.jenkins/secrets/initialAdminPassword

粘贴密码并继续,安装推荐的插件,等待安装完成

创建管理员,保存并完成

至此,jenkins 安装完成

Jenkins 安装需要的插件

打开 Jenkins-系统设置-管理插件

在可选插件里选择并安装需要的插件:Git 、 GitLab 、Build Authentication Token Root (Git插件在默认推荐插件里已安装,在可选插件列表里可能没有)

点击 “直接安装”,勾选 “安装完成后重启Jenkins(空闲时)“,等待安装完成自动重启 jenkins

由于后面 Jenkins 的机器上需要用到 docker,所以保证 jenkins 所在机器安装好 docker 并 配好 docker hub 的加速器,并且 docker login 登录镜像要上传的仓库。

Gitlab 创建 repo

我们这里就以一个简单的 golang 程序做实例,实现提交代码自动编译代码,然后 docker 编译镜像并上传至 CCR (腾讯云的 docker 镜像仓库)

在 gitlab 上创建空 repo,clone 到本地,添加三个文件

  • main.go (源码)
  package main

  func main() {
  	println("hello world")
  }
  • Dockerfile (编译镜像用的 Dockerfile)
  FROM alpine:latest

  MAINTAINER roc<rockerchen@tencent.com>

  COPY bd-ci-test /bin/bd-ci-test

  CMD ["bd-ci-test"]
  • build (编译源码、镜像和上传镜像的脚本,替换 IMAGE 地址为要上传的地址)
  #! /bin/bash

  # 编译代码
  docker run --rm \
    -v $PWD:/go/src/bd-ci-test \
    -w /go/src/bd-ci-test \
    golang:alpine go build

  IMAGE="imroc/bd-ci-test:latest"

  # 编译镜像
  docker build -t $IMAGE .

  # 上传镜像 (请提前登录好,docker login 只需登录一次)
  docker push $IMAGE

  # 清理
  docker rmi $IMAGE
  rm bd-ci-test

给 build 脚本执行权限

chmod +x build

至此,我们的代码准备好了,先不忙提交,接下来配置 jenkins 来做持续集成

配置 Jenkins

新建 jenkins 项目,选择 “构建一个自由风格的软件项目”

源代码管理选 Git,Repository URL 填写你 gitlab 上源码 repo 的地址,Credentials 是拉取代码时需要用到的身份认证(如果你的repo不是公有的,没有身份认证就会报错)

点击 Add 添加一个, Kind 选择 “Username with password”,输入 gitlab 账号密码

然后 Credentials 选择我们刚刚添加的(检测到账号密码正确就不会报错了),我们准备对 master 分支的代码做持续集成,所以 “Branches to build” 填 “*/master”

构建触发器选择 “Build when a change is pushed to GitLab” (后面的 URL 是我们需要在 gitlab 上配的 webhook 地址),按照下面勾选

点开高级,“Allowd branches” 勾选 “Filter branches by regex”,填写 “master”。点 “Generate” 生成 token,这个 token 用于填写到 gitlab 的 webhook 里,gitlab 检测到代码提交,会通知 webhook 里填写的 Jenkins 生成的回掉 URL,并带上这个 token,防止其它人触发 jenkins 的持续集成

注: 复制出 URL 和 token,我们后面配置 gitlab 的 webhook 会用到

增加构建步骤 “execute shell”

由于我们把持续集成的操作都写到 build 脚本了,所以直接填写执行 ./build 就可以了

最后点击保存,至此,jenkins 的持续集成配置好了,还需要配置 gitlab 的 webhook,用于代码提交通知 jenkins。

配置 Gitlab Webhook

打开 gitlab 的 repo 的 Settings-Integrations

URL 和 Secret Token 填写 jenkins 项目中构建触发器部分生成的,点击 “Add webhook”,搞定!

测试

现在我们可以提交代码测试一下

git add .
git commit -m "test"
git push

我们可以看 jenkins 的输出来看是否触发任务,由于我使用了一些 docker hub 的镜像来编译代码和镜像,如果没有提前 pull 下来,第一次运行任务可能会比较久,等待运行结束,刷新 jenkins 主页

如果运行成功,从 “上次成功” 下拉选择 “控制台输出”

可以看到运行任务过程的输出

如果都没问题,你可以看看你的镜像仓库,镜像已经成功上传,至此,这个简单的持续集成搭建完毕。

附录

Git Submodule

如果你的项目里面还引用了其它项目,也就是 git 的 submodules,怎么办?甚至 submodule 里面还要指定分支呢?

在创建 jenkins 项目的时候,在 源码管理-Git-Additional Behaviours-Add 选择 Advanced sub-modules behaviours

勾选下面两个选项

submodules 的分支靠 git 本来支持的 .gitmodules 文件来控制,用法举例:

git submodule add -b v1 https://github.com/imroc/req.git ref/req

查看 .gitmodules 文件格式:

$ cat .gitmodules
[submodule "ref/req"]
	path = ref/req
	url = https://github.com/imroc/req.git
	branch = v1

可以自己手动编辑或用 git submodule add 命令生成

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2yygiminmy2ok

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Debian社区

Debian Linux下LNMP环境配置

昨天刚给公司服务器装了LNMP服务器环境,在这里简单记录一下过程备忘。这里我在安装的时候是用的Dotdeb源,仅供参考。

873
来自专栏木子昭的博客

本地Mysql数据库快速迁移到服务器

mysq迁移.png 刚接触Django的时候,测试数据存到了mysql,在数据库往线上环境迁移的时候遇到了问题,因为图形化界面Navicat连不上远程的默认...

5468
来自专栏python开发者

Ubuntu部署python3.5的开发和运行环境

Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5....

25410
来自专栏企鹅号快讯

使用Jenkins自动部署博客

这篇文章比较简单,适合初学的读者,本文可以帮助你对基于Jenkins的持续集成有一个比较全局的概念。 提出问题 为了使用HTTPS,我将博客从GitHub Pa...

3535
来自专栏KK的小酒馆

用aliyun的Maven仓库下载Android Studio内依赖包

从GitHub导入新项目时,总是在gradle运行中卡壳,各种依赖包无法从jcenter或者Maven仓库下载下来,公司网也差……一上午就这么废了。 如果你也...

1102
来自专栏乐沙弥的世界

Linux下编译安装Apache httpd 2.4

1202
来自专栏五毛程序员

3行代码快速实现Spring Boot Oauth2服务

3846
来自专栏java一日一条

我是如何统治内网的

工具:bettercap、metasploit、dnsspoof、armitage

1301
来自专栏owent

Linux 编译安装 GCC 4.8

GCC4.8发布啦,这个脚本在之前4.7的基础上做了点改进,移除一些过时的组件,增加了检测不到时自动下载源码包

2212
来自专栏我的博客

Windowsserver2003下搭建IIS+PHP+MySQL+PHPmyadmin

安装IIS在这里不在赘述,重点配置iis解析php和phpmyadmin的配置 去这里http://www.php.net/下载php,我下载的是php-5.2...

3556

扫码关注云+社区

领取腾讯云代金券