jenkins、gitlab配置CI/CD

  •  1. 在gitlab中创建好项目(gitlab的安装和基本使用这里不在说明)

 

 

  •     2. 创建jenkins任务

 

    jenkins 需要几个插件请先安装好

      - Git plugin

      - GitLab Plugin

      - Gitlab Hook Plugin

      - Pipeline

      - Docker Pipeline

      - docker-build-step

      - Build Authorization Token Root Plugin

 

 

    jenkins 机器上安装docker,确保 docker 命令可用

 

    由于jenkins有安全限制,需要在全局配置里修改配置

       系统管理 -> 系统设置 -> 去掉 Enable authentication for '/project' end-point

 

    这里创建 流水线风格的任务,pipeline 脚本内容如下:

 
pipeline {
    agent any
    
    stages {
        stage('clone code from gitlab') {
            steps {
                checkout([$class: 'GitSCM',
                    branches: [[name: '*/dev']],
                    doGenerateSubmoduleConfigurations: false,
                    userRemoteConfigs: [[
                        credentialsId: 'gitlab-robot',
                        url: 'ssh://git@192.168.1.11:8222/examples/test-app.git'
                    ]]])
​
            }
        }
        stage('build docker image') {
            steps {
                script{
                    withDockerRegistry(credentialsId: 'docker-hub', url: 'https://index.docker.io/v2/') {
                        def myappImage = docker.build "ninejy/myapp", "-f Dockerfile ." 
                        myappImage.push()
                    }
                }
            }
        }
        stage('deploy') {
            steps {
                sh '''
                    ssh 192.168.1.11 "docker run -d --name myapp-01 -p 8080:8080 ninejy/myapp"
                '''
            }
        }
    }
​
    post {
        always {
            cleanWs()
        }
    }
}

 

    gitlab-robot 是jenkins中配置的credential,是访问gitlab的ssh用户名和私钥。

    docker-hub 也是jenkins中配置的credential,是访问docker官方镜像仓库的用户名密码。

 

  •     3. 配置 webhook

 

    这一步的目的就是让有代码提交到 gitlab 的时候,通过gitlab webhook 触发 jenkins 任务执行。具体配置有两部分。

    (1)jenkins 这边,勾选下图中这个选项。这里不同的 jenkins 版本会有不同,小编使用的 jenkins 是 2.266 版本。不过也都是大同小异,如果这里遇到问题可以留言咨询。

 

 

    (2)gitlab 这边,浏览器打开 gitlab 点开要配置的项目页面,这一步配置要管理员(至少是项目的Maintainer)。左下角有个 Settings 鼠标放上去会出现几个选项

 

    

    点击 Webhooks ,会出现下面页面。填写步骤(1)中勾选那一行URL后面的部分,勾选 Push events 选项,分支填写 dev。这里我们只想代码提交到 dev 分支的时候触发自动构建。其他很多选项,比如: Tag push events 是有 tag 推送到 gitlab 的时候触发webhook。等等吧,功能很强大可以自己具体看一下哪种适合自己的场景。

 

 

    点击下面的 Add webhook 按钮。

 

 

    哎呀,不好!报错了。


    这是因为 gitlab 不允许请求本地网络。这里小编使用内网穿透技术,把jenkins服务端口映射到了阿里云的服务器上。

 

    重新配置步骤(2)。把 URL 中的 IP 和端口 替换为阿里云的 IP 和端口即可。

 

    配置好后下面会出现一条 webhook 记录,如下图。可以点击 test 选择事件类型进行测试,看看有没有触发jenkins任务。这里不再演示。

 

 

   所有配置都已完成。下面提交下代码到dev分支试试看,有没有我们想要的效果。

 

不出意外的话,jenkins任务运行完成后就可以访问应用了(具体的地址看具体的配置,我的是下面的地址)。

http://192.168.1.11:8080/

 

到此整个流程都走通了,后面再有代码提交到dev分支就会自动触发构建,自动部署了。是不是很爽啊。

 

说明:以上例子中docker镜像仓库使用的是官方的仓库,由于网络问题国内拉取、推送镜像比较慢。如果自己有harbor可以换做harbor的地址,也可以申请阿里免费的镜像仓库。

 

整个过程涉及的技术蛮多的,如果实践过程中遇到问题,欢迎留言。

 

最后贴一下项目的代码:

# hello.go

 
package main
​
import (
        "fmt"
        "net/http"
        "os"
)
​
func main() {
        hostname, _ := os.Hostname()
        port := ":8080"
​
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                w.Write([]byte(fmt.Sprintf("Version  --> v3.0\nHostname --> %s\n", hostname)))
        })
        fmt.Printf("Server start on port %s ...\n", port)
        err := http.ListenAndServe(port, nil)
        if err != nil {
            fmt.Println(err)
        }
}

 

# Dockerfile

 
FROM golang:alpine as builder
RUN mkdir /build
ADD hello.go /build/
WORKDIR /build
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o hello .
FROM scratch
COPY --from=builder /build/hello /app/
WORKDIR /app
CMD ["./hello"]

 

 
posted @ 2020-11-16 22:15  运维工作栈  阅读(641)  评论(0)    收藏  举报