bitfinex

              炼数成金 门户 大数据 运维 查看内容

              手把手教你用 Gitlab 和 Jenkins 构建持续集成环境

              bitfinex www.ymfjz.cn 2020-2-1 10:32| 发布者: 炼数成金_小数| 查看: 33476| 评论: 0|原作者: roc|来自: DevOps时代

              摘要: 最近用到持续集成顺便总结在这里,都是用的最新版。搭建过程中还有一个demo,提交代码到 gitlab 自动触发 jenkins 任务,自动编译代码和 docker 镜像并上传。gitlab 国内安装很麻烦,用官方的源装不了,因为在国外, ...
              最近用到持续集成顺便总结在这里,都是用的版。搭建过程中还有一个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 的地址,也可以替换想要的挂载目录)

              #! /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 建议直接安装在宿主机,不用 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 项目,选择 “构建一个自由风格的软件项目”

              源代码管理选 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://imroc.io/posts/ci-with-gitlab-and-jenkins/ 作者:roc

              声明:文章收集于网络,版权归原作者所有,为传播信息而发,如有侵权,请联系小编删除,谢谢!

              欢迎加入本站公开兴趣群
              软件开发技术群
              兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
              QQ群:26931708

              Hadoop源代码研究群
              兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
              QQ群:288410967 

              相关阅读

              最新评论

              热门频道

              即将开课

               

              GMT+8, 2020-3-18 04:32 , Processed in 0.134928 second(s), 25 queries .

              百度|中国纪委国家监委网站|北京纪检监察网|bitfinex注册 | bitfinex平台 | www.baidu.com-百度百科|

              健康遊戲忠告:抵制不良遊戲拒絕盜版遊戲注意自我保護謹防受騙上當適度遊戲益腦沉迷遊戲傷身合理安排時間享受健康生活

              備案號:皖B2-2334451本站www.ymfjz.cn所有