Cane's Blog

Cane

【Linux】Jenkins + Gogs 自动打包 Docker 镜像

76
2022-11-23

一、Jenkins 安装

docker-compose 安装

version: "3.5"
services:
    jenkins:
        image: jenkins/jenkins:lts
        restart: always
        container_name: jenkins
        networks:
            - nginx
        volumes:
            - /home/jenkins:/var/jenkins_home
            - /var/run/docker.sock:/var/run/docker.sock
            - /usr/bin/docker:/usr/bin/docker
        environment:
            - TZ=Asia/Shanghai
        user: root
networks:
    nginx:
        external: true

二. 常用插件安装

默认插件安装

2023-11-27 15-38-14.png2023-11-27 15-38-19.png

其他常用插件

  1. docker-build-step: docker 打包、发布、运行相关插件

  2. Git Parameter Plug-In:在「参数化构建过程」增加 Git 相关参数

  3. Gogs plugin: GOGS Webhook相关插件(功能不全,更推荐 Generic Webhook Trigger Plugin)

  4. Generic Webhook Trigger Plugin: 通用 Webhook 触发器插件

  5. Qy Wechat Notification Plugin: 企业微信通知插件

  6. Publish over SSH:SSH 发布插件

  7. Maven Integration:Maven构建插件

插件安装方法

  1. 在线插件安装:系统管理 - 插件管理 - 可选插件

    2023-11-27 15-39-55.png

  2. 本地插件安装:系统管理 - 插件管理 - Deploy Plugin

    2023-11-27 15-40-00.png三、配置

  1. 设置使用 Jenkins 宿主机 Docker (如果 jenkins 运行在 docker 中,需要先将宿主机 docker 映射到 jenkins 所在容器)「系统管理 - 系统配置」

    unix:///var/run/docker.sock

    2023-11-27 15-42-09.png2. 不使用宿主机 Docker,则需要在 「系统管理 - 全局工具配置」中安装 Docker 环境,Git 环境一样

    2023-11-27 15-42-14.png

四、凭证

Git 凭证

  1. 进入 jenkins 容器内生成密钥

    docker exec -it jenkins bash
    ssh-keygen -t rsa -C "xxx@xx.com"
  1. 将公钥(id_rsa.pub)上传到 GOGS

  1. 将私钥(id_rsa)添加到 Jenkins (系统管理 - 凭据 - Jekins - 全局凭据 - 添加凭据)

  1. 选择 SSH Username 类型

    2023-11-27 15-44-26.png

帐号密码凭证

同上类型选择「Username with password 」

五、其他

  • 重启 Jenkins

    访问:http://<your host name>.com/restart

六、示例

当 GOGS 仓库 发布新的标签时,重新构建 Docker 镜像

需要插件:Generic Webhook Trigger Plugin、docker-build-step

  1. 选择「新建任务 - 构建一个自由风格的软件项目」

    2023-11-27 15-46-17.png

  2. 通用配置

    如:是否需要保留成功构建,以及需要保留的数量

    2023-11-27 15-46-27.png

  3. 源码管理

    2023-11-27 15-46-33.png

  4. 触发器

    2023-11-27 15-46-41.png2023-11-27 15-50-31.png2023-11-27 15-46-47.png git push origin --tag 时,gogs 的 webhook post 的 data 示例

    {
      "ref": "v1.9.5",
      "ref_type": "tag",
      "sha": "123b861b2d3e76ce3dbd0744eb75f92769b52b21",
      "default_branch": "master",
      "repository": {
        "id": 4,
        "owner": {
          "id": 1,
          "username": "Cane",
          "login": "Cane",
          "full_name": "",
          "email": "caneman@163.com",
          "avatar_url": "https://git.hicane.com/avatars/1"
        },
        "name": "test",
        "full_name": "Cane/test",
        "description": "",
        "private": false,
        "fork": false,
        "parent": null,
        "empty": false,
        "mirror": false,
        "size": 139264,
        "html_url": "https://git.hicane.com/Cane/test",
        "ssh_url": "git@git.hicane.com:Cane/test.git",
        "clone_url": "https://git.hicane.com/Cane/test.git",
        "website": "",
        "stars_count": 0,
        "forks_count": 0,
        "watchers_count": 1,
        "open_issues_count": 0,
        "default_branch": "master",
        "created_at": "2022-11-04T18:16:29+08:00",
        "updated_at": "2022-11-23T16:14:20+08:00"
      },
      "sender": {
        "id": 1,
        "username": "Cane",
        "login": "Cane",
        "full_name": "",
        "email": "caneman@163.com",
        "avatar_url": "https://git.hicane.com/avatars/1"
      }
    }

    gogs 可以在各种事件中触发 webhook(可以在 gogs 仓库的配置页面指定,不同类型的事件,data 的内容不同)。

    我想在上传 tag 的时候才进行指定的构建,普通的 commit push 事件不做任何操作,这个时候,我就需要根据 ref_type 的值来判断是否为 tag 来区分。

    图4-1 把 data 的 ref_type 的值赋给 「var_name」

    图4-3 判断 「var_name」是否等于 「tag」来决定是否触发构建

    图4-2 token 用来标识不同的任务

    GOGS webhook 配置

    2023-11-27 15-52-31.png2023-11-27 15-52-36.png

  5. 构建步骤

    1. 删除已存在的容器和镜像

      2023-11-27 15-52-43.png

    2. 构建新的镜像

      2023-11-27 15-52-49.png

    3. 根据构建的镜像运行新的容器

      2023-11-27 15-52-53.png

根据标签号构建、回滚 Docker 容器

需要插件:Git Parameter Plug-In、docker-build-step

在 「General」里选择「参数化构建过程 - Git参数」

2023-11-27 15-59-23.png在构建的时候就可以根据参数(标签)进行构建、回滚

2023-11-27 15-59-29.pngMaven 项目 示例

2023-11-27 16-00-17.png2023-11-27 16-00-35.png