• 使用Zadig从0到1搭建持续交付平台


    微信公众号:运维开发故事,作者:乔克

    大家好,我是乔克,一个爱折腾的YAML工程师。

    最近有朋友叫我出一个Zadig的使用教程,说实话,我并不知道该怎么来写,因为所有的东西在官网都有,我本人也是通过学习官网来进行落地实践的。

    但是我这人太热情,压不住朋友的再三请求,所以就写一篇我在实际中用到的东西。

    本篇文章大纲如下:图片

    什么是Zadig

    相信有不少朋友已经听过Zadig,但是有更多的朋友还没有听过,或者说听过但是没仔细去了解过,这里我还是简单介绍一下什么是Zadig。

    Zadig是一个持续交付的平台,它集CI、CD、自动化测试于一身,致力于构建一个云原生开源的软件交付平台。

    使用Zadig,可以轻松地实现本地联调、微服务并行构建、集成测试与持续部署,开发可以更专注于业务开发、运维也可以更专注于稳定性维护。

    部署

    说了那么多,下面就进入正题,开始Zadig的使用之旅。

    安装

    其实Zadig的安装参考官方文档的安装篇就行。但是为了保持文章的完整性,我这里简单介绍一下。

    下面是我的环境说明:

    Kubernetes:v1.18.8
    Helm:v3.5.4
    Linux:CentOS 7.9
    PS:我这里是基于现有的Kubernetes,使用Helm进行安装部署。

    安装MySQL

    为什么要安装MySQL呢?

    使用Zadig默认的安装方式,安装的MySQL是8.+版本,而且有时候死活起不来(踩过坑,没找到起不来的原因),所以我不论是在生产使用还是在测试环境测试都是自己安装的MySQL 5.7的版本,当然,你们需要根据自己的实际情况进行选择。

    (1)添加MySQL的Helm repo

    $ helm repo add stable https://charts.helm.sh/stable
    
    
    • 1
    • 2

    (2)下载MySQL chart包到本地(我个人习惯,随君选择)

    $ helm pull stable/mysql --version 1.6.9
    
    
    • 1
    • 2

    (3)自定义value.yaml文件

    mysqlUser: root@'%'
    mysqlPassword: Joker@Zadig123
    persistence:
      enabled: true
      storageClass: "rbd"
      accessMode: ReadWriteOnce
      size: 50Gi
    configurationFiles:
      mysql.cnf: |-
        [mysql]
        default-character-set=utf8
        [mysql.server]
        default-character-set=utf8
        [mysqld_safe]
        default-character-set=utf8
        [client]
        default-character-set=utf8
        [mysqld]
        character_set_server=utf8
        init_connect='SET NAMES utf8'
        max_connections=3000
        slow_query_log=ON
        slow_query_log_file=/tmp/mysql-slow.log
        long_query_time=1
        sql_mode=NO_UNSIGNED_SUBTRACTION,NO_ENGINE_SUBSTITUTION
        lower_case_table_names=1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    (4)安装MySQL

    $ kubectl create ns zadig
    $ helm install mysql -n zadig -f my-vaule.yaml .
    
    
    • 1
    • 2
    • 3

    (5)安装完成过后查看MySQL安装情况

    $ kubectl get all -n zadig | grep mysql
    pod/mysql-6b64454fd9-nhlqd            2/2     Running   1          57d
    service/mysql             LoadBalancer   10.233.7.155    192.168.100.81   3306:32703/TCP,9104:32514/TCP         57d
    deployment.apps/mysql             1/1     1            1           57d
    replicaset.apps/mysql-6b64454fd9             1         1         1       57d
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装Zadig

    上面已经安装好了MySQL,下面就开始安装Zadig(其他的组件就用Zadig自带的,目前使用起来没发现任何问题)。

    (1)添加Zadig Helm Chart

    $ helm repo add koderover-chart https://koderover.tencentcloudcr.com/chartrepo/chart
    
    
    • 1
    • 2

    (2)下载Zadig Chart包 我这里先下载v1.11.0版本,因为后续还准备了一个升级的过程。

    $ helm pull koderover-chart/zadig --version 1.11.0
    
    
    • 1
    • 2

    (3)自定义value.yaml文件,主要是修改mysql的配置

    tags:
      mysql: false
    connections:
      mysql:
        host: mysql:3306
        auth:
          user: root
          password: Joker@Zadig123
    dex:
      config:
        storage:
          type: mysql
          config:
            host: mysql
            port: 3306
            database: dex
            user: root
            password: Joker@Zadig123
            ssl:
              mode: "false"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (4)安装Zadig 官方指出可以使用域名或者IP访问,我这里采用的是域名。

    $ export NAMESPACE=zadig
    $ export DOMAIN=zadig.jokerbai.com
    
    $ helm upgrade --install zadig . -f my-value.yaml --namespace ${NAMESPACE} --version=1.10.0 --set endpoint.FQDN=${DOMAIN}     --set global.extensions.extAuth.extauthzServerRef.namespace=${NAMESPACE}     --set "dex.config.staticClients[0].redirectURIs[0]=http://${DOMAIN}/api/v1/callback,dex.config.staticClients[0].id=zadig,dex.config.staticClients[0].name=zadig,dex.config.staticClients[0].secret=ZXhhbXBsZS1hcHAtc2VjcmV0"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (5)查看安装情况

    $ kubectl get pod -n zadig 
    NAME                              READY   STATUS    RESTARTS   AGE
    aslan-5d6b86ccdf-st7w9            2/2     Running   0          10d
    config-7d6654fb8-xcfmk            1/1     Running   0          10d
    cron-67f77f54bc-fvrgp             2/2     Running   0          10d
    dind-0                            1/1     Running   0          49d
    discovery-68d76c5bf4-nrl5r        1/1     Running   0          57d
    gateway-645958c96c-gnltp          1/1     Running   0          57d
    gateway-proxy-5d6bcc677f-njvdk    1/1     Running   0          57d
    gloo-7955b997b-br9m2              1/1     Running   0          57d
    hub-server-7b5cc9bdb6-t6zkw       1/1     Running   0          10d
    mysql-6b64454fd9-nhlqd            2/2     Running   1          57d
    nsqlookup-0                       1/1     Running   0          57d
    nsqlookup-1                       1/1     Running   0          57d
    nsqlookup-2                       1/1     Running   0          57d
    opa-69d5c669f6-s784f              1/1     Running   0          57d
    picket-55685b94d9-czm7b           1/1     Running   0          10d
    podexec-868c677548-mks74          1/1     Running   0          10d
    policy-5c5bd995c8-pfxnp           1/1     Running   0          10d
    resource-server-c87c4cddd-ptq45   1/1     Running   0          10d
    user-77b5585554-n2cm4             1/1     Running   0          10d
    warpdrive-55c46595d5-hvkc2        2/2     Running   0          10d
    warpdrive-55c46595d5-mn9d8        2/2     Running   0          10d
    zadig-dex-d9df5944f-vgdkc         1/1     Running   0          10d
    zadig-minio-5c576d44c8-rnkmp      1/1     Running   0          57d
    zadig-mongodb-6dfb6f676f-9v5rq    1/1     Running   0          57d
    zadig-portal-69d8f946b8-wqrpz     1/1     Running   0          10d
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    然后可以根据域名http://zadig.jokerbai.com进行访问。图片

    使用账号密码 admin:zadig 进行登录。

    升级

    Zadig是非常活跃的项目,社区迭代是非常快的,而且功能会越来越多,体验越来越好,所以升级Zadig算是一个日常需求了。

    PS:虽然Zadig每个版本的兼容性做的不错,但是在升级的时候不建议跨版本升级。

    (1)下载新版本的zadig

    $ helm pull koderover-chart/zadig --version 1.12.0
    
    
    • 1
    • 2

    (2)自定义value.yaml 获取集群zadig配置信息

    helm get values zadig -n zadig  > zadig.yaml
    
    
    • 1
    • 2

    修改zadig.yaml,添加自定义mysql配置

    USER-SUPPLIED VALUES:
    tags:
      mysql: false
    connections:
      mysql:
        host: mysql:3306
        auth:
          user: root
          password: Joker@Zadig123
    dex:
      config:
        storage:
          type: mysql
          config:
            host: mysql
            port: 3306
            database: dex
            user: root
            password: Joker@Zadig123
            ssl:
              mode: "false"
        staticClients:
        - id: zadig
          name: zadig
          redirectURIs:
          - http://zadig.jokerbai.com/api/v1/callback
          secret: ZXhhbXBsZS1hcHAtc2VjcmV0
    endpoint:
      FQDN: zadig.ustax.tech
    global:
      extensions:
        extAuth:
          extauthzServerRef:
            namespace: zadig
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    (3)备份数据库

    具体信息根据实际情况填写

    1、备份mongo数据库

    $ mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径
    
    
    • 1
    • 2

    2、备份mysql数据库

    $ mysqldump -h <HOST> -P <PORT> -u root -p user > user.sql
    $ mysqldump -h <HOST> -P <PORT> -u root -p dex > dex.sql
    
    
    • 1
    • 2
    • 3

    (4)升级zadig

    $ helm upgrade zadig -n zadig -f zadig.yaml .
    
    
    • 1
    • 2

    升级后,查看Pod是否正常启动,然后使用浏览器登录看是否正常。

    系统集成

    集成的功能很丰富,可以集成代码源、账号系统、Jenkins、Jira等,但是并不是所有的都有用,选择自己需要的集成就行。图片

    我这里也不会把全部的集成都写一遍,那样没有意义,不如直接看官方文档。我只写我用到的系统:代码源和账号系统。

    集成代码源

    代码源的选择非常多,可以使用现成的saas平台,比如gitlab、gitee、github等,这些zadig都支持集成。由于我们公司是使用的自建的gitlab,所以这里只介绍gitlab的集成方法。

    (1)创建OAuth。我这里创建的是组织类型的OAuth,也就是可以有全局的权限。图片

    按图配置,如下:图片

    • 填写应用的名称

    • 回调地址请填写 http://[zadig.yours.com]/api/directory/codehosts/callback

    • 赋予权限 api 、read_user 、read_repository

    • 点击创建

    创建完成之后,记住Application IDSecret

    (2)在zadig上配置Gitlab集成图片填入如下信息:

    • 代码源:此处选择 GitLab

    • 代码源标识:自定义,方便在 Zadig 系统中快速识别出该代码源,该信息在整个系统内唯一

    • GitLab 服务 URL:GitLab 地址

    • Application ID:步骤 3 应用创建成功后返回的 Application ID

    • Secret:步骤 3 应用创建成功后返回的 Secret

    待确认无误后,点击前往授权,会跳到Gitlab进行授权,点击Authorize即可。图片

    到此,Gitlab集成完成。图片

    集成账户系统

    Zadig本身自带账户系统,但是在企业内部一般也会有自己的账户系统,比如LDAP,为了统一管理,这时候就需要集成这些账户系统。

    我这里不是集成的LDAP,而是集成的Gitlab,所以这里只介绍Gitlab的集成方法。

    (1)创建Gitlab OAuth图片填入如下信息:

    • 填写应用的名称

    • 回调地址请填写 http://[zadig.yours.com]/api/directory/codehosts/callback

    • 赋予权限 read_user 、openid

    • 点击创建

    (2)在Zadig账户系统进行集成图片

    Gitlab需要通过自定义的方式进行集成,相关配置需要通过YAML的方式进行自定义,如下:

    baseURL: http://gitlab.jokerbai.com    <Gitlab地址>
    clientID: xxxxx    <Gitlan OAuth的Applicaton ID>
    clientSecret: xxxxx  <Gitlab OAtuth的secret>
    groups:
      - xxxx    <Gitlab组>
    redirectURI: http://zadig.jokerbai.com/dex/callback  <Zadig回调地址>
    useLoginAsID: false
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    自定义账户系统使用Dex实现,所以Gitlab等自定义账户系统的集成,可以参考Dex的文档(https://dexidp.io/docs/connectors/gitlab/)

    信息填写完成过后,点击保存。

    (3)登录验证 退出当前账户,使用Gitlab账户进行登录。

    选择第三方登录,如下:图片

    然后会跳到Gitlab登录界面,填写用户名密码,如果在当前浏览器已经登录了Gitlab,则会直接跳转到授权界面,如下:图片

    点击Authorize过后,会回跳到Zadig用户界面。不过当前用户只是登录到Zadig,并没有任何权限,需要管理授权才能进行其他操作。

    到此集成系统已经完成。

    模板库管理

    Zadig提供模板管理,主要是YAML文件,Helm Chart,Dockerfile以及构建管理,这样提高了复用率,其他需要利用模板的使用直接导入即可。

    我主要用到了Helm Chart和构建管理。

    Helm Chart模板

    Helm Chart的原始代码是保存在Gitlab的,所以在模板库这里只需要从Gitlab导入即可。

    按如下方式导入需要的模板即可。图片

    根据需要添加模板库,比如我这里添加的有java、前端、python、go、php等模板。

    构建模板

    构建模板就是应用构建镜像的模板,有多少种应用,只要能复用,都能做成模板。比如我这里就做了前端,java以及go的模板。

    当然,我的并不代表你能用,只能做参考

    JAVA

    我们java项目全都使用的gradle进行管理的,所以使用maven的就不适合我这套。图片高级配置,定义缓存。图片

    前端

    图片

    image.png

    GO

    图片

    image.png

    是不是很简单?一切都那么简单。

    Dockerfile示例

    从上面可以看到,我们所有的构建里都有Dockerfile,所以都需要自己定制自己的Dockerfile,我这里只是抛几个示例,仅供参考。

    JAVA

    FROM registry.cn-huhehaote.aliyuncs.com/jokerbai/openjdk8-openj9:alpine-slim
    
    ARG NAME=gateway
    ARG VERSION=0.0.1
    
    ENV JVM_OPTS=""
    ENV JVM_ARGS=""
    
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN echo 'http://mirrors.aliyun.com/alpine/v3.11/main' > /etc/apk/repositories; \
        echo 'http://mirrors.aliyun.com/alpine/v3.11/community' >>/etc/apk/repositories; \
        set -eux; \
        apk add --no-cache --update fontconfig ttf-dejavu; \
        apk add --no-cache --update tzdata; \
        ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \
        echo $TZ > /etc/timezone; \
    
    # 添加 Arthas Toolkit
    COPY --from=registry.cn-huhehaote.aliyuncs.com/jokerbai/arthas:latest /opt/arthas /opt/arthas
    # 添加 Skywalking Agent
    COPY --from=registry.cn-huhehaote.aliyuncs.com/jokerbai/skywalking-agent-sidecar:8.1.0-es7 /usr/skywalking/agent /opt/skywalking/agent
    
    
    VOLUME ["/opt"]
    # ADD ${NAME}-bootstrap/build/libs/${NAME}-bootstrap-${VERSION}.jar /opt/app.jar
    ADD build/libs/${NAME}-${VERSION}-SNAPSHOT.jar /opt/app.jar
    ENTRYPOINT ["sh", "-c", "java $JVM_OPTS $JVM_ARGS -jar /opt/app.jar"]
    
    EXPOSE 80
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    GO

    FROM golang:1.17.5 AS build-env
    ENV GOPROXY https://goproxy.cn
    ADD . /go/src/app
    WORKDIR /go/src/app
    RUN go mod tidy
    RUN cd cmd && GOOS=linux GOARCH=amd64 go build -v -o /go/src/app/app-server /go/src/app/cmd/main.go
    
    FROM registry.cn-zhangjiakou.aliyuncs.com/jokerbai/ubuntu:22.04
    ENV TZ=Asia/Shanghai
    COPY --from=build-env /go/src/app/app-server /opt/app-server
    WORKDIR /opt
    EXPOSE 80
    CMD [ "./app-server" ]
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    前端

    FROM nginx:alpine
    ADD nginx.conf /etc/nginx/conf.d/default.conf
    ADD dist/ /usr/share/nginx/html
    
    
    • 1
    • 2
    • 3
    • 4

    PS:我的不一定适合你,谨慎使用。

    服务管理

    该准备的都准备完了,下面就开始真正地创建应用、发布应用以及流水线等管理了。

    (1)首先,需要我们创建项目,如下:图片

    (2)新增服务点击服务--> 从模板库创建图片按着需要填写信息,需要自定义的value.yaml,可以到高级部分定制。

    (3)添加构建 服务已经添加好了,下一步就是为服务添加构建了。图片

    我们选择使用模板进行创建,然后关联到对应的服务和代码即可。

    环境管理

    服务准备好了,构建也添加了,下一步就该把服务部署到对应的环境了。

    Zadig默认会创建DEV和QA环境,并且会生成对应的Namespace,如果是添加已有的Namespace,就需要自己新建环境了。

    添加集群

    云原生是趋势,而以Kubernetes为代表技术的使用也是非常多的。

    我的应用就是部署在各种不同的Kubernetes集群中,所以首先我们要将自己需要的集群添加到Zadig上。

    提示:Zadig所添加的集群要能访问到Zadig。换句话说,如果你Zadig部署在内网,集群在外网,集群访问Zadig无法访问,那你是添加不成功的。也期待Zadig开源社区能提供Agent和Kubeconfig多种集群接入方式。

    选择集群->新建图片

    点击保存过后,会生成对应的Agent接入方式。图片

    复制上面的命令,到对应的集群上执行即可。

    执行完成后,可以在Agent集群,看到对应的Pod是否正常。

    $ kubectl get po -n koderover-agent 
    NAME                                          READY   STATUS    RESTARTS   AGE
    dind-0                                        1/1     Running   0          23d
    koderover-agent-node-agent-54dcb7456d-dz5r9   1/1     Running   0          10d
    resource-server-695d6f9454-nqtbm              1/1     Running   0          10d
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    待所有Pod都正常后,在Zadig上就能看到接入状态了,如下:图片

    添加应用

    环境已经准备好了,下面就来添加应用了。

    找到对应的环境,选择添加服务。图片

    选择需要添加的应用,可以同时选择多个,然后配置value。图片

    配置完成过后,点击确定,就可以再环境中看到对应的应用了。图片

    我这里应用为红色的那个就是刚加入的,因为镜像问题导致应用并没有起来。

    其他功能

    环境管理还有其他功能,比如说重启、查看日志、进入Pod等。

    点击如图部分,就可以进行重启Pod操作。图片

    如果需要进入Pod或者查看日志,就需要先点击对应的应用,进入之后,就可以看到对应的按钮了,如下:图片

    流水线管理

    上面添加了应用,但是应用没有起来,这就需要我们重新走流水线,让应用正常。

    新建工作流

    选择工作流,然后选择新建工作流。图片

    • 填写工作流名称

    • 指定环境,这样工作流就和环境绑定

    • 是否选择并发运行看实际情况

    然后点击保存即可。

    运行流水线

    工作流创建好了过后,接下来就可以直接运行了,不需要再额外的配置流水线步骤。

    进入刚创建的工作流,选择执行,然后选择对应的应用,填写具体的信息,如下:图片

    确定信息无误,就可以启动任务了。图片

    可以看到工作流的步骤只有构建和部署,而且需要这两步骤都OK之后,整个工作流才算完成。

    我们可以点击具体的服务看具体的构建信息,方便排错。图片

    待两个步骤都完成,整个流水线也完成了。图片

    而且可以进环境,看到具体的应用也OK了。图片

    增加消息通知

    有时候点击发布流水线过后,不会一直盯着发布过程,而是会转头去做别的事,比如摸鱼。

    这时候就需要一个流水线消息通知,以便在发布成功或失败都能及时告知我们。

    由于我们公司使用的钉钉作为平时工作交流的平台,所以我这里接入的是钉钉消息通知。

    (1)首先创建钉钉机器人 这其实没什么好说的,需要注意的是在创建的时候需要制定“工作流”关键字,这样才能确保正常收到消息。图片然后找到工作流,进入其中并点击配置。图片

    选择通知–>添加配置图片

    根据需要进行配置,完成过后保存即可。图片

    然后我们再进行构建的时候就能收到消息通知了。图片

    代码扫描

    上面持续交付基本完成,而且也足够用了。不过很多朋友在原有的CICD流程中都有加入代码扫描,Zadig也是集广大群众的爱好,在1.12.0版本中加入了代码扫描。

    不过使用代码扫描,需要自己安装代码扫描工具Sonarqube。

    我这里附一点简单的安装步骤。

    安装Sonarqube

    (1)添加Repo

    $ helm repo add bitnami https://charts.bitnami.com/bitnami
    
    
    • 1
    • 2

    (2)下载sonarqube Helm Chart

    $ helm pull bitnami/sonarqube
    
    
    • 1
    • 2

    (3)安装sonarqube,如果需要PG持久化的,更改value.yaml即可。

    $ helm install sonarqube -n zadig .
    
    
    • 1
    • 2

    检查sonar是否安装成功。

    $ kubectl get all -n zadig | grep sonar
    pod/sonarqube-5c674b5db6-ndvk8        1/1     Running   0          8d
    pod/sonarqube-postgresql-0            1/1     Running   0          10d
    service/sonarqube                 ClusterIP      192.168.71.185    <none>          80/TCP,9001/TCP                       10d
    service/sonarqube-postgresql      ClusterIP      192.168.142.35    <none>          5432/TCP                              10d
    service/sonarqube-postgresql-hl   ClusterIP      None              <none>          5432/TCP                              10d
    deployment.apps/sonarqube         1/1     1            1           10d
    replicaset.apps/sonarqube-5c674b5db6         1         1         1       10d
    statefulset.apps/sonarqube-postgresql   1/1     10d
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    集成sonarqube

    (1)首先在sonarqube上创建Token图片

    直接生成即可,不过要记住Token。

    (2)在Zadig上集成图片

    在Sonar集成栏目填写具体的sonar地址和刚才生成的Token,保存即可。

    进行代码扫描

    进入项目中,选择代码扫描,新增代码扫描。图片

    新增代码和参数配置,如下:图片

    然后点击执行,即可进行代码扫描。图片

    扫描完成过后,就可以在sonarqube上查看扫描结果,进行代码质量管理。图片

    最后

    上面是我现在所使用的Zadig的所有功能,其中还有自动化测试是一个比较不错的功能,但是还需要测试同学配合才能完成最终的轮转,目前还没有这个精力来做这些事情,不过,我们的愿景是希望通过Zadig来完成开发、测试、运维闭环。

    除此之外,Zadig还提供了一些能效面板,方便我们查看和审查。图片

    参考

    • Zadig官方文档:https://docs.koderover.com/zadig

    • Dex官方文档:https://dexidp.io/docs/connectors/gitlab/

    我是 乔克,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!

  • 相关阅读:
    数据结构(1)线性结构——数组、链表、堆栈、队列(介绍和JAVA代码实现)
    mmap内核实现及物理内存组织结构
    未来10年,NAND 与DRAM依然是存储主角
    spring boot酒店会员点餐系统毕业设计源码072005
    Ubuntu16.04编译测试LVI_SAM过程
    SpringBoot学习笔记-创建个人中心页面(上)
    c++:字符:占一个字节空间,对应ASCII码,单引号表示,转义字符反斜杠\
    牛刀小试基本语法,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本语法和变量的使用EP02
    插座为啥左零右火,可不可以反接,会有什么后果?80%电工答不出
    npm、pnpm和yarn【简单了解】
  • 原文地址:https://blog.csdn.net/wanger5354/article/details/125561113