一、背景
CodeCommit是AWS推出的基于git的代码仓库服务,并可使用AWS IAM进行代码库的权限管理。本文以在宁夏区域创建代码库为例。
二、创建IAM角色
进入IAM界面,点击左侧User
用户,点击右上角Add users
按钮,添加新用户。如下截图。
在添加新用户界面,这里有两个选择:
- 创建一个只能通过AWSCLI和SDK管理CodeCommit服务的用户
- 创建一个可以通过AWS网页控制台访问CodeCommit服务的用户
二者必须二选一。对于普通开发者使用git客户端使用,因为git是使用独立的SSH公钥-私钥做身份验证,与IAM用户的AKSK以及是否能登录AWS控制台无关。因此普通开发者选哪一个都可以。这里选择创建第一种用户,即生成AKSK。安全起见,无需将这个AKSK下发给开发者。也可以在创建后删除掉。
如果是负责代码合并的管理员,需要能执行Pull Request,那么必须通过AWS网页控制台或者AWSCLI来发起。由此就需要上述两个选项二选一。本文选择第一个使用AWSCLI方式。
输入用户名AWS用户dev01
,选择Access Key
允许API程序交互。然后点击下一步。如下截图。
在配置权限界面,点击Attach existing policies directly
直接挂载一个现有策略,然后搜索AWSCodeCommitPowerUser
,并选中之。然后点击下一步。如下截图。
在标签界面,可以略过,也可以设置如下标签。如下截图。
在向导的最后一步,点击创建用户,完成创建。如下截图。
创建完毕保存好密钥。请注意,AKSK密钥只提示仅此一次,务必保存好。
前文提到,如果只是为不需要PR权限的开发开发者创建git服务的权限,开发者会使用独立的SSH证书做身份验证,因此这里可以禁用、或者删除掉刚创建用户说对应的AKSK。点击如下按钮即可删除。如下截图。
三、生成SSH证书
1、生成SSH密钥
在开发机上执行如下命令:
yum install git -y
yum update -y
ssh-keygen -t rsa -b 4096 -f ~/.ssh/codecommit
由此在根目录下的隐藏目录.ssh
目录中,获得新生成的密钥。此处在命令中显式声明的方式指定文件名的原因是,如果本机与Github.com公有云SaaS服务、Gitlab私有云自建git进行同步的话,那么多个证书的名字需要规避冲突。这里是用证书名称区分要连接的服务是比较方便的一种做法。
执行后返回结果如下:
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/codecommit.
Your public key has been saved in /root/.ssh/codecommit.pub.
The key fingerprint is:
SHA256:R+DcuF8l7vph84zc/469F8SpBS1N/WIgGmHK5/EGpB0 root@i-057197a3d106190e5.cn-northwest-1.compute.internal
The key's randomart image is:
+---[RSA 4096]----+
| E. +..|
| . O.=. .o o.|
| + Ooo...= o|
| o.* . oo=.|
| S + o.+. |
| + o . . |
| . = .|
| + B o.|
| ..+ =+O|
+----[SHA256]-----+
接下来执行如下命令可以查看公钥内容:
cat .ssh/codecommit.pub
返回结果如下:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC/XqYiHhvOw361MMAfxJYbhroS/m0dicnxrOk3vlHyCBDzI10Hywvu7ZYcQpOuIiTXX5jQ845rY5AHlV4vDi7ZyUjc22IIy42ZJalP1N4GZnXAKTO7tI3ZYHeyWdf1QV5jPO5KUb3TjMoeBVpUQfceh/ip+vDho6CXNIqCylBo33t5hlBGE3aPeLGoulFY9ihGUh1LTrzxAIh0tthuOJ4dGhioPN//HzrJdybhhF4hVzcO6GWrhrmj3AqHqIFMdF5BL07dsYD7QukAB67kh3f4YbUDYHPezq3AWdrw/kexkluV/x0L+FEpSOIp1Hqavzt8RavIwmpp8eg3jwwoO46yLFHuOTiuVOivKAwrQJtKVOW6bSNbhhFXlfOpU26a7Z8ig7Bi0uX9LVi3d29qQZyBq0mkkQU2999I6La7uFV8KZ5C9xSDYMytzvLVV9W3NNMCECuND9mhST9HGCTZsFjDS22xn7+noAe9mitEp+H9shELH/zHjrVzhu72D18fJ+VTmM60IA7LMIrWPoHiK8KZGC63YLHl2OGZExxqRkWVRd6vPvsYEN4GkTUxxHE0sJAZW0o4ZZ40yFL38yxxbjJZV3b/nOUCndRaA2BcD+LKjWbyeTW+CGNvX3B+wjGtUXt+Nqxsealt7Umzak/ukSo5GbcY6VisFC+wvw3jN5/s5Q== root@i-057197a3d106190e5.cn-northwest-1.compute.internal
2、上传SSH密钥到IAM服务中
进入IAM界面,找到刚才创建的用户,在页面下方找到Upload SSH public key
按钮。如下截图。
粘贴刚才复制下来的公钥,然后点击创建。如下截图。
上传证书完毕后,在界面上可以获得名为SSH Key ID
的字符串,复制下来,下边的步骤将要使用。
3、配置本机的ssh配置文件
编辑配置文件~/.ssh/config
,加入如下内容:
Host git-codecommit.*.amazonaws.com.cn
User APKAWDS54SIWPUCQLWNP
IdentityFile ~/.ssh/codecommit
请替换User
这一串字符为上一步生成的SSH Key ID
,最后一行的密钥的名字,与前边步骤使用ssh-keygen -f
命令创建的密钥名称保持一致。然后保存退出。
然后将文件权限设置为600。
chmod 600 ~/.ssh/config
至此配置SSH完成。
四、创建的CodeCommit代码仓库并使用git客户端登录
1、创建代码仓库
进入CodeCommit服务,点击左侧的Repositories
,点击右上角的创建仓库。如下截图。
输入仓库名称,然后点击创建按钮完成创建。如下截图。
创建成功,点击SSH标签页,点击Linux系统,查看使用说明。
2、登录代码仓库
找到说明中的步骤4的clone仓库的命令,点击右侧的Copy
按钮复制命令。如下截图。
在Linux开发环境上运行如下命令:
git clone ssh://git-codecommit.cn-northwest-1.amazonaws.com.cn/v1/repos/myapp01
即可看到成功登录代码仓库。
Cloning into 'myapp01'...
Warning: Permanently added the RSA host key for IP address '52.82.212.224' to the list of known hosts.
warning: You appear to have cloned an empty repository.
3、提交文件测试
现在向代码仓库中提交一个文件测试。
cd myapp01
vim test.txt
git add test.txt
git commit -m "Initial upload"
git push
Push代码成功。
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 251 bytes | 251.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ssh://git-codecommit.cn-northwest-1.amazonaws.com.cn/v1/repos/myapp01
* [new branch] master -> master
回到AWS控制台的CodeCommit服务界面上,也可以看到代码已经上传。如下截图。
注意:如果此前没有配置过git的用户信息,此时git会自动生成全局配置文件。如果希望编辑开发者信息,可以执行git config --global --edit
命令修改。
4、测试分支和PR(Pull Request)
注意:本命令必须为本开发环境配置正确AWSCLI和IAM User对应的AKSK,可参照本文已开始的部分,为用户生成AKSK。
执行如下命令,创建分支。
git checkout -b branch0913
vim test3.txt
git add test3.txt
git commit -m "New branch 0913"
git push origin branch0913
返回信息如下:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 333 bytes | 333.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ssh://git-codecommit.cn-northwest-1.amazonaws.com.cn/v1/repos/myapp01
* [new branch] branch0913 -> branch0913
由此表示分支创建完成。
接下来发起PR,在配置了AWSCLI的命令行(事先安装好AWSCLI)下执行如下命令:
aws codecommit create-pull-request --title "New branch test" --description "Please review these changes by Tuesday" --client-request-token mytest01 --targets repositoryName=myapp01,sourceReference=branch0913
在以上命令中,title
和description
是友好显示信息可以任意替换,client-request-token
是唯一标识符请自行指定,targets repositoryName
是本代码仓库的名称,sourceReference
是当前的branch。PR默认是向master
分支发起请求。
执行完毕,可看到命令行返回如下信息:
"pullRequest": {
"authorArn": "arn:aws-cn:iam::420029960748:user/dev01",
"description": "Please review these changes by Tuesday",
"title": "New branch test",
"pullRequestTargets": [
{ "repositoryName": "myapp01",
"mergeBase": "e4ce85603be48665ac47f3a2087c7173ebb3fbd4",
"destinationCommit": "e4ce85603be48665ac47f3a2087c7173ebb3fbd4",
"sourceReference": "refs/heads/branch0913",
"sourceCommit": "107c7d2c735f48d4df3017ff0c54eff8a64423a4",
"destinationReference": "refs/heads/master",
"mergeMetadata": {
"isMerged": false
}
}
],
"revisionId": "afb2dd90f90cfdafe66ba14119dde58dd8b62e2345a810bbc4cb7445c9326d98",
"lastActivityDate": 1663068276.705,
"pullRequestId": "1",
"approvalRules": [],
"clientRequestToken": "mytest01",
"pullRequestStatus": "OPEN",
"creationDate": 1663068276.705
}
}
接下来返回AWS控制台,即可看到刚创建的PR。此时开发者即可正常按照Git的开发流程进行审核和Merge操作。如下截图。
注:PR的批准和Merge也可以通过CLI完成,本文此处略过,请参考如下文档。
至此创建CodeCommit代码仓库完成。
五、参考文档
https://docs.amazonaws.cn/en_us/codecommit/latest/userguide/setting-up-ssh-unixes.html
https://docs.amazonaws.cn/codecommit/latest/userguide/how-to-create-pull-request.html
https://docs.amazonaws.cn/codecommit/latest/userguide/how-to-merge-pull-request.html
全文完。