项目进度到了一定程度,手里也没啥事干,就琢磨着把 Jenkins 接入 coding 上面,之前运维同事只在本地搭建了一个 Jenkins 环境,每次都需要手动去点击 build 和 deploy,就很烦。
另外就是不需要暴露公网 IP,沟通中发现一些人对于这块有误区,认为没有公网 IP 就无法通过 WebHook 回调,其实这玩意根本不需要向公网广播,有太多的方法可以让云机器调用内网服务的方法了。
比如去年我在 GitHub 上也接入过本地的构建服务(Github CI/CD + Self Hosted Docker)
接入节点
在项目下的-构建计划-构建节点,点击“接入新节点”
先找运维大哥要了台虚拟机,登录后切换到 root,然后安装 Java 环境:
apt install openjdk-11-jdk
执行命令的过程中因为 python 安装源失败了好几次,换成了阿里云的源:
PYPI_EXTRA_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
换源之后貌似也失败了几次,不太记得过程了,总之最后安装成功了!
成功之后,就可以看到节电池里出现了一个节点:
配置构建计划
创建过程就不赘述了,就是选项目和节点,以及触发规则。
然后就是 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
的环境变量。
就是因为这个凭据问题,失败了好多次,报错就很简单的提示Error cloning remote repo 'origin'
,然后就是fatal: Authentication failed for
,提示非常令人费解,最后翻示例文档才发现环境变量用法用错了。
认证问题解决后,重新执行构建,Git 流程顺利执行通过。
Docker
Docker 安装好,然后登录到 Docker 仓库,这样流水线就可以使用了。
直接使用 Git 提交自动触发,我觉得能一下子成功(自信满满
最后去 Docker 那里验证下:
这里也有了哦 嘿嘿 。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
配置部署计划
Coding 是有“持续部署”的功能的,但是没有权限,让有权限的人进去直接报错,所以就直接在 CI 里面做部署动作了,另外 Coding 的 CI 触发规则比较简单,只有通过代码更新的方式,没办法联动其它的构建计划,那自动化就没办法分到两个构建计划里。
一个只负责手动部署,一个负责自动构建并部署,算是暂时满足了需求。
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 一样的流程,加完认证凭据再加到构建计划的环境变量里。
然后修改我们的 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 插件,但是已经不维护了,目前我接入的这个项目就暂时先用着吧