
# 如何解决使用ServiceStage构建失败的问题？
软件工程构建失败的原因很多，可以按照以下场景排查定位。
#### 构建任务调度到CCE集群的Containerd容器引擎节点后构建报错
**问题描述**
构建失败，构建日志显示如下错误提示信息中的一种：
- /proc/sys/user/max_user_namespaces needs to be set to non-zero.
- /proc/sys/user/max_user_namespaces=100 may be low. Consider setting to \>= 1024.
**原因分析**
由于构建任务被调度到了CCE集群的Containerd容器引擎节点，需要使用rootless来保证构建的安全性。在此过程中需要创建namespaces，节点虚机的相应设置需要能够满足构建要求，而部分虚机镜像的max_user_namespaces默认设置为0或过小，导致构建失败报错。
**解决方法**
1. 使用root用户登录执行构建任务的CCE集群下的所有Containerd容器引擎节点。
2. 执行如下命令将虚机镜像的max_user_namespaces默认设置为1024并确认。 
   ```
   echo 1024 > /proc/sys/user/max_user_namespaces
   cat /proc/sys/user/max_user_namespaces
   ```
   
   
3. 重新启动构建任务，请参考[启动构建任务](https://support.huaweicloud.com/usermanual-servicestage/servicestage_03_0114.html)。
   
   - 构建成功，操作结束。
   
   - 构建失败，请联系技术支持工程师协助处理。
   
   
   
   
 
#### CCE集群节点配置污点和容忍策略后构建报错
**问题描述**
构建失败，构建日志显示如下错误提示信息：
```
0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/route-unschedulable: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
```
**原因分析**
由于构建任务被调度到了CCE集群的受限调度节点上，该节点进行了污点管理配置（如报错信息中显示的node.kubernetes.io/route-unschedulable）。污点能够使节点排斥某些特定的Pod，从而避免Pod调度到该节点上，同时该CCE集群中没有其他节点可供调度，导致构建失败报错。
**解决方法**
请参考[管理节点污点（Taint）](https://support.huaweicloud.com/usermanual-cce/cce_10_0352.html)，去除受限调度节点上的污点，保证CCE集群下至少有一个节点可供调度。
#### 出现拉取不到代码的场景
如下图所示：
![](https://support.huaweicloud.com/servicestage_faq/zh-cn_image_0000002197109528.png "点击放大")
一般原因可能有三种。
- 如果是在自己的节点上构建应用，可能是该节点没有绑定弹性ip，如上图所示"192.168.x.x"的节点没有绑定弹性ip，解决方法：去该节点[绑定弹性IP](https://support.huaweicloud.com/usermanual-eip/eip_0009.html)。
- 授权信息过期，代码源的私人令牌权限范围不够，或者授权信息已被移除等，例如：CodeArts的代码源，拉取不到代码，可能是创建授权的时候，用户名对应的密码输错了，导致拉取不到代码。解决方法：[重新授权](https://support.huaweicloud.com/usermanual-servicestage/servicestage_03_0076.html)即可。
- 自己搭建的代码源仓库，和构建的节点网络不通，例如：在集群A的某一个节点上搭建了一个私有的bitbucket，使用集群B构建，但是集群B和集群A不是同一个vpc，内网不通，导致构建拉取不到代码。解决方法：打通网络。
 
#### 构建的代码依赖自己的私有maven仓库
有以下两种解决方案。
- 在自己的项目的根目录下增加settings.xml文件，在settings.xml指定自己的私有maven仓库地址（如果自己的私有maven仓库是需要认证的，则需要在settings.xml配置上自己的认证信息，用户名密码等）。
- 在自己项目的pom.xml文件中，指定自己的私有maven仓库。
settings.xml和pom.xml所在路径示例如下。
![](https://support.huaweicloud.com/servicestage_faq/zh-cn_image_0000002232235205.png "点击放大")
#### 基于源码构建Dockerfile设置错误
如何写Dockerfile，可以参考[官网](https://docs.docker.com/v17.09/engine/reference/builder/)，也可以参照ServiceStage[模板生成的demo](https://github.com/servicestage-template)。
![](https://support.huaweicloud.com/servicestage_faq/zh-cn_image_0000002232389677.png "点击放大")
#### 项目代码依赖CSE的SDK和搭建在CodeArts上的私有maven仓库
解决方法如下：
1. 在自己项目根目录下增加一个"settings.xml"文件。
2. 登录CodeArts的私有依赖库，在左侧仓库列表选择指定的maven私有依赖库。
3. 在右上角单击![](https://support.huaweicloud.com/servicestage_faq/zh-cn_image_0000002232235217.png)，在弹出菜单选择"配置指导"。
4. 单击"下载配置文件"，下载"settings.xml"文件。
5. 按照如下方法修改下载的"settings.xml"文件： 
   1. 在\<mirrorOf\>中增加一个!HuaweiCloudSDK。
      ```
      <mirror>
           <id>z_mirrors</id>
           <mirrorOf>*,!releases,!snapshots,!HuaweiCloudSDK</mirrorOf>
           <url>https://repo.huaweicloud.com/repository/maven</url>
      </mirror>
      ```
      
   
   2. \<profiles\>的\<repositories\>下面增加一个maven仓库。
      ```
      <repository>
            <id>HuaweiCloudSDK</id>
            <url>https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/</url>
            <releases>
        <enabled>true</enabled>
            </releases>
            <snapshots>
        <enabled>true</enabled>
            </snapshots>
      </repository>
      ```
      
   
   
   
   
6. 将修改好的"settings.xml"放在自己项目的根目录后，进行构建即可。
 
#### 创建软件包构建工程时自定义Dockerfile
选择软件包后，后台会自动上传到镜像的当前工作目录。Dockerfile的示例如下图所示：
![](https://support.huaweicloud.com/servicestage_faq/zh-cn_image_0000002197109508.png "点击放大")
