使用CodeCommit服务

一、背景

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

在以上命令中,titledescription是友好显示信息可以任意替换,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

全文完。