#### _介绍:jenkins的Image Tag Parameter插件支持harbor仓库中获取项目的Tag,可惜阿里云容器镜像仓库不支持Docker V2 API,不过阿里云镜像仓库提供自己一套API。_
#### _`解决方案:python Flask封装阿里云的API(阿里云API是通过access_key和access_secret认证授权,REST list Parameter插件目前不支持),jenkins通过REST list Parameter插件获取数据。`_
#### 一、封装阿里云的API
1.1 python安装Flask和阿里云SDK
```bash
pip install flask
pip install aliyun-python-sdk-cr==4.1.2
```
1.2 添加tools.py(封装阿里云的SDK)
```python
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkcr.request.v20181201.ListRepoTagRequest import ListRepoTagRequest
from aliyunsdkcr.request.v20181201.GetRepositoryRequest import GetRepositoryRequest
import json
class ContainerImage:
def __init__(self, access_key, access_secret, instance_id, region_id='cn-shenzhen', accept_format='json', encoding='utf-8'):
self.client = AcsClient(region_id=region_id, credential=AccessKeyCredential(access_key,access_secret))
self.instance_id = instance_id
self.accept_format = accept_format
self.encoding = encoding
def get_repo(self, space_name, repo_name):
request = GetRepositoryRequest()
request.set_accept_format(self.accept_format)
request.set_InstanceId(self.instance_id)
request.set_RepoNamespaceName(space_name)
request.set_RepoName(repo_name)
response = self.client.do_action_with_exception(request)
return json.loads(str(response,encoding=self.encoding))
def list_repo_tag(self, space_name, repo_name):
repo_obj = self.get_repo(space_name, repo_name)
repo_id = repo_obj['RepoId']
request = ListRepoTagRequest()
request.set_accept_format(self.accept_format)
request.set_InstanceId(self.instance_id)
request.set_RepoId(repo_id)
response = self.client.do_action_with_exception(request)
return json.loads(str(response,encoding=self.encoding))
```
1.3 添加Flask的文件app.py
```python
from flask import Flask
from tools import ContainerImage #导入tools中的ContainerImage类
#配置access_key和access_secret
access_key='LTAI5tG3YCyHxxxxxxxxxx'
access_secret='oNBXXKfIxxxxxxxxxxxxxxxxx'
region_id='cn-shenzhen'
instance_id='cri-xxxxxxxxxx'
container_image=ContainerImage(access_key, access_secret, instance_id)
app = Flask(__name__)
#通过url路径获取space_name和repo_name
@app.route('/repo/<space_name>/<repo_name>/tags')
def list_tags(space_name,repo_name):
list_repo_tags=container_image.list_repo_tag(space_name,repo_name)
return list_repo_tags
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
```
1.4 启动Flask
```bash
python app.py
```
1.5 测试结果
```bash
curl http://172.16.100.202:5000/repo/<space_name>/<repo_name>/tags
```
```json
{
"Code": "success",
"Images": [
{
"Digest": "16c579443109881cd3ba264913824cb074d8e977bfd89d5860aaafad0b10194f",
"ImageCreate": 1629278747000,
"ImageId": "f79086b9b1a4532e44b30efbf761fde76792cd61be26e9bf5f19469d1e8e358d",
"ImageSize": 55157349,
"ImageUpdate": 1629278747000,
"Status": "NORMAL",
"Tag": "master-7d9acb6-17"
},
{
"Digest": "d577c281172233318ee4d9394882ae0bb6582bb01efc694654890ebf8118b0cf",
"ImageCreate": 1629272078000,
"ImageId": "8b52daeee868663c3d1fcd49447d17cf8bdd7f9b87ba07904e3a675e008ce90f",
"ImageSize": 55157354,
"ImageUpdate": 1629272078000,
"Status": "NORMAL",
"Tag": "master-7d9acb6-16"
}
],
"IsSuccess": true,
"PageNo": 1,
"PageSize": 30,
"RequestId": "B81C478C-3607-590E-90EC-6C5120446D48",
"TotalCount": 2
}
```
#### 三、jenkins pipeline配置REST list Parameter
```groovy
parameters {
RESTList(
name: 'BUILD_IMAGE_TAG',
description: '',
restEndpoint: 'http://172.16.100.202:5000/repo/<space_name>/<repo_name>/tags',
credentialId: '',
mimeType: 'APPLICATION_JSON',
valueExpression: '$.Images[*].Tag',
cacheTime: 10, // optional
defaultValue: '', // optional
filter: '.*', // optional
valueOrder: 'ASC' // optional
)
}
```