gitlab是一个代码管理项目,使用git作为管理工具。其实gitlab本身就集成了一套CI/CD流程,但是这里选择搭配更为简单的jenkins作为CI/CD。

jenkins是一个支持自动化构建、部署和测试的软件,并且提供了众多的插件。jenkins可以选择多种方式安装,这里选择使用docker。

服务器地址分别为:

gitlab: 192.168.1.0:9080

jenkins: 192.168.1.0:9081

部署机器: 192.168.1.1

安装Jenkins和Gitlab

docker-compose.yml文件为:

version: '2'
services:
  gitlab:
    image: gitlab/gitlab-ce:13.12.10-ce.0
    container_name: gitlab
    ports:
      - "9022:9022"
      - "9080:80"
      - "9023:22"
      - "9443:443"
    volumes:
      - "./gitlab/cfg:/etc/gitlab"
      - "./gitlab/logs:/var/log/gitlab"
      - "./gitlab/data:/var/opt/gitlab"
  jenkins:
    image: jenkins/jenkins
    user: root
    container_name: jenkins
    ports:
      - "9081:8080"
      - "50000:50000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "./jenkins_home:/var/jenkins_home"
      - "/usr/bin/docker:/usr/bin/docker"
      - "/etc/localtime:/etc/localtime"
      - "/root/.ssh:/root/.ssh"   
    environment:
      - JAVA_OPTS=-Duser.timezone=Asia/Shanghai

注:

  1. 因为jenkins的官方docker已经不再维护,所以这里使用的是jenkins的社区版
  2. user: root指定容器以root用户执行指令的权限
  3. /root/.ssh:/root/.ssh 将ssh目录映射到容器,为了让容器能直接使用主机的ssh
  4. 因为编译java需要用到maven,可以选择把主机的maven映射进来( - "/usr/maven:/usr/local/maven"),这里选择在主机里面装一个。

启动创建并启动服务:

$ docker-compose up -d

启动完成后的目录结构为:

├── docker-compose.yml
├── gitlab
│   ├── cfg
│   ├── data
│   └── logs
└── jenkins_home
    ├── config.xml
    ├── copy_reference_file.log
    ├── hudson.model.UpdateCenter.xml
    ├── hudson.plugins.git.GitTool.xml
    ├── identity.key.enc
    ├── jenkins.telemetry.Correlator.xml
    ├── jobs
    ├── logs
    ├── nodeMonitors.xml
    ├── nodes
    ├── plugins
    ├── queue.xml.bak
    ├── secret.key
    ├── secret.key.not-so-secret
    ├── secrets
    ├── updates
    ├── userContent
    ├── users
    ├── war
    └── workflow-libs

配置gitlab

打开gitlab地址,端口为9080,创建新密码并登录进去(用户名为root)

新建一个名为test的项目,并拷贝项目的git地址,例如:git@192.168.1.0:root/test.git

在本地源码目录下,进行git操作,并设置ssh免密推送。

#初始化git仓库
$ git init
# 设置本地邮件与名字,admin@example.com为gitlab中设置的用户的电子邮箱
$ git config --local user.email "admin@example.com"
$ git config --local user.name "root"
# 添加远程仓库地址
$ git remote add origin git@192.168.1.0:root/test.git

因为gitlab的ssh端口不是默认的22,而是我们设置的9023,所以要设置ssh非22端口推送到远程仓库。操作如下:

配置ssh,生成公钥和私钥:

$ ssh-keygen -t rsa -C 'admin@example.com'

window是在 C:\Users\Administrator\.ssh目录下linux是在 ~/.ssh 下。将id_rsa.pub文件的公钥粘贴到gitlab的SSH密钥

Untitled

然后在config文件中,配置地址、用户名跟ssh端口:

Host 192.168.1.0
    HostName 192.168.1.0
    User root
    Port 9023

配置好后,进行推送测试:

$ git push origin master

配置jenkins

网络

因为jenkins的默认网络比较慢,所以在使用之前需要配置网络。编辑jenkins_home/updates下的default.json文件,将 http://www.google.com都替换成 http://www.baidu.com,将 updates.jenkins.io/download替换成 mirrors.tuna.tsinghua.edu.cn/jenkins。然后重启容器。

使用与安装插件

打开jenkins的页面,页面端口为9081。

jenkins已经生成了一个密码,我们只需要把密码贴上去就行

Untitled

不知道安装什么插件的话,选择安装推荐的插件就行

Untitled

等进度条读完,便可以创建一个管理员账号

Untitled

剩下就一直点保存就行,直到成功进入工作台。

Untitled

然后还需要手动安装插件GitlabPublish Over SSHGitlab 用于访问gitlab,Publish Over SSH用于传输文件并执行命令。

配置jdk与maven

在全局工具配置那里

因为docker已经自带了jdk,我们可以直接使用,位置在 /opt/java/openjdk

Untitled

配置maven

因为没有使用主机的maven,所以需要在容器内安装一个maven

Untitled

配置gitlab

这里配置的是对gitlab的访问。

进入系统设置

Connection name:连接名,随便写一个就行

Gitlab host URL:gitlab所在的地址。因为我是把gitlab和jenkins装在同一台主机,所以直接使用容器网络访问

Credentials:访问gitlab的api token,需要去gitlab新增一个,并粘贴到此处。具体位置是在gitlab的项目的设置-项目访问令牌,新建一个即可。

Untitled

然后添加一个Credentials,并在类型那里选择GitLab API token

Untitled

填完后,测试能看到成功了。

Untitled

配置ssh

jenkins需要通过ssh方式连接部署机器

#在jenkins主机上执行
#生成公私匙,需要注意的是新版本的格式 Jenkins 插件不支持,请使用 PEM 这种格式。提示输入密码的话,可以直接直接回车表示为空。
ssh-keygen -t rsa -b 4096 -m PEM

# 将公匙拷贝至部署服务器192.168.1.1 
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.1

#测试
ssh 192.168.1.1

然后再在全局配置的Publish over SSh配置ssh。

Passphrase为上面生成公私钥时输入的密码,因为上面没有输入密码,所以直接为空就行。

Path to key为私钥存放的绝对路径,上面选择了是/root/.ssh/id_rsa.pub,填了这个就不用填下面的Key了。

Key为私钥。

新增一个SSH Servers:

Name随便填就行。

Hostname填部署机器所在地址。

Username为通过ssh登陆部署机器的登录名。

Remote Directory为登陆部署机器后,进入的远程目录。

Untitled

配置项目

配置完系统配置之后,这里开始新建一个maven项目。并进入到项目配置中。

源码管理

这里配置的是对仓库的访问,用于拉取代码,跟上面的不一样。

源码管理选择Git。

Repository URL填写项目的git地址,这里用的是容器网络。

添加一个Credentials。类型选择SSH Username with private key。然后把之前生成的私钥放到当前的Private Key中。

Untitled

把之前生成的公钥放到gitlab的ssh密钥中。

Untitled

选择保存。

构建触发器

选择选择当gitlab有push事件时,通过webhook触发jenkins的自动构建。

Untitled

并点击下面的高级,生成Secret token。

Untitled

然后去到gitlab的webhook,在网址那里填上项目在jenkins的地址,并把Secret token粘贴上去,选择推送事件。保存后可以选择测试。

Untitled

构建后操作

目标是将生成的jar包传输到部署机器上,并重启应用。

所以这里选择Sendfiles or execute commands over SSH。

name为选择服务器。

Source files为项目构建完之后,jar包存放的地方。路径为:项目路径的相对位置。在挂载的jenkins_home下能看到。例如jar所在的完整路径为 /var/jenkins_home/workspace/test/targettest为项目名,则 Source files应该填写 target/*.jar

Remove prefix为去除的路径前缀

Remote directory为jar发送到的服务器位置,为系统配置下ssh配置的Remote Directory的相对路径。例如这里填写/tmp/

Exec command为执行的命令,位置为远程服务器上脚本的绝对位置。

例如脚本test.sh为:

#!/bin/bash
JAR_NAME=test-0.0.1.jar
PROJECT_PATH=/home/test

mv /tmp/$JAR_NAME $PROJECT_PATH/$JAR_NAME
systemctl restart test

Untitled

配置好后,点击保存。

最后,一个自动化构建的流程就已经搭建好了。

参考

Docker 集成 Jenkins Gitlab 实现 CI/CD

docker下jenkins与gitlab构建ci持续集成,踩了各种坑。