随笔

Coding 接入自建构建节点

项目进度到了一定程度,手里也没啥事干,就琢磨着把 Jenkins 接入 coding 上面,之前运维同事只在本地搭建了一个 Jenkins 环境,每次都需要手动去点击 build 和 deploy,就很烦。

另外就是不需要暴露公网 IP,沟通中发现一些人对于这块有误区,认为没有公网 IP 就无法通过 WebHook 回调,其实这玩意根本不需要向公网广播,有太多的方法可以让云机器调用内网服务的方法了。

比如去年我在 GitHub 上也接入过本地的构建服务(Github CI/CD + Self Hosted Docker

接入节点

在项目下的-构建计划-构建节点,点击“接入新节点”

1.jpg

先找运维大哥要了台虚拟机,登录后切换到 root,然后安装 Java 环境:

apt install openjdk-11-jdk

执行命令的过程中因为 python 安装源失败了好几次,换成了阿里云的源:

PYPI_EXTRA_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

换源之后貌似也失败了几次,不太记得过程了,总之最后安装成功了!

成功之后,就可以看到节电池里出现了一个节点:

2.jpg

配置构建计划

创建过程就不赘述了,就是选项目和节点,以及触发规则。

3.jpg

然后就是 Jenkins 配置,这里的配置是从运维那边要来的,之前没写过 Jenkins 配置文件:

pipeline {
    agent any
    environment {
        DOCKER_REGISTRY_IP = 'xxx'
        DOCKER_IMAGE_NAME = 'xxx'
    }
    stages {
        stage('git pull'){
            steps {
                git branch: 'master', credentialsId: "${xxxId}", url: 'https://xxx.git'
            }
        }
        stage('Get Commit ID') {
            steps {
                script {
                    env.COMMIT_ID = 'master'
                }
            }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    sh "docker build -t  ${env.DOCKER_REGISTRY_IP}/${env.DOCKER_IMAGE_NAME}:${env.COMMIT_ID}  -f ./Dockerfile ."
                }
            }
        }
        stage('Push Docker Image') {
            steps {
                script {
                    sh "docker push ${env.DOCKER_REGISTRY_IP}/${env.DOCKER_IMAGE_NAME}:${env.COMMIT_ID}"
                }
            }
        }
        stage('Clean Docker Image') {
            steps {
                script {
                    sh 'docker rmi $(docker images -f "dangling=true" -q) || true'
                }
            }
        }
    }
}

Git

脚本很简单,就是简单的拉项目,然后 Docker build & push。

其中需要注意的是${xxxId}这个东西,这个要先去“凭据管理”创建一个凭据,然后在构建计划的“流程环境变量”里增加一个环境变量使用这个凭据,比如上面我创建并使用了一个叫xxxId的环境变量。

4.jpg 5.jpg

就是因为这个凭据问题,失败了好多次,报错就很简单的提示Error cloning remote repo 'origin',然后就是fatal: Authentication failed for,提示非常令人费解,最后翻示例文档才发现环境变量用法用错了。

8.jpg

认证问题解决后,重新执行构建,Git 流程顺利执行通过。

7.jpg

Docker

Docker 安装好,然后登录到 Docker 仓库,这样流水线就可以使用了。

直接使用 Git 提交自动触发,我觉得能一下子成功(自信满满 1.png

4.png

2.png

最后去 Docker 那里验证下:

3.png

这里也有了哦 嘿嘿 。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚

配置部署计划

Coding 是有“持续部署”的功能的,但是没有权限,让有权限的人进去直接报错,所以就直接在 CI 里面做部署动作了,另外 Coding 的 CI 触发规则比较简单,只有通过代码更新的方式,没办法联动其它的构建计划,那自动化就没办法分到两个构建计划里。

config.png

截屏2023-12-06 17.36.14.png

一个只负责手动部署,一个负责自动构建并部署,算是暂时满足了需求。

K8S

因为我们的项目是跑在 K8S 上面的,所以要先安装 kubectl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

安装完再去 Coding 上配置认证凭据,和之前 Git 一样的流程,加完认证凭据再加到构建计划的环境变量里。 截屏2023-12-06 17.18.31.png

然后修改我们的 Jenkins 配置文件,最开始我是用和 docker 一样的方式,在机器上配置好登录信息,然后这里就是死活不通过,一直在访问 localhost:8080,翻文档也没提过这里改怎么用,最后是从某个案例里看到用了 withKubeConfig 才知道有这个东西。

script {
    withKubeConfig([credentialsId: "${k8s}"]) {
        def kubectlCmd = "kubectl get pods -o wide -n xxxx "
        sh(script: kubectlCmd, returnStatus: true)
    }
}

结语

但是这种自动接入部署的 Jenkins 运维没办法统一维护配置,然后手动接入的方式据运维大哥说有个 Coding 的 Jenkins 插件,但是已经不维护了,目前我接入的这个项目就暂时先用着吧

本文链接:https://note.lilonghe.net//post/coding-jie-ru-zi-jian-gou-jian-jie-dian.html

-- EOF --