Skip to main content

常见问题

什么是持续交付?

持续交付(Continuous delivery,简称CD)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。

持续交付(CD)可以看作持续集成(CI)的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

单元测试,代码编译,构建镜像,集成测试之间是什么关系?

完成整个产品从开发到线上生产环境所要经历的完整环节。

流水线任务 standard_init_linux.go:207:exec user process caused"no such file or directory"

test

可能是由于复制脚本时行尾自动添加了CRLF的^M字符导致无法正确找到#!/bin/sh或者#!/bin/bash导致。

什么是持续集成?

互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。

持续集成指的是,频繁地(一天多次)将代码集成到主干,它的好处主要有两个。

  • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
  • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。

核心措施是,代码集成到主干之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成。

Maven构建任务使用本地Nexus是如何配置?

  • 方案1:pom.xml设置repository信息。
test
  • 方案2:配置多个pom文件,为云平台构建时使用的如上图配置具体nexus repositry url 后mvn命令中指定配置文件构建,如下图所示。
test
  • 方案3:还可以使用系统环境变量传参到pom.xml,具体方法如下。

(1) pom.xml配置url时使用系统环境变量REPO_URL。

(2) Maven构建任务添加系统环境变量,如下图所示。

test

点击环境变量后,弹出系统环境变量设置界面。保存后执行构建任务,会根据系统环境变量值运行构建。

Gogs代码仓库如何支持CI触发

问题:Devops-代码仓库,绑定Gogs的代码仓库,设置CI触发,没有成功。

Delivery:Posthttps://192.168.1.76:443/api/v2/devops/managed-projects/webhooks
/MPID-Sk-fpUFv8: x509: cannot validate certificate for 192.168.1.76 because
it doesn't contain any IP SANs

gogs本身无法发送webhook到非公认https认证服务导致,https://github.com/gogs/gogs /issues/3672

Gogs目前不允许私有证书的insecure设置,需要DevOps的外部地址需要使用http协议。解决方案如下所示。

(1) 按照图中所示的查看对应的参数。

(2) 手动添加对应的参数,如下图所示。

test

(3) 替换协议地址。

https://192.168.1.76:443/api/v2/devops/managed-projects/webhooks/MPID-Sk-fpUFv8 =>https://192.168.1.76:443 替换为 http 协议可访问的地址。

例如:http://192.168.1.76/api/v2/devops/managed-projects/webhooks/MPID-Sk-fpUFv8

(4) 查询对应的 webhook,并修改地址,如下图所示。

test

(5) 修改HTTP地址,如下图所示。

(6) 流水线配置CI触发。

(7) 提交Gogs代码,即可查看流水线被CI触发。

Git Submodule代码源配置说明

  • 使用场景

研发的代码项目中包含子模块(submodule), 作为公用模块 git submodule 模式提高了重用率,降低了维护成本。

在多个项目中被共同使用的模块独立维护为一个项目,只在一个代码源项目中维护,被其他项目中以子模块形式使用。

流水线构建中,拉取代码源时如果代码源中有 git submodule, 则会拉取 submodule 的代码,并进行编译、构建等。

  • 前提条件

GitLab代码源中,需要在代码的根目录中配置 .gitsubmodules 文件,并对子模块进行声明。声明属性如下例所示:#cat .gitsubmodules

[submodule "apm-protocol/apm-network/src/main/proto"]
path = apm-protocol/apm-network/src/main/proto
url = git@gitlab.tenxcloud.com:distributed-tracing/skywalking-data-collect-protocol.git
branch = master

配置文件说明如下所示。

  • Submodule后面引号中使用的为Submodule名称。
  • path:为Submodule的相对路径。
  • url:为submodule 代码源地址。
  • branch:为submodule的代码源分支。如果没有声明,会使用默认分支。

流水线如何编译代码项目

  • Git Submodule为公开代码源时

与没有Git Submodule的代码项目一样,流水线任务的脚本中直接编写编译、构建命令行即可。如下图所示。

test
  • Git Submodule为私有代码源时

执行上面命令时因没有submodule的权限会出现 “The project you were looking for could not be found”的错误提示,需要允许主干代码项目的 deploy key允许下载 Git Submodule的代码,进行如下配置。

(1) 引入 git submodule的代码源也设为私有项目。

test

(2) 平台CI/CD代码仓库激活活引入 git submodule的代码源时以 deploy token方式激活。

test

(3) .gitsubmodules配置文件中的URL修改为SSH形式,即 git@xxxx.com:grou pname/projectname.git形式。

img

(4) git submodule 代码管理员进入 gitlab 页面,将引入 git submodule 项目的 ssh deploy token 设置为允许。

test

最终该项目的 enabled deploy keys中展示对允许的 deploy keys的来源,如下图所示。

test

流水线任务的脚本中直接编写编译、构建命令行即可。

流水线如何配置制品

tip

前提条件

  • 制品必须在/app目录下提取。
  • PAAS全局配置了FTP。
  • (1) 在/app目录下提取。

    test

    (2) 使用存储卷去提取(因为与镜像构建阶段交互需要共享存储)。

    test

    (3) 添加一个挂载设置,选择依赖服务容器,只读权限,挂载路径一致。

    test

    平台对接Jenkins的前提条件是什么

    (1) 安全设置:点击系统管理界面的Configure Global Security。

    a. 访问控制项的安全域设置为Jenkins专有用户数据库。

    b. 授权策略设置为登录用户可以做任何事。

    c. 防止跨站点请求伪造,选中Default Crumb Issuer。

    test

    (1) 系统环境设置静默等待为0(System Configuration),将Jenkins界面/管理Jenkins/系统配置/配置系统,设置静默期为0。

    test

    如何搭建GitLab

    (1) k8s pod方式:GitLab容器正常运行约需3GB内存,推荐运行在PaaS平台(确认集群资源充足)。

    PaaS平台运行配置(集群需配置存储CEPH或NFS或本地存储绑定节点)。

    • 在PaaS平台创建2个存储卷 git-data=1GBgit-conf=512MB
    • 以Gitlab镜像创建应用,配置如下:3072-3072 MB内存,0.2–2CPU,分别关联两个存储卷到 /etc/gitlab/var/opt/gitlab
    test

    新建一个环境变量:键 GITLAB_OMNIBUS_CONFIG,值(一行):external_url 'http://<改为服务出口IP>:19980/'; gitlab_rails['initial_root_password'] = 'tenxcloud'; gitlab_rails['gitlab_shell_ssh_port'] = 19922

    test

    服务出口端口改为指定,内部19980对应外部19980,内部22对应外部19922,并删除443端口。

    test

    (2) docker容器方式

    • 使用 demo-images/gitlab-ce--8.15.3-ce.0.tar.gz,同目录还有11版本镜像,优先使用8.15版本。
    • 在安装有Docker的独立主机,载入镜像。
    • docker load -i gitlab-ce--8.15.3-ce.0.tar.gz
    • 规划GitLab访问HTTP使用19980端口,SSH使用19922端口。
    • 运行主机创建目录 /opt/gitlab,需要修改的加粗显示,启动容器。
    hostip=<所在主机IP>
    docker run -d --restart=always --name=gitlab\
    --hostname $hostip -p 19980:19980 -p 19922:22\
    --env GITLAB_OMNIBUS_CONFIG="external_url 'http://$hostip:19980/'; \
    gitlab_rails['initial_root_password'] = 'tenxcloud'; \
    gitlab_rails['gitlab_shell_ssh_port'] = 19922;" \
    -v /opt/gitlab/config/:/etc/gitlab/ \
    -v /opt/gitlab/logs/:/var/log/gitlab \
    -v /opt/gitlab/data/:/var/opt/gitlab \
    gitlab-ce:8.15.3-ce.0

    GitLab容器启动后,使用用户名 root,密码 tenxcloud,登录 http://<ip>``````:19980/

    (3) 平台应用模板方式部署

    externalUrl: 'http://git.com/'
    httpPort: 80
    httpsPort: 443
    image: 'gitlab/gitlab-ce:10.8.7-ce.0'
    imagePullPolicy: IfNotPresent
    ingress:
    annotations: null
    enabled: false
    tls: null
    url: gitlab.cluster.local
    livenessPort: http
    persistence:
    gitlabData:
    accessMode: ReadWriteOnce
    enabled: true
    size: 10Gi
    storageClass: kingdee-paas
    gitlabEtc:
    accessMode: ReadWriteOnce
    enabled: true
    size: 1Gi
    storageClass: kingdee-paas
    postgresql:
    cpu: 1000m
    image: postgres
    imageTag: '9.6'
    memory: 1Gi
    metrics:
    enabled: false
    image: wrouesnel/postgres_exporter
    imagePullPolicy: IfNotPresent
    imageTag: v0.1.1
    resources:
    requests:
    cpu: 100m
    memory: 256Mi
    networkPolicy:
    allowExternal: true
    enabled: false
    persistence:
    accessMode: ReadWriteOnce
    enabled: true
    size: 10Gi
    storageClass: kingdee-paas
    subPath: postgresql-db
    postgresDatabase: gitlab
    postgresPassword: gitlab
    postgresUser: gitlab
    resources:
    requests:
    cpu: 100m
    memory: 256Mi
    service:
    port: 5432
    type: ClusterIP
    publicChart: true
    readinessPort: http
    redis:
    image: 'bitnami/redis:3.2.9-r2'
    imagePullPolicy: IfNotPresent
    metrics:
    annotations:
    prometheus.io/port: '9121'
    prometheus.io/scrape: 'true'
    enabled: false
    image: oliver006/redis_exporter
    imagePullPolicy: IfNotPresent
    imageTag: v0.11
    persistence:
    accessMode: ReadWriteOnce
    enabled: true
    size: 10Gi
    storageClass: kingdee-paas
    redisPassword: gitlab
    resources:
    requests:
    cpu: 100m
    memory: 1Gi
    usePassword: true
    resources:
    limits:
    cpu: 1
    memory: 2Gi
    requests:
    cpu: 500m
    memory: 1Gi
    serviceType: NodePort
    sshPort: 22

    参考:如何获取不同版本GitLab的token填入到TCE的代码仓库关联。

    • GitLab 8版本:登录后右上角点击账号名,Profile Settings,上方 Account,复制 Private token
    • GitLab 10版本:登录后右上角点击账号名,Settings,左侧 Access Tokens,输入 Names、过期时间 Expires atScopes全选,复制生成的 Personal Access Tokens
    • GitLab 10以上版本:管理员登录后,上方点击扳手图标Adminarea,左侧Settings,右侧找到 Outbound requests,勾选 “Allow requests to the local network from hooks and services”并保存。该选项默认是取消状态,会影响流水线中项目的激活操作。