リモートブランチをマージ時に自動削除する

 
カテゴリー Git   タグ

リモートブランチを自動削除する設定

GitHubのリポジトリのSettigs -> Options -> Merge buttonにあるAutomatically delete head branchesを有効化する。

GitHub delete branch with pull request width=640

GitHub delete branch with pull request width=640

Pull Requestをマージする

プルリクエストを作成し、マージすると・・・deleted the issue8 branchとなっている。

GitHub delete branch with pull request width=640

マージされたあとの状態

ローカルは自動に削除されないが、リモートは削除された状態のはず。
ブランチの状態を確認する・・・リモートも消えていない?

1
2
3
4
5
6
PS > git branch --merged 
* issue8
master
PS > git branch --remote --merged
origin/issue8
origin/master

ローカルブランチを削除

ローカルは自動では消えないので削除する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PS > git branch -d issue8
error: Cannot delete branch 'issue8' checked out at 'XXXXXXXXXXXXXXXXX'
PS > git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS > git pull
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
xxxxx..xxxxx master -> origin/master
Updating xxxxx..xxxxx
Fast-forward
src/XXXXXXXXXXXXXXX | 16 ++++++++++++++--
src/XXXXXXXXXXXXXXX | 2 +-
2 files changed, 15 insertions(+), 3 deletions(-)

リモートブランチを削除・・・エラー

リモートブランチを削除するとエラー。

1
2
3
4
5
6
7
8
PS > git branch --remote --merge
origin/issue8
origin/master
PS > git branch -d issue8
Deleted branch issue8 (was ccb846c).
PS > git push --delete origin issue8
error: unable to delete 'issue8': remote ref does not exist
error: failed to push some refs to 'xxxxxxxxxxxxxx/xxxxxxxxxxxxxx'

消えている。ローカルのゴミが残っているだけだ。
git remote prune originで削除できる。
git fetch --pruneでも。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS > git branch --remote --merge
origin/issue8
origin/master
PS > git branch --remote
origin/issue8
origin/master
PS > git remote show origin
* remote origin
Fetch URL: XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
Push URL: XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/issue8 stale (use 'git remote prune' to remove)
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
PS > git remote prune origin
Pruning origin
URL: XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
* [pruned] origin/issue8
PS > git branch --remote --merge
origin/master

自動的に消すには

git config --global fetch.prune trueでfetch時に自動削除できる。

設定しているとgit pullなどのfetchを含む処理で消える。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PS > git branch -r
origin/issue11
origin/master
PS > git pull
From XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
- [deleted] (none) -> origin/issue11
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From XXXXXXXXXXXXXXX:XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX
xxxxx..xxxxx master -> origin/master
Updating xxxxx..xxxxx
Fast-forward
src/XXXXXXXXXXXXXXX | 16 ++++++++++++++--
src/XXXXXXXXXXXXXXX | 2 +-
2 files changed, 15 insertions(+), 3 deletions(-)
PS > git branch -r
origin/master

コメント・シェア

IssueベースのBranchを作ってPull Requestを送る

 
カテゴリー Git   タグ

Issueブランチを作る

Iissue #6用のブランチを作成する。

1
2
3
4
5
6
7
8
9
10
11
12
PS > git branch issue6
PS > git branch
issue6
* master
PS > git checkout issue6
Switched to branch 'issue6'
PS > git branch
* issue6
master
PS > git status
On branch issue6
nothing to commit, working tree clean

コード変更とCommit

必要コードを修正し、Commit/Pushまで行う。

GitHub画面でPull Requestを送る

Pull Requestのタブを開くとCompare & pull requestボタンが出現しているので押す。

GitHub pull request width=640

ここでPull RequestがマージされたらIssueもクローズするようにCloses #6を設定。

GitHub pull request width=640

Pull Requestをマージする

Pull Requestが送られたら権限を持つユーザでマージする。

GitHub pull request width=640

GitHub pull request width=640

GitHub pull request width=640

Issue #6は自動でクローズされる。

マージ済のIssueブランチを削除する

ローカルブランチを削除する

1
2
PS > git branch -d issue6
error: Cannot delete branch 'issue6' checked out at 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

そのままでは削除できない。masterに切り替えて、マージされた内容をローカルに反映。
マージされたブランチはgit branch --mergeで確認できる。

  • git branch –merged
  • git checkout master
  • git pull
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS > git branch --merged 
* issue6
master
PS > git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS > git pull
remote: Enumerating objects: 1, done.
...略...
Fast-forward
xxxxxxxxxxxx/xxxxxxxxx/Makefile | 16 +++++
xxxxxxxxxxxx/xxxxxxxxx/requirements.txt | 1 +
9 files changed, 191 insertions(+)
create mode 100644 xxxxxxxxxxxx/xxxxxxxxx/Makefile
create mode 100644 xxxxxxxxxxxx/xxxxxxxxx/requirements.txt

ブランチを削除する

  • git branch -d issue6
1
2
PS > git branch -d issue6
Deleted branch issue6 (was 4676e7e).

リモートブランチを削除する

ローカルが消えてもリモートは消えていない。
マージ済のリモートブランチはgit branch --remote --mergedで確認。

  • git branch –remote –merged
  • git push –delete origin issue6
1
2
3
4
5
6
7
8
PS > git branch --merged
* master
PS > git branch --remote --merged
origin/issue6
origin/master
PS > git push --delete origin issue6
To github-genba-neko:genba-neko/scrapy_smbcnikko
- [deleted] issue6

コメント・シェア

CloudFormationでこんなエラーがでたときに

1
An error occurred (InsufficientCapabilitiesException) when calling the CreateStack operation: Requires capabilities : [CAPABILITY_NAMED_IAM]

CAPABILITY_NAMED_IAMとは

CAPABILITY_IAM and CAPABILITY_NAMED_IAM

Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stacks, you must explicitly acknowledge this by specifying one of these capabilities.

The following IAM resources require you to specify either the CAPABILITY_IAM or CAPABILITY_NAMED_IAM

・If you have IAM resources, you can specify either capability.

・If you have IAM resources with custom names, you must specify CAPABILITY_NAMED_IAM.

・If you don’t specify either of these capabilities, AWS CloudFormation returns an InsufficientCapabilities error.

CloudFormationがスタックを作成するために、特定の機能が含まれていることを明示的に示す必要がある。

  • IAMリソースがある場合は、CAPABILITY_IAMCAPABILITY_NAMED_IAMが必要になる
  • カスタム名のIAMリソースがある場合はCAPABILITY_NAMED_IAMを指定する
  • 指定がないとAWSCloudFormationはInsufficientCapabilitiesエラーを返す

CloudformationでCAPABILITIESを指定する

--capabilitiesで指定するだけ。

1
$ aws cloudformation create-stack --stack-name $(STACK_NAME) --template-body $(TEMPLATE_FILE) --parameters $(PARAMETERS_FILE) --capabilities CAPABILITY_NAMED_IAM

カスタム名のIAMリソースがあるのに、CAPABILITY_NAMED_IAMがない場合

1
2
3
$ aws cloudformation create-stack --stack-name smbcnikko-iam --template-body "file://./iam.yml" --parameters "file://./parameters.json" --capabilities CAPABILITY_IAM

An error occurred (InsufficientCapabilitiesException) when calling the CreateStack operation: Requires capabilities : [CAPABILITY_NAMED_IAM]

コメント・シェア

ポリシーを定義する

Inline Policy (AWS::IAM::Policy)

設定した対象のみに適用。User, Group, Roleに対して設定することができる。
複数のGroupに同じ内容をコピペが必要など面倒だった。

Managed Policy (AWS::IAM::ManagedPolicy)

複数に適用できる。独立したポリシーとして定義して参照することができる。
AWS既定のAWS Managed Policy、ユーザによって作成可能なCustomer Managed Policyがある。

Customer Managed Policyを定義する

たとえばDynamoDBの特定のテーブル(mytable************)をRead、Write可能とするポリシーの例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Resources:
MyGroupPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "can read mytable only"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: "AllowReadDynamoDBMyTables"
Effect: "Allow"
Action:
- "dynamodb:DescribeTable"
# Read
- "dynamodb:BatchGet*"
- "dynamodb:Get*"
- "dynamodb:Query"
- "dynamodb:Scan"
# Write
- "dynamodb:BatchWrite*"
- "dynamodb:Update*"
- "dynamodb:PutItem"
- "dynamodb:Delete*"
Resource:
- !Sub arn:aws:dynamodb:*:*:table/${TableName}*
- !Sub arn:aws:dynamodb:*:*:table/${TableName}*/index/*

ポリシーを適用したIAMユーザを作成する

グループを定義してポリシーをアタッチする

1
2
3
4
5
6
MyIamGroup:
Type: AWS::IAM::Group
Properties:
GroupName: !Ref MyIamGroupName
ManagedPolicyArns:
- !Ref MyGroupPolicy

ユーザを定義してポリシーをアタッチする

1
2
3
4
5
6
7
8
Resources:
MyIamUser:
Type: AWS::IAM::User
Properties:
Groups:
- !Ref MyIamGroup
UserName:
!Ref MyIamUserName

アクセスキーを作る

1
2
3
4
5
Resources:
MyIamAccessKey:
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref MyIamUser

作成したアクセスキーのSecretは!GetAtt MyIamAccessKey.SecretAccessKeyで参照できる。

上記を統合したCloudFormation定義

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
AWSTemplateFormatVersion: "2010-09-09"
Description: "Read Only Users for DynamoDB MyTables"

Metadata:
# ------------------------------------------------------------ #
# Input Parameters
# ------------------------------------------------------------ #
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "mytable"
Parameters:
- TableName
- Label:
default: "mygroup"
Parameters:
- MyIamGroupName
- Label:
default: "myuser"
Parameters:
- MyIamUserName

ParameterLabels:
TableName:
default: "mytable"
MyIamGroupName:
default: "mygroup"
MyIamUserName:
default: "myuser"

Parameters:
TableName:
Type: String
MyIamGroupName:
Type: String
MyIamUserName:
Type: String

Resources:
# ------------------------------------------------------------ #
# ManagedPolicy
# ------------------------------------------------------------ #
MyGroupPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "can read mytable only"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: "AllowReadDynamoDBMyTables"
Effect: "Allow"
Action:
- "dynamodb:DescribeTable"
# Read
- "dynamodb:BatchGet*"
- "dynamodb:Get*"
- "dynamodb:Query"
- "dynamodb:Scan"
# Write
- "dynamodb:BatchWrite*"
- "dynamodb:Update*"
- "dynamodb:PutItem"
- "dynamodb:Delete*"
Resource:
- !Sub arn:aws:dynamodb:*:*:table/${TableName}*
- !Sub arn:aws:dynamodb:*:*:table/${TableName}*/index/*

# ------------------------------------------------------------ #
# Group
# ------------------------------------------------------------ #
MyIamGroup:
Type: AWS::IAM::Group
Properties:
GroupName: !Ref MyIamGroupName
ManagedPolicyArns:
- !Ref MyGroupPolicy

# ------------------------------------------------------------ #
# User
# ------------------------------------------------------------ #
MyIamUser:
Type: AWS::IAM::User
Properties:
Groups:
- !Ref MyIamGroup
UserName:
!Ref MyIamUserName

# ------------------------------------------------------------ #
# AccessKey
# ------------------------------------------------------------ #
MyIamAccessKey:
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref MyIamUser

# ------------------------------------------------------------ #
# Output Parameters
# ------------------------------------------------------------ #
Outputs:
CreatedKey:
Value: !Ref MyIamAccessKey
CreatedSecret:
Value: !GetAtt MyIamAccessKey.SecretAccessKey
CreatedUser:
Value: !Ref MyIamUser
CreatedGroup:
Value: !Ref MyIamGroup
CreatedManagedPolicy:
Value: !Ref MyGroupPolicy

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListAndDescribe",
"Effect": "Allow",
"Action": [
"dynamodb:List*",
"dynamodb:DescribeReservedCapacity*",
"dynamodb:DescribeLimits",
"dynamodb:DescribeTimeToLive"
],
"Resource": "*"
},
{
"Sid": "SpecificTable",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGet*",
"dynamodb:DescribeStream",
"dynamodb:DescribeTable",
"dynamodb:Get*",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:BatchWrite*",
"dynamodb:CreateTable",
"dynamodb:Delete*",
"dynamodb:Update*",
"dynamodb:PutItem"
],
"Resource": "arn:aws:dynamodb:*:*:table/MyTable"
}
]
}

コメント・シェア

Scrapyのクロール結果をJSONLで出力する

 
カテゴリー Python   タグ

JSONL(JSON Line)で出力する方法

FEEDを使って設定する

settings.pyに以下の設定を追記するのみ。

1
2
3
4
5
6
# FEED
FEED_EXPORTERS = {
'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
}
FEED_FORMAT = 'jsonlines'
FEED_URI = "ファイル名.jsonl"

クローラー実行中にファイル名を参照する

クローラー中で前回の実行結果を参照したい場合self.settings['FEED_URI']でファイル名を取得できる

1
2
3
4
5
6
7
import json

...略...

with open(self.settings['FEED_URI'], "r") as f:
for readline in f.readlines():
item = json.loads(readline)

設定パラメーターが古い

期待通りの動作をするが、以下の警告が表示される

1
WARNING: /usr/local/lib/python3.8/site-packages/scrapy/extensions/feedexport.py:210: ScrapyDeprecationWarning: The `FEED_URI` and `FEED_FORMAT` settings have been deprecated in favor of the `FEEDS` setting. Please see the `FEEDS` setting docs for more details

FEED_URIFEED_FORMATはすでにDeprecatedのようだ。

新しい設定としてFEEDSで、dict型で設定を行う(FEEDS)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FEEDS = {
'items.json': {
'format': 'json',
'encoding': 'utf8',
'store_empty': False,
'fields': None,
'indent': 4,
'item_export_kwargs': {
'export_empty_fields': True,
},
},
'/home/user/documents/items.xml': {
'format': 'xml',
'fields': ['name', 'price'],
'encoding': 'latin1',
'indent': 8,
},
pathlib.Path('items.csv'): {
'format': 'csv',
'fields': ['price', 'name'],
},
}

JSONL形式の設定を新しいFEEDSパラメーターで定義すると

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# FEED
FEED_EXPORTERS = {
'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
}

FEEDS = {
'ファイル名.jsonl': {
'format': 'jsonlines',
'encoding': 'utf8',
'store_empty': False,
'fields': None,
'indent': 4,
'item_export_kwargs': {
'export_empty_fields': True,
},
},
}

コメント・シェア

  • page 1 of 1


nullpo

めも


募集中


Japan