OCI非常强的优势其中之一是它的开放性:对开发人员的开放性并允许他们使用和拥抱完全不同的软件和解决方案堆栈。
举个例子:在目前多云架构的前提下,很多企业为了保证自己的代码的安全,IT系统采用开源软件构建自己的容器镜像构建流水线,而影响构建完毕后,需要使用本地的自动化流水线继续将镜像远程推送至云中的镜像仓库。下面,我们将展示如何使用Oracle Linux在OCI上部署Jenkins以构建容器并推送到OCIR(OCI Registry)。
从整体上看,实现的流程如下:

1. 开发人员将代码推送到 git 存储库(在本例中为 GitHub,实际中可以在OP环境中的内部代码仓库)
2. Jenkins 检测到推送并开始新构建
3. 构建成功后,Jenkins 将新的容器镜像推送到OCI的OCIR
我们将首先在私有子网中的计算实例上安装 Jenkins。创建没有安全列表的私有子网,并分别创建具有以下出口和入口规则的 NSG:

接下来,通过选择 Oracle Linux 8 创建您的实例。
确保选择正确的子网和 NSG。
记下私有 IP 地址,您可以使用堡垒主机 ssh 到它:
ssh -i ~/.ssh/id_rsa -J opc@11.22.33.44 opc@10.0.3.14
接下来,配置firewalld:
sudo firewall-cmd --permanent --add-service=jenkins
sudo firewall-cmd --reload
请注意,您还可以使用Terraform和cloud init自动执行此操作。
在这种情况下,您需要运行“firewall-offline-cmd”而不使用“permanent”选项:
# 配置firewalld服务使用 cloud-init
firewall-offline-cmd --add-service=jenkins
接下来,安装JDK
sudo dnf install -y java-11-openjdk.x86_64
检查 Java 是否在您系统环境路径中:
$ java -versionopenjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
安装 Jenkins 和 git:
sudo wget -O etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat/jenkins.repo
sudo dnf config-manager --enable jenkins --enable ol8_developer_EPEL
sudo rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
sudo dnf install -y jenkins git
sudo systemctl enable jenkins & sudo systemctl start jenkins
由于要构建容器,还需要安装必要的工具和守护进程。
在Oracle Linux 7 上,需要安装docker-engine,建议您使用install podman和相关实用程序:
sudo dnf module install -y container-tools:ol8
同时也会安装buildah和skopeo。
这为开发人员省去了很多必须重写构建脚本的麻烦。
podman-docker工具包为podman提供了docker别名,并省去了您必须更改脚本或重新连接您的Docker内存所在麻烦。
sudo dnf install -y podman-docker
现在,我们可以测试它:
dockerEmulate Docker CLI using podman. Create etc/containers/nodocker to quiet msg.
Error: missing command 'podman COMMAND'
Try 'podman --help' for more information.
同样,搜索镜像:
docker search ubuntuEmulate Docker CLI using podman. Create etc/containers/nodocker to quiet msg.
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/ubuntu Ubuntu is a Debian-based Linux operating sys... 13130 [OK]
配置Jenkins,安装插件等。
并运行如下命令启动一个新的终端会话到Jenkins以建立一个隧道:
ssh -L 8080:localhost:8080 -i ~/.ssh/id_rsa -J opc@11.22.33.44 opc@10.0.3.14
使用http://localhost:8080访问Jenkins。
系统会要求您提供初始管理员密码:

查看初始管理员密码
sudo cat var/lib/jenkins/secrets/initialAdminPassword
复制并粘贴密码,然后单击“继续”按钮。
接下来将要求您安装建议的插件:

继续安装建议的插件:

选择“Skip and continue as admin”,然后在实例配置页面保存并完成。
接下来,我们需要安装一些 Jenkins 插件:
单击“Manage Jenkins”>“Manage Plugins”> Available
使用搜索栏搜索“Docker”、“Docker Pipeline”、“GitHub Authentication”和“Blue Ocean Aggregator”插件
找到插件并选择
点击“Install without restart”
由于 Jenkins 将以“jenkins”用户身份运行,我们需要确保 podman 可以在rootless模式运行:
sudo echo jenkins:10000:65536 >> etc/subuid
sudo echo jenkins:10000:65536 >> etc/subgid
首先,需要在 OCI 中做两件事:
1. 创建身份验证令牌(Auth Token)以登录
2. 获取租户命名空间(tenancy namespace)
步骤如下:
登录 OCI 控制台并单击“profile”图标 > “User Setting”
点击“Auth Tokens”
点击“Generate Token”
单击“Copy”
再次点击“Profile”图标 > “Tenancy”
找到“Object Storage Namespace”并记下它的值。
现在可以为 OCIR 创建凭据:
单击“Manage Jenkins”>“Manage Credentials”
单击“Jenkins”>“Global credentials”>“Add Credentials”
选择“Username with password”
选择“Global……
如果您使用的是本地 OCI 用户,则用户名将为 <tenancy-namespace>/<username>
如果您使用的是 IDCS 用户,则用户名将为 <tenancy-namespace>/oracleidentitycloudservice/<username>
密码是刚才在创建 Auth Token 时获得的值
输入“OCIR”作为 ID
请注意,在实际环境建议:
创建一个专门的 Jenkins 用户
将 Jenkins 用户添加到组
创建一个策略,为组提供必要且有限的权限,使其能够将镜像推送到 OCIR。
接下来,需要在 OCIR 中创建一个存储库。
假设为 Acme Corp(举例) 提供了以下 2 个存储库:
tenancy_namespace/website:1.0
tenancy_namespace/acme/blog:1.0
第一个存储库是“网站”,而第二个存储库是“acme/blog”。换句话说,存储库包含镜像的名称。其次,每个区域都有自己的 URI。它通常是添加到 ocir.io的地区的 IATA 代码,如伦敦是 lon.ocir.io,悉尼是 syd.ocir.io,圣何塞是 sjc.ocir.io 等等。
下面为 acmewebsite 创建一个。

最后一件事是在Jenkins中创建一个自动化流水线。将 Jenkins 指向 GitHub 存储库并执行一系列步骤,这些步骤将构建容器映像并将其推送到我们之前创建的存储库。
点击“New Item”
输入名称,例如“acmewebsite”
检查GitHub项目并输入url:https : github.com/hyder/acmewebsite
对于pipeline,选择pipeline script并输入以下内容:
pipeline {
environment {
registry = "region_code.ocir.io/namespace/acmewebsite"
registryCredential = 'ocir'
dockerImage = ''
}
agent any
stages {
stage('SCM Checkout') {
steps {
git branch: 'master', url: 'https://github.com/hyder/acmewebsite.git'
}
}
stage('Building image') {
steps{
script {
dockerImage = docker.build(registry + ":${BUILD_NUMBER}")
}
}
}
stage('Push to OCIR') {
steps {
script {
docker.withRegistry( 'https://region_code.ocir.io', registryCredential ) {
dockerImage.push()
}
}
}
}
stage('Cleanup') {
steps{
sh "docker rmi $registry:$BUILD_NUMBER"
}
}
}
}
请注意,这里没有配置完整的pipeline(目前只演示 Jenkins 构建一个容器镜像并将其推送到 OCIR),后面可以继续加入部署镜像至OKE集群等应用部署相关操作,因此部分比较通用,所以不在此文中展示。
保存并单击立即构建。

打开Blue Ocean视图:

完成后点击 OCI Console > Developer Services > Container Registry。
现在应该能够在 OCIR 中看到容器镜像:

在上面的示例中,我们使用了Inline Pipeline Script。您还可以将Pipeline存储在Jenkinsfile中,并在存储在代码库中(但为了安全起见,请必须确保租户命名空间和凭据等敏感变量不会与代码一起上传至代码库)。

作者简介
巨晓兵,甲骨文云平台资深技术顾问,拥有 10 年以上 IT 相关工作经验。目前主要负责甲骨文云平台产品在解决方案中的设计和实施。在加入甲骨文公司前,主要供职于 亚信,Gemalto,负责产品研发和项目实施等工作。具有多年系统架构设计经验,熟悉架构设计的理念与设计方法,且具有多年IOT系统工作经验。您可以通过xiaobing.ju@oracle.com与他联系。




