simp-test 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/pr_glci.yml +249 -0
- data/.github/workflows/pr_glci_cleanup.yml +97 -0
- data/.github/workflows/pr_glci_manual.yml +206 -0
- data/.github/workflows/pr_tests.yml +94 -0
- data/.github/workflows/tag_deploy_rubygem.yml +154 -0
- data/.gitignore +11 -0
- data/.gitlab-ci.yml +28 -0
- data/.rspec +3 -0
- data/Gemfile +10 -0
- data/LICENSE +27 -0
- data/README.md +34 -0
- data/Rakefile +8 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/simp/test.rb +10 -0
- data/lib/simp/test/version.rb +7 -0
- data/simp-test.gemspec +27 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 748c0d1b5d2e2581bad34faadfc2f4a1ab81dd2a2453f4e8c275be82e30b8fce
|
4
|
+
data.tar.gz: 8608dc9621c6b7f2c8a30eec1017b4e7731d397ae108b99bfa7567e62ee7eeb5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c698b62b5372acdb4ecf3baa834bc64852a72bc42b81f56ab5ead3d5c0b27d56b3d06a34e771b45b48def6079317d2abaebcefacc7a099a3950de8cf94317766
|
7
|
+
data.tar.gz: 25e8ac43d6fee80573da18d12a6189c8354f85227d7dbdafdd412b443be4e7bfade867025d2045c166f5010d78e587772555d5d7281b3aadadf58c37389847a8
|
@@ -0,0 +1,249 @@
|
|
1
|
+
# Push/Trigger a GitLab CI pipeline for the PR HEAD, **ONLY IF:**
|
2
|
+
#
|
3
|
+
# 1. The .gitlab-ci.yaml file exists and validates
|
4
|
+
# 2. The PR submitter has write access to the target repository.
|
5
|
+
#
|
6
|
+
# ==============================================================================
|
7
|
+
#
|
8
|
+
# GitHub Action Secrets variables available for this pipeline:
|
9
|
+
#
|
10
|
+
# GitHub Secret variable Type Notes
|
11
|
+
# ------------------------ -------- ----------------------------------------
|
12
|
+
# GITLAB_API_PRIVATE_TOKEN Secure Should have `api` scope
|
13
|
+
# GITLAB_API_URL Optional
|
14
|
+
#
|
15
|
+
# The secure vars will be filtered in GitHub Actions log output, and aren't
|
16
|
+
# provided to untrusted builds (i.e, triggered by PR from another repository)
|
17
|
+
#
|
18
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
19
|
+
# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
20
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
21
|
+
#
|
22
|
+
# DO NOT MODIFY this workflow, unless you **REALLY** know what you are doing.
|
23
|
+
#
|
24
|
+
# This workflow bypasses some of the built-in protections of the
|
25
|
+
# `pull_request_target` event by explicitly checking out the PR's **HEAD**.
|
26
|
+
# Without being VERY CAREFUL, this could easily allow a malcious PR
|
27
|
+
# contributor the chance to access secrets or a GITHUB_TOKEN with write scope!!
|
28
|
+
#
|
29
|
+
# The jobs in this workflow are designed to handle this safely -- but DO NOT
|
30
|
+
# assume any alterations will also be safe.
|
31
|
+
#
|
32
|
+
# For general information, see:
|
33
|
+
#
|
34
|
+
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target
|
35
|
+
#
|
36
|
+
# For further information, or if ANY of this seems confusing or unecessary:
|
37
|
+
#
|
38
|
+
# ASK FOR ASSISTANCE **BEFORE** ATTEMPTING TO MODIFY THIS WORKFLOW.
|
39
|
+
#
|
40
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
41
|
+
# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
42
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
43
|
+
#
|
44
|
+
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows
|
45
|
+
#
|
46
|
+
---
|
47
|
+
name: PR GLCI
|
48
|
+
on:
|
49
|
+
pull_request_target:
|
50
|
+
types: [opened, reopened, synchronize]
|
51
|
+
|
52
|
+
jobs:
|
53
|
+
|
54
|
+
# The ONLY reason we can validate the PR HEAD's content safely here is that
|
55
|
+
# we restrict ourselves to sending data elsewhere.
|
56
|
+
glci-syntax:
|
57
|
+
name: '.gitlab-ci.yml Syntax'
|
58
|
+
runs-on: ubuntu-16.04
|
59
|
+
outputs:
|
60
|
+
exists: ${{ steps.glci-file-exists.outputs.exists }}
|
61
|
+
valid: ${{ steps.validate-glci-file.outputs.valid }}
|
62
|
+
steps:
|
63
|
+
- uses: actions/checkout@v2
|
64
|
+
with:
|
65
|
+
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
66
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
67
|
+
- name: 'Does GLCI file exist?'
|
68
|
+
id: glci-file-exists
|
69
|
+
run: |
|
70
|
+
if [ -f .gitlab-ci.yml ]; then
|
71
|
+
echo '.gitlab-ci.yml exists'
|
72
|
+
echo '::set-output name=exists::true'
|
73
|
+
else
|
74
|
+
echo '::error ::The ".gitlab-ci.yml" file is missing!'
|
75
|
+
echo '::set-output name=exists::false'
|
76
|
+
false
|
77
|
+
fi
|
78
|
+
- name: 'Validate GLCI file syntax'
|
79
|
+
id: validate-glci-file
|
80
|
+
if: steps.glci-file-exists.outputs.exists == 'true'
|
81
|
+
env:
|
82
|
+
GITLAB_API_URL: ${{ secrets.GITLAB_API_URL }} # https://gitlab.com/api/v4
|
83
|
+
GITLAB_API_PRIVATE_TOKEN: ${{ secrets.GITLAB_API_PRIVATE_TOKEN }}
|
84
|
+
run: |
|
85
|
+
GITLAB_API_URL="${GITLAB_API_URL:-https://gitlab.com/api/v4}"
|
86
|
+
CURL_CMD=(curl --http1.1 --fail --silent --show-error --header 'Content-Type: application/json' --data @-)
|
87
|
+
[ -n "$GITLAB_API_PRIVATE_TOKEN" ] && CURL_CMD+=(--header "Authorization: Bearer $GITLAB_API_PRIVATE_TOKEN")
|
88
|
+
data="$(jq --null-input --arg yaml "$(<.gitlab-ci.yml)" '.content=$yaml' )"
|
89
|
+
response="$(echo "$data" | "${CURL_CMD[@]}" "${GITLAB_API_URL}/ci/lint?include_merged_yaml=true" | jq . )"
|
90
|
+
status=$( echo "$response" | jq .status )
|
91
|
+
if [[ "$status" == '"valid"' ]]; then
|
92
|
+
echo '.gitlab-ci.yml is valid'
|
93
|
+
echo '::set-output name=valid::true'
|
94
|
+
else
|
95
|
+
echo '::set-output name=valid::false'
|
96
|
+
echo '::error::The .gitlab-ci.yml" file is invalid!'
|
97
|
+
echo "$response" | jq -r '.errors[] | . = "::error ::\(.)"'
|
98
|
+
printf "::debug ::.gitlab-ci.yml CI lint service response: %s\n" "$response"
|
99
|
+
false
|
100
|
+
fi
|
101
|
+
|
102
|
+
contributor-permissions:
|
103
|
+
name: 'PR contributor check'
|
104
|
+
runs-on: ubuntu-18.04
|
105
|
+
outputs:
|
106
|
+
permitted: ${{ steps.user-repo-permissions.outputs.permitted }}
|
107
|
+
steps:
|
108
|
+
- uses: actions/github-script@v3
|
109
|
+
id: user-repo-permissions
|
110
|
+
with:
|
111
|
+
github-token: ${{secrets.GITHUB_TOKEN}}
|
112
|
+
# See:
|
113
|
+
# - https://octokit.github.io/rest.js/
|
114
|
+
# - https://docs.github.com/en/free-pro-team@latest/rest/reference/repos#get-repository-permissions-for-a-user
|
115
|
+
script: |
|
116
|
+
const project_permission = await github.request('GET /repos/{owner}/{repo}/collaborators/{username}/permission', {
|
117
|
+
headers: {
|
118
|
+
accept: 'application/vnd.github.v3+json'
|
119
|
+
},
|
120
|
+
owner: context.repo.owner,
|
121
|
+
repo: context.repo.repo,
|
122
|
+
username: context.payload.sender.login,
|
123
|
+
})
|
124
|
+
const has_write_access = perm_lvl => (perm_lvl == "admin" || perm_lvl == "write" )
|
125
|
+
const write_access_desc = perm_bool => (perm_bool ? "PERMISSION OK" : "PERMISSION DENIED" )
|
126
|
+
if( has_write_access(project_permission.data.permission )){
|
127
|
+
core.setOutput( 'permitted', 'true' )
|
128
|
+
} else {
|
129
|
+
core.setOutput( 'permitted', 'false' )
|
130
|
+
console.log(`::error ::payload user '${context.payload.sender.login}' does not have CI trigger permission for '${context.repository}; not triggering external CI'`)
|
131
|
+
}
|
132
|
+
console.log(`== payload user '${context.payload.sender.login}' CI trigger permission for '${context.repo.owner}': ${write_access_desc(has_write_access(project_permission.data.permission))}`)
|
133
|
+
|
134
|
+
|
135
|
+
trigger-when-user-has-repo-permissions:
|
136
|
+
name: 'Trigger CI [trusted users only]'
|
137
|
+
needs: [ glci-syntax, contributor-permissions ]
|
138
|
+
# This conditional provides an extra safety control, in case the workflow's
|
139
|
+
# `on` section is inadventently modified without considering the security
|
140
|
+
# implications.
|
141
|
+
#
|
142
|
+
# This job will ONLY trigger on:
|
143
|
+
#
|
144
|
+
# - [x] pull_request_target event: github.event_name == 'pull_request_target'
|
145
|
+
# AND:
|
146
|
+
# - [x] Newly-opened PRs: github.event.action == 'opened'
|
147
|
+
# - [x] Re-opened PRs: github.event.action == 'reopened'
|
148
|
+
# - [x] Commits are added to PR: github.event.action == 'synchronize'
|
149
|
+
# AND:
|
150
|
+
# - [x] .gitlab-ci.yml exists/ok: needs.glci-syntax.outputs.valid == 'true'
|
151
|
+
#
|
152
|
+
# [Not implemented] It should NEVER trigger on:
|
153
|
+
#
|
154
|
+
# - [ ] Merged PRs: github.event.pull_request.merged == 'false'
|
155
|
+
# - (the downstream GitLab mirror will take care of that)
|
156
|
+
# - Not implemented: For some reason, this conditional always fails
|
157
|
+
# - Unnecessary if on>pull_request_target>types doesn't include 'closed'
|
158
|
+
if: github.event_name == 'pull_request_target' && ( github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'synchronize' ) && github.event.pull_request.merged != 'true' && needs.glci-syntax.outputs.valid == 'true' && needs.contributor-permissions.outputs.permitted == 'true'
|
159
|
+
runs-on: ubuntu-18.04
|
160
|
+
steps:
|
161
|
+
# Things we'd like to do:
|
162
|
+
# - [ ] if there's no GitLab mirror, make one
|
163
|
+
# - [ ] if there's no GitLab <-> GitHub integration, make one
|
164
|
+
# - [ ] if there's no PR check on the main GitHub branch, make one (?)
|
165
|
+
# - [x] Cancel any GLCI pipelines already pending/running for this branch
|
166
|
+
# - "created|waiting_for_resource|preparing|pending|running"
|
167
|
+
# - [x] if PR: force-push branch to GitLab
|
168
|
+
- uses: actions/checkout@v2
|
169
|
+
if: needs.contributor-permissions.outputs.permitted == 'true'
|
170
|
+
with:
|
171
|
+
fetch-depth: 0 # Need full checkout to push to gitlab mirror
|
172
|
+
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
173
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
174
|
+
|
175
|
+
- name: Trigger CI when user has Repo Permissions
|
176
|
+
if: needs.contributor-permissions.outputs.permitted == 'true'
|
177
|
+
env:
|
178
|
+
GITLAB_SERVER_URL: ${{ secrets.GITLAB_SERVER_URL }} # https://gitlab.com
|
179
|
+
GITLAB_API_URL: ${{ secrets.GITLAB_API_URL }} # https://gitlab.com/api/v4
|
180
|
+
GITLAB_ORG: ${{ github.event.organization.login }}
|
181
|
+
GITLAB_API_PRIVATE_TOKEN: ${{ secrets.GITLAB_API_PRIVATE_TOKEN }}
|
182
|
+
GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
183
|
+
run: |
|
184
|
+
GITLAB_SERVER_URL="${GITLAB_SERVER_URL:-https://gitlab.com}"
|
185
|
+
GITLAB_API_URL="${GITLAB_API_URL:-${GITLAB_SERVER_URL}/api/v4}"
|
186
|
+
GIT_BRANCH="${GIT_BRANCH:-GITHUB_HEAD_REF}"
|
187
|
+
GITXXB_REPO_NAME="${GITHUB_REPOSITORY/$GITHUB_REPOSITORY_OWNER\//}"
|
188
|
+
GITLAB_PROJECT_ID="${GITLAB_ORG}%2F${GITXXB_REPO_NAME}"
|
189
|
+
# --http1.0 avoids an HTTP/2 load balancing issue when run from GA
|
190
|
+
CURL_CMD=(curl --http1.0 --fail --silent --show-error \
|
191
|
+
--header "Authorization: Bearer $GITLAB_API_PRIVATE_TOKEN" \
|
192
|
+
--header "Content-Type: application/json" \
|
193
|
+
--header "Accept: application/json" \
|
194
|
+
)
|
195
|
+
|
196
|
+
# Cancel any active/pending GitLab CI pipelines for the same project+branch
|
197
|
+
active_pipeline_ids=()
|
198
|
+
for pipe_status in created waiting_for_resource preparing pending running; do
|
199
|
+
echo " ---- checking for CI pipelines with status '$pipe_status' for project '$GITLAB_PROJECT_ID', branch '$GIT_BRANCH'"
|
200
|
+
url="${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines?ref=${GIT_BRANCH}&status=${pipe_status}"
|
201
|
+
active_pipelines="$("${CURL_CMD[@]}" "$url" | jq -r '.[] | .id , .web_url')"
|
202
|
+
active_pipeline_ids+=($(echo "$active_pipelines" | grep -E '^[0-9]*$'))
|
203
|
+
printf "$active_pipelines\n\n"
|
204
|
+
done
|
205
|
+
if [ "${#active_pipeline_ids[@]}" -gt 0 ]; then
|
206
|
+
printf "\nFound %s active pipeline ids:\n" "${#active_pipeline_ids[@]}"
|
207
|
+
echo "${active_pipeline_ids[@]}"
|
208
|
+
for pipe_id in "${active_pipeline_ids[@]}"; do
|
209
|
+
printf "\n ------ Cancelling pipeline ID %s...\n" "$pipe_id"
|
210
|
+
"${CURL_CMD[@]}" --request POST "${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines/${pipe_id}/cancel"
|
211
|
+
done
|
212
|
+
else
|
213
|
+
echo No active pipelines found
|
214
|
+
fi
|
215
|
+
|
216
|
+
echo "== Pushing $GIT_BRANCH to gitlab"
|
217
|
+
git remote add gitlab "https://oauth2:${GITLAB_API_PRIVATE_TOKEN}@${GITLAB_SERVER_URL#*://}/${GITLAB_ORG}/${GITXXB_REPO_NAME}.git"
|
218
|
+
#git branch "$GIT_BRANCH" HEAD
|
219
|
+
git log --color --graph --abbrev-commit -5 \
|
220
|
+
--pretty=format:'%C(red)%h%C(reset) -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset'
|
221
|
+
git push gitlab ":${GIT_BRANCH}" -f || : # attempt to un-weird GLCI's `changed` tracking
|
222
|
+
git push gitlab "${GIT_BRANCH}" -f
|
223
|
+
echo "Pushed branch '${GIT_BRANCH}' to gitlab"
|
224
|
+
echo " A new pipeline should be at: https://${GITLAB_SERVER_URL#*://}/${GITLAB_ORG}/${GITXXB_REPO_NAME}/-/pipelines/"
|
225
|
+
|
226
|
+
- name: When user does NOT have Repo Permissions
|
227
|
+
if: needs.contributor-permissions.outputs.permitted == 'false'
|
228
|
+
continue-on-error: true
|
229
|
+
run: |
|
230
|
+
echo "Ending gracefully; Contributor $GITHUB_ACTOR does not have permission to trigger CI"
|
231
|
+
false
|
232
|
+
|
233
|
+
### examine_contexts:
|
234
|
+
### name: 'Examine Context contents'
|
235
|
+
### if: always()
|
236
|
+
### runs-on: ubuntu-16.04
|
237
|
+
### needs: [ glci-syntax, contributor-permissions ]
|
238
|
+
### steps:
|
239
|
+
### - name: Dump contexts
|
240
|
+
### env:
|
241
|
+
### GITHUB_CONTEXT: ${{ toJson(github) }}
|
242
|
+
### run: echo "$GITHUB_CONTEXT"
|
243
|
+
### - name: Dump needs context
|
244
|
+
### env:
|
245
|
+
### ENV_CONTEXT: ${{ toJson(needs) }}
|
246
|
+
### run: echo "$ENV_CONTEXT"
|
247
|
+
### - name: Dump env vars
|
248
|
+
### run: env | sort
|
249
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# When a PR is closed, clean up any associated GitLab CI pipelines & branch
|
2
|
+
#
|
3
|
+
# * Cancels all GLCI pipelines associated with the PR HEAD ref (branch)
|
4
|
+
# * Removes the PR HEAD branch from the corresponding gitlab.com/org/ project
|
5
|
+
#
|
6
|
+
# ==============================================================================
|
7
|
+
#
|
8
|
+
# GitHub Action Secrets variables available for this pipeline:
|
9
|
+
#
|
10
|
+
# GitHub Secret variable Type Notes
|
11
|
+
# ------------------------ -------- ----------------------------------------
|
12
|
+
# GITLAB_API_PRIVATE_TOKEN Secure Should have `api` scope
|
13
|
+
# GITLAB_API_URL Optional
|
14
|
+
#
|
15
|
+
# The secure vars will be filtered in GitHub Actions log output, and aren't
|
16
|
+
# provided to untrusted builds (i.e, triggered by PR from another repository)
|
17
|
+
#
|
18
|
+
# ------------------------------------------------------------------------------
|
19
|
+
#
|
20
|
+
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows
|
21
|
+
#
|
22
|
+
---
|
23
|
+
name: PR GLCI Cleanup
|
24
|
+
on:
|
25
|
+
pull_request_target:
|
26
|
+
types: [closed]
|
27
|
+
|
28
|
+
jobs:
|
29
|
+
cleanup-glci-branch:
|
30
|
+
name: 'Clean up GLCI'
|
31
|
+
# This conditional provides an extra safety control, in case the workflow's
|
32
|
+
# `on` section is inadventently modified without considering the security
|
33
|
+
# implications.
|
34
|
+
if: github.event_name == 'pull_request_target' && github.event.action == 'closed'
|
35
|
+
runs-on: ubuntu-18.04
|
36
|
+
steps:
|
37
|
+
- uses: actions/checkout@v2
|
38
|
+
with:
|
39
|
+
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
40
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
41
|
+
- name: Trigger CI when user has Repo Permissions
|
42
|
+
env:
|
43
|
+
GITLAB_SERVER_URL: ${{ secrets.GITLAB_SERVER_URL }} # https://gitlab.com
|
44
|
+
GITLAB_API_URL: ${{ secrets.GITLAB_API_URL }} # https://gitlab.com/api/v4
|
45
|
+
GITLAB_ORG: ${{ github.event.organization.login }}
|
46
|
+
GITLAB_API_PRIVATE_TOKEN: ${{ secrets.GITLAB_API_PRIVATE_TOKEN }}
|
47
|
+
GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
48
|
+
run: |
|
49
|
+
GITLAB_SERVER_URL="${GITLAB_SERVER_URL:-https://gitlab.com}"
|
50
|
+
GITLAB_API_URL="${GITLAB_API_URL:-${GITLAB_SERVER_URL}/api/v4}"
|
51
|
+
GIT_BRANCH="${GIT_BRANCH:-GITHUB_HEAD_REF}"
|
52
|
+
GITXXB_REPO_NAME="${GITHUB_REPOSITORY/$GITHUB_REPOSITORY_OWNER\//}"
|
53
|
+
GITLAB_PROJECT_ID="${GITLAB_ORG}%2F${GITXXB_REPO_NAME}"
|
54
|
+
# --http1.0 avoids an HTTP/2 load balancing issue when run from GA
|
55
|
+
CURL_CMD=(curl --http1.0 --fail --silent --show-error \
|
56
|
+
--header "Authorization: Bearer $GITLAB_API_PRIVATE_TOKEN" \
|
57
|
+
--header "Content-Type: application/json" \
|
58
|
+
--header "Accept: application/json" \
|
59
|
+
)
|
60
|
+
|
61
|
+
# Cancel any active/pending GitLab CI pipelines for the same project+branch
|
62
|
+
active_pipeline_ids=()
|
63
|
+
for pipe_status in created waiting_for_resource preparing pending running; do
|
64
|
+
echo " ---- checking for CI pipelines with status '$pipe_status' for project '$GITLAB_PROJECT_ID', branch '$GIT_BRANCH'"
|
65
|
+
url="${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines?ref=${GIT_BRANCH}&status=${pipe_status}"
|
66
|
+
active_pipelines="$("${CURL_CMD[@]}" "$url" | jq -r '.[] | .id , .web_url')"
|
67
|
+
active_pipeline_ids+=($(echo "$active_pipelines" | grep -E '^[0-9]*$'))
|
68
|
+
printf "$active_pipelines\n\n"
|
69
|
+
done
|
70
|
+
if [ "${#active_pipeline_ids[@]}" -gt 0 ]; then
|
71
|
+
printf "\nFound %s active pipeline ids:\n" "${#active_pipeline_ids[@]}"
|
72
|
+
echo "${active_pipeline_ids[@]}"
|
73
|
+
for pipe_id in "${active_pipeline_ids[@]}"; do
|
74
|
+
printf "\n ------ Cancelling pipeline ID %s...\n" "$pipe_id"
|
75
|
+
"${CURL_CMD[@]}" --request POST "${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines/${pipe_id}/cancel"
|
76
|
+
done
|
77
|
+
else
|
78
|
+
echo No active pipelines found
|
79
|
+
fi
|
80
|
+
|
81
|
+
echo "== Removing $GIT_BRANCH from gitlab"
|
82
|
+
git remote add gitlab "https://oauth2:${GITLAB_API_PRIVATE_TOKEN}@${GITLAB_SERVER_URL#*://}/${GITLAB_ORG}/${GITXXB_REPO_NAME}.git"
|
83
|
+
git push gitlab ":${GIT_BRANCH}" -f || : # attempt to un-weird GLCI's `changed` tracking
|
84
|
+
|
85
|
+
### examine_contexts:
|
86
|
+
### name: 'Examine Context contents'
|
87
|
+
### if: always()
|
88
|
+
### runs-on: ubuntu-16.04
|
89
|
+
### steps:
|
90
|
+
### - name: Dump contexts
|
91
|
+
### env:
|
92
|
+
### GITHUB_CONTEXT: ${{ toJson(github) }}
|
93
|
+
### run: echo "$GITHUB_CONTEXT"
|
94
|
+
### run: echo "$ENV_CONTEXT"
|
95
|
+
### - name: Dump env vars
|
96
|
+
### run: env | sort
|
97
|
+
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# Manually trigger GLCI pipelines for a PR
|
2
|
+
# ==============================================================================
|
3
|
+
#
|
4
|
+
# This pipeline uses the following GitHub Action Secrets:
|
5
|
+
#
|
6
|
+
# GitHub Secret variable Type Notes
|
7
|
+
# ------------------------ -------- ----------------------------------------
|
8
|
+
# GITLAB_API_PRIVATE_TOKEN Required GitLab token (should have `api` scope)
|
9
|
+
# NO_SCOPE_GITHUB_TOKEN Required GitHub token (should have no scopes)
|
10
|
+
# GITLAB_SERVER_URL Optional Specify a GL server other than gitlab.com
|
11
|
+
# The secure vars will be filtered in GitHub Actions log output, and aren't
|
12
|
+
# provided to untrusted builds (i.e, triggered by PR from another repository)
|
13
|
+
#
|
14
|
+
# ------------------------------------------------------------------------------
|
15
|
+
#
|
16
|
+
# NOTES:
|
17
|
+
# It is necessary to provide NO_SCOPE_GITHUB_TOKEN because $secrets.GITHUB_AUTO
|
18
|
+
# is NOT provide to manually-triggered (`workflow_dispatch`) events, in order
|
19
|
+
# to prevent recursive triggers between workflows
|
20
|
+
#
|
21
|
+
# Reference:
|
22
|
+
#
|
23
|
+
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token
|
24
|
+
---
|
25
|
+
name: 'Manual: PR GLCI'
|
26
|
+
|
27
|
+
on:
|
28
|
+
workflow_dispatch:
|
29
|
+
inputs:
|
30
|
+
pr_number:
|
31
|
+
description: "PR number to trigger GLCI"
|
32
|
+
required: true
|
33
|
+
|
34
|
+
jobs:
|
35
|
+
glci-syntax:
|
36
|
+
name: '.gitlab-ci.yml Syntax'
|
37
|
+
runs-on: ubuntu-16.04
|
38
|
+
outputs:
|
39
|
+
exists: ${{ steps.glci-file-exists.outputs.exists }}
|
40
|
+
valid: ${{ steps.validate-glci-file.outputs.valid }}
|
41
|
+
pr_head_ref: ${{ steps.get-pr.outputs.pr_head_ref }}
|
42
|
+
pr_head_sha: ${{ steps.get-pr.outputs.pr_head_sha }}
|
43
|
+
pr_head_label: ${{ steps.get-pr.outputs.pr_head_label }}
|
44
|
+
pr_head_full_name: ${{ steps.get-pr.outputs.pr_full_name }}
|
45
|
+
steps:
|
46
|
+
- uses: actions/github-script@v3
|
47
|
+
id: get-pr
|
48
|
+
with:
|
49
|
+
github-token: ${{secrets.NO_SCOPE_GITHUB_TOKEN}}
|
50
|
+
# See:
|
51
|
+
# - https://octokit.github.io/rest.js/
|
52
|
+
script: |
|
53
|
+
console.log(`== pr number: ${context.payload.inputs.pr_number}`)
|
54
|
+
const pr = await github.request('get /repos/{owner}/{repo}/pulls/{pull_number}', {
|
55
|
+
headers: {
|
56
|
+
accept: 'application/vnd.github.v3+json'
|
57
|
+
},
|
58
|
+
owner: context.repo.owner,
|
59
|
+
repo: context.repo.repo,
|
60
|
+
pull_number: context.payload.inputs.pr_number
|
61
|
+
});
|
62
|
+
|
63
|
+
console.log("\n\n== pr\n");
|
64
|
+
console.log(pr);
|
65
|
+
console.log("\n\n== pr.data.head\n");
|
66
|
+
console.log(pr.data.head);
|
67
|
+
console.log(pr.status);
|
68
|
+
|
69
|
+
// PR must have been returned
|
70
|
+
if ( pr.status != 200 ) {
|
71
|
+
//#console.log(`::error ::Error looking up PR \#${context.payload.inputs.pr_number}: HTTP Response ${pr.status}`)
|
72
|
+
return(false)
|
73
|
+
}
|
74
|
+
|
75
|
+
// TODO: should either of these conditions really prevent a GLCI trigger?
|
76
|
+
if ( pr.data.state != 'open' ) {
|
77
|
+
console.log(`::error ::PR# ${context.payload.inputs.pr_number} is not open`)
|
78
|
+
}
|
79
|
+
if ( pr.data.merged ) {
|
80
|
+
console.log(`::error ::PR# ${context.payload.inputs.pr_number} is already merged`)
|
81
|
+
}
|
82
|
+
core.setOutput( 'pr_head_sha', pr.data.head.sha )
|
83
|
+
core.setOutput( 'pr_head_ref', pr.data.head.ref )
|
84
|
+
core.setOutput( 'pr_head_label', pr.data.head.label )
|
85
|
+
core.setOutput( 'pr_head_full_name', pr.data.head.full_name )
|
86
|
+
- uses: actions/checkout@v2
|
87
|
+
with:
|
88
|
+
repository: ${{ steps.get-pr.outputs.pr_head_full_name }}
|
89
|
+
ref: ${{ steps.get-pr.outputs.pr_head_sha }}
|
90
|
+
token: ${{secrets.NO_SCOPE_GITHUB_TOKEN}}
|
91
|
+
clean: true
|
92
|
+
- name: 'Does GLCI file exist?'
|
93
|
+
id: glci-file-exists
|
94
|
+
run: |
|
95
|
+
if [ -f .gitlab-ci.yml ]; then
|
96
|
+
echo '.gitlab-ci.yml exists'
|
97
|
+
echo '::set-output name=exists::true'
|
98
|
+
else
|
99
|
+
echo '::error ::The ".gitlab-ci.yml" file is missing!'
|
100
|
+
echo '::set-output name=exists::false'
|
101
|
+
false
|
102
|
+
fi
|
103
|
+
- name: 'Validate GLCI file syntax'
|
104
|
+
id: validate-glci-file
|
105
|
+
env:
|
106
|
+
GITLAB_API_URL: ${{ secrets.GITLAB_API_URL }} # https://gitlab.com/api/v4
|
107
|
+
GITLAB_API_PRIVATE_TOKEN: ${{ secrets.GITLAB_API_PRIVATE_TOKEN }}
|
108
|
+
run: |
|
109
|
+
GITLAB_API_URL="${GITLAB_API_URL:-https://gitlab.com/api/v4}"
|
110
|
+
CURL_CMD=(curl --http1.1 --fail --silent --show-error --header 'Content-Type: application/json' --data @-)
|
111
|
+
[ -n "$GITLAB_API_PRIVATE_TOKEN" ] && CURL_CMD+=(--header "Authorization: Bearer $GITLAB_API_PRIVATE_TOKEN")
|
112
|
+
data="$(jq --null-input --arg yaml "$(<.gitlab-ci.yml)" '.content=$yaml' )"
|
113
|
+
response="$(echo "$data" | "${CURL_CMD[@]}" "${GITLAB_API_URL}/ci/lint?include_merged_yaml=true" | jq . )"
|
114
|
+
status=$( echo "$response" | jq .status )
|
115
|
+
if [[ "$status" == '"valid"' ]]; then
|
116
|
+
echo '.gitlab-ci.yml is valid'
|
117
|
+
echo '::set-output name=valid::true'
|
118
|
+
else
|
119
|
+
echo '::set-output name=valid::false'
|
120
|
+
echo '::error::The .gitlab-ci.yml" file is invalid!'
|
121
|
+
echo "$response" | jq -r '.errors[] | . = "::error ::\(.)"'
|
122
|
+
printf "::debug ::.gitlab-ci.yml CI lint service response: %s\n" "$response"
|
123
|
+
false
|
124
|
+
fi
|
125
|
+
|
126
|
+
trigger-when-user-has-repo-permissions:
|
127
|
+
name: 'Trigger CI'
|
128
|
+
needs: [ glci-syntax ]
|
129
|
+
runs-on: ubuntu-16.04
|
130
|
+
steps:
|
131
|
+
- uses: actions/checkout@v2
|
132
|
+
with:
|
133
|
+
repository: ${{ needs.glci-syntax.outputs.pr_head_full_name }}
|
134
|
+
ref: ${{ needs.glci-syntax.outputs.pr_head_sha }}
|
135
|
+
token: ${{secrets.NO_SCOPE_GITHUB_TOKEN}}
|
136
|
+
fetch-depth: 0 # Need full checkout to push to gitlab mirror
|
137
|
+
clean: true
|
138
|
+
- name: Trigger CI
|
139
|
+
env:
|
140
|
+
GITLAB_SERVER_URL: ${{ secrets.GITLAB_SERVER_URL }} # https://gitlab.com
|
141
|
+
GITLAB_API_URL: ${{ secrets.GITLAB_API_URL }} # https://gitlab.com/api/v4
|
142
|
+
GITLAB_ORG: ${{ github.event.organization.login }}
|
143
|
+
GITLAB_API_PRIVATE_TOKEN: ${{ secrets.GITLAB_API_PRIVATE_TOKEN }}
|
144
|
+
GIT_BRANCH: ${{ needs.glci-syntax.outputs.pr_head_ref }}
|
145
|
+
run: |
|
146
|
+
GITLAB_SERVER_URL="${GITLAB_SERVER_URL:-https://gitlab.com}"
|
147
|
+
GITLAB_API_URL="${GITLAB_API_URL:-${GITLAB_SERVER_URL}/api/v4}"
|
148
|
+
GITXXB_REPO_NAME="${GITHUB_REPOSITORY/$GITHUB_REPOSITORY_OWNER\//}"
|
149
|
+
GITLAB_PROJECT_ID="${GITLAB_ORG}%2F${GITXXB_REPO_NAME}"
|
150
|
+
# --http1.0 avoids an HTTP/2 load balancing issue when run from GA
|
151
|
+
CURL_CMD=(curl --http1.0 --fail --silent --show-error \
|
152
|
+
--header "Authorization: Bearer $GITLAB_API_PRIVATE_TOKEN" \
|
153
|
+
--header "Content-Type: application/json" \
|
154
|
+
--header "Accept: application/json" \
|
155
|
+
)
|
156
|
+
|
157
|
+
# Cancel any active/pending GitLab CI pipelines for the same project+branch
|
158
|
+
active_pipeline_ids=()
|
159
|
+
for pipe_status in created waiting_for_resource preparing pending running; do
|
160
|
+
echo " ---- checking for CI pipelines with status '$pipe_status' for project '$GITLAB_PROJECT_ID', branch '$GIT_BRANCH'"
|
161
|
+
url="${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines?ref=${GIT_BRANCH}&status=${pipe_status}"
|
162
|
+
active_pipelines="$("${CURL_CMD[@]}" "$url" | jq -r '.[] | .id , .web_url')"
|
163
|
+
active_pipeline_ids+=($(echo "$active_pipelines" | grep -E '^[0-9]*$'))
|
164
|
+
printf "$active_pipelines\n\n"
|
165
|
+
done
|
166
|
+
if [ "${#active_pipeline_ids[@]}" -gt 0 ]; then
|
167
|
+
printf "\nFound %s active pipeline ids:\n" "${#active_pipeline_ids[@]}"
|
168
|
+
echo "${active_pipeline_ids[@]}"
|
169
|
+
for pipe_id in "${active_pipeline_ids[@]}"; do
|
170
|
+
printf "\n ------ Cancelling pipeline ID %s...\n" "$pipe_id"
|
171
|
+
"${CURL_CMD[@]}" --request POST "${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/pipelines/${pipe_id}/cancel"
|
172
|
+
done
|
173
|
+
else
|
174
|
+
echo No active pipelines found
|
175
|
+
fi
|
176
|
+
|
177
|
+
# Should we protect against pushing default branches?
|
178
|
+
echo "== Pushing '$GIT_BRANCH' to gitlab"
|
179
|
+
git remote add gitlab "https://oauth2:${GITLAB_API_PRIVATE_TOKEN}@${GITLAB_SERVER_URL#*://}/${GITLAB_ORG}/${GITXXB_REPO_NAME}.git"
|
180
|
+
git branch "$GIT_BRANCH" HEAD || :
|
181
|
+
git branch -av
|
182
|
+
git log --color --graph --abbrev-commit -5 \
|
183
|
+
--pretty=format:'%C(red)%h%C(reset) -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset'
|
184
|
+
git push gitlab ":${GIT_BRANCH}" -f || : # attempt to un-weird GLCI's `changed` tracking
|
185
|
+
echo "== git push --verbose gitlab ${GIT_BRANCH}"
|
186
|
+
git push --verbose gitlab "${GIT_BRANCH}"
|
187
|
+
echo "Pushed branch '${GIT_BRANCH}' to gitlab"
|
188
|
+
echo " A new pipeline should be at: https://${GITLAB_SERVER_URL#*://}/${GITLAB_ORG}/${GITXXB_REPO_NAME}/-/pipelines/"
|
189
|
+
|
190
|
+
### examine_contexts:
|
191
|
+
### needs: [ glci-syntax ]
|
192
|
+
### name: 'Examine Context contents'
|
193
|
+
### if: always()
|
194
|
+
### runs-on: ubuntu-16.04
|
195
|
+
### steps:
|
196
|
+
### - name: Dump contexts
|
197
|
+
### env:
|
198
|
+
### GITHUB_CONTEXT: ${{ toJson(github) }}
|
199
|
+
### run: echo "$GITHUB_CONTEXT"
|
200
|
+
### - name: Dump 'needs' context
|
201
|
+
### env:
|
202
|
+
### ENV_CONTEXT: ${{ toJson(needs) }}
|
203
|
+
### run: echo "$ENV_CONTEXT"
|
204
|
+
### - name: Dump env vars
|
205
|
+
### run: env | sort
|
206
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# The testing matrix considers ruby/puppet versions supported by SIMP and PE:
|
2
|
+
# ------------------------------------------------------------------------------
|
3
|
+
# Release Puppet Ruby EOL
|
4
|
+
# SIMP 6.4 5.5 2.40 TBD
|
5
|
+
# PE 2018.1 5.5 2.40 2021-01 (LTS overlap)
|
6
|
+
# PE 2019.8 6.18 2.5 2022-12 (LTS)
|
7
|
+
#
|
8
|
+
# https://puppet.com/docs/pe/2018.1/component_versions_in_recent_pe_releases.html
|
9
|
+
# https://puppet.com/misc/puppet-enterprise-lifecycle
|
10
|
+
# https://puppet.com/docs/pe/2018.1/overview/getting_support_for_pe.html
|
11
|
+
# ==============================================================================
|
12
|
+
#
|
13
|
+
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows
|
14
|
+
#
|
15
|
+
|
16
|
+
name: PR Tests
|
17
|
+
on:
|
18
|
+
pull_request:
|
19
|
+
types: [opened, reopened, synchronize]
|
20
|
+
|
21
|
+
env:
|
22
|
+
PUPPET_VERSION: '~> 6'
|
23
|
+
|
24
|
+
jobs:
|
25
|
+
ruby-style:
|
26
|
+
if: false # TODO Modules will need: rubocop in Gemfile, .rubocop.yml
|
27
|
+
name: 'Ruby Style (experimental)'
|
28
|
+
runs-on: ubuntu-18.04
|
29
|
+
continue-on-error: true
|
30
|
+
steps:
|
31
|
+
- uses: actions/checkout@v2
|
32
|
+
- name: "Install Ruby ${{matrix.puppet.ruby_version}}"
|
33
|
+
uses: ruby/setup-ruby@v1
|
34
|
+
with:
|
35
|
+
ruby-version: 2.5
|
36
|
+
bundler-cache: true
|
37
|
+
- run: |
|
38
|
+
bundle show
|
39
|
+
bundle exec rake rubocop
|
40
|
+
|
41
|
+
# releng-checks:
|
42
|
+
# name: 'RELENG checks'
|
43
|
+
# runs-on: ubuntu-18.04
|
44
|
+
# steps:
|
45
|
+
# - uses: actions/checkout@v2
|
46
|
+
# - name: 'Install Ruby ${{matrix.puppet.ruby_version}}'
|
47
|
+
# uses: ruby/setup-ruby@v1
|
48
|
+
# with:
|
49
|
+
# ruby-version: 2.5
|
50
|
+
# bundler-cache: true
|
51
|
+
# - name: 'Tags and changelogs'
|
52
|
+
# run: |
|
53
|
+
# bundle exec rake pkg:check_version
|
54
|
+
# bundle exec rake pkg:compare_latest_tag
|
55
|
+
# bundle exec rake pkg:create_tag_changelog
|
56
|
+
# - name: 'Test-build the Puppet module'
|
57
|
+
# run: 'bundle exec pdk build --force'
|
58
|
+
|
59
|
+
spec-tests:
|
60
|
+
name: 'Spec tests'
|
61
|
+
runs-on: ubuntu-18.04
|
62
|
+
strategy:
|
63
|
+
matrix:
|
64
|
+
puppet:
|
65
|
+
- label: 'Puppet 6.18 [SIMP 6.5/PE 2019.8]'
|
66
|
+
puppet_version: '~> 6.18.0'
|
67
|
+
ruby_version: '2.5'
|
68
|
+
- label: 'Puppet 5.5 [SIMP 6.4/PE 2018.1]'
|
69
|
+
puppet_version: '~> 5.5.22'
|
70
|
+
ruby_version: '2.4'
|
71
|
+
- label: 'Puppet 7.x'
|
72
|
+
puppet_version: '~> 7.0'
|
73
|
+
ruby_version: '2.7'
|
74
|
+
env:
|
75
|
+
PUPPET_VERSION: '${{matrix.puppet.puppet_version}}'
|
76
|
+
steps:
|
77
|
+
- uses: actions/checkout@v2
|
78
|
+
- name: 'Install Ruby ${{matrix.puppet.ruby_version}}'
|
79
|
+
uses: ruby/setup-ruby@v1
|
80
|
+
with:
|
81
|
+
ruby-version: ${{matrix.puppet.ruby_version}}
|
82
|
+
bundler-cache: true
|
83
|
+
- run: 'command -v rpm || if command -v apt-get; then apt-get update; apt-get install -y rpm; fi ||:'
|
84
|
+
- run: 'bundle exec rake spec'
|
85
|
+
|
86
|
+
dump_contexts:
|
87
|
+
name: 'Examine Context contents'
|
88
|
+
runs-on: ubuntu-16.04
|
89
|
+
steps:
|
90
|
+
- name: Dump contexts
|
91
|
+
env:
|
92
|
+
GITHUB_CONTEXT: ${{ toJson(github) }}
|
93
|
+
run: echo "$GITHUB_CONTEXT"
|
94
|
+
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# Build & Deploy RubyGem & GitHub release when a SemVer tag is pushed
|
2
|
+
# ------------------------------------------------------------------------------
|
3
|
+
#
|
4
|
+
# NOTICE: **This file is maintained with puppetsync**
|
5
|
+
#
|
6
|
+
# This file is updated automatically as part of an asset baseline.
|
7
|
+
#
|
8
|
+
# The next baseline sync will overwrite any local changes to this file!
|
9
|
+
#
|
10
|
+
# ==============================================================================
|
11
|
+
#
|
12
|
+
# This pipeline uses the following GitHub Action Secrets:
|
13
|
+
#
|
14
|
+
# GitHub Secret variable Type Notes
|
15
|
+
# ------------------------ -------- ----------------------------------------
|
16
|
+
# RUBYGEMS_API_KEY Required
|
17
|
+
#
|
18
|
+
# ------------------------------------------------------------------------------
|
19
|
+
#
|
20
|
+
# NOTES:
|
21
|
+
#
|
22
|
+
# * The CHANGLOG text is altered to remove RPM-style date headers, which don't
|
23
|
+
# render well as markdown on the GitHub release pages
|
24
|
+
---
|
25
|
+
name: 'Tag: Release to GitHub & rubygems.org'
|
26
|
+
|
27
|
+
on:
|
28
|
+
push:
|
29
|
+
tags:
|
30
|
+
- '[0-9]+\.[0-9]+\.[0-9]+'
|
31
|
+
|
32
|
+
env:
|
33
|
+
PUPPET_VERSION: '~> 6'
|
34
|
+
LOCAL_WORKFLOW_CONFIG_FILE: .github/workflows.local.json
|
35
|
+
|
36
|
+
jobs:
|
37
|
+
releng-checks:
|
38
|
+
name: "RELENG checks"
|
39
|
+
runs-on: ubuntu-18.04
|
40
|
+
outputs:
|
41
|
+
build_command: ${{ steps.commands.outputs.build_command }}
|
42
|
+
release_command: ${{ steps.commands.outputs.release_command }}
|
43
|
+
steps:
|
44
|
+
- name: "Assert '${{ github.ref }}' is a tag"
|
45
|
+
run: '[[ "$GITHUB_REF" =~ ^refs/tags/ ]] || { echo "::error ::GITHUB_REF is not a tag: ${GITHUB_REF}"; exit 1 ; }'
|
46
|
+
- uses: actions/checkout@v2
|
47
|
+
with:
|
48
|
+
ref: ${{ github.ref }}
|
49
|
+
clean: true
|
50
|
+
- name: Determing build and release commands
|
51
|
+
id: commands
|
52
|
+
run: |
|
53
|
+
# By default, these are the standard tasks from "bundler/gem_tasks"
|
54
|
+
# To override them in the LOCAL_WORKFLOW_CONFIG_FILE
|
55
|
+
GEM_BUILD_COMMAND='bundle exec rake build'
|
56
|
+
GEM_RELEASE_COMMAND='gem push pkg/*.gem'
|
57
|
+
if jq -r '. | keys' "$LOCAL_WORKFLOW_CONFIG_FILE" 2>/dev/null | \
|
58
|
+
grep -w '"gem_build_command"' &> /dev/null; then
|
59
|
+
GEM_BUILD_COMMAND="$(jq .gem_build_command "$LOCAL_WORKFLOW_CONFIG_FILE" )"
|
60
|
+
fi
|
61
|
+
if jq -r '. | keys' "$LOCAL_WORKFLOW_CONFIG_FILE" 2>/dev/null | \
|
62
|
+
grep -w '"gem_release_command"' &> /dev/null; then
|
63
|
+
GEM_RELEASE_COMMAND="$(jq .gem_release_command "$LOCAL_WORKFLOW_CONFIG_FILE" )"
|
64
|
+
fi
|
65
|
+
echo "::set-output name=build_command::${GEM_BUILD_COMMAND}"
|
66
|
+
echo "::set-output name=release_command::${GEM_RELEASE_COMMAND}"
|
67
|
+
echo "+set-output name=build_command::${GEM_BUILD_COMMAND}"
|
68
|
+
echo "+set-output name=release_command::${GEM_RELEASE_COMMAND}"
|
69
|
+
- uses: ruby/setup-ruby@v1
|
70
|
+
with:
|
71
|
+
ruby-version: 2.5
|
72
|
+
bundler-cache: true
|
73
|
+
- name: Test build the package
|
74
|
+
run: "${{ steps.commands.outputs.build_command }}"
|
75
|
+
|
76
|
+
create-github-release:
|
77
|
+
name: Deploy GitHub Release
|
78
|
+
needs: [ releng-checks ]
|
79
|
+
runs-on: ubuntu-18.04
|
80
|
+
steps:
|
81
|
+
- name: Checkout code
|
82
|
+
uses: actions/checkout@v2
|
83
|
+
with:
|
84
|
+
ref: ${{ github.ref }}
|
85
|
+
clean: true
|
86
|
+
fetch-depth: 0
|
87
|
+
- name: Get tag & annotation info (${{github.ref}})
|
88
|
+
id: tag-check
|
89
|
+
run: |
|
90
|
+
tag="${GITHUB_REF/refs\/tags\//}"
|
91
|
+
annotation="$(git for-each-ref "$GITHUB_REF" --format='%(contents)' --count=1)"
|
92
|
+
annotation_title="$(echo "$annotation" | head -1)"
|
93
|
+
|
94
|
+
echo "::set-output name=tag::${tag}"
|
95
|
+
echo "::set-output name=annotation_title::${annotation_title}"
|
96
|
+
|
97
|
+
# Prepare annotation body as a file for the next step
|
98
|
+
#
|
99
|
+
# * The GitHub Release render the text in this file as markdown
|
100
|
+
# * The file is needed because :set-output only supports single lines
|
101
|
+
# * The `perl -pe` removes RPM-style date headers from the CHANGELOG,
|
102
|
+
# because they don't render well as markdown on the Release page
|
103
|
+
#
|
104
|
+
echo "$annotation" | tail -n +2 | \
|
105
|
+
perl -pe 'BEGIN{undef $/;} s/\n\* (Mon|Tue|Wed|Thu|Fri|Sat|Sun) .*?\n//smg;' > /tmp/annotation.body
|
106
|
+
|
107
|
+
- name: Create Release
|
108
|
+
uses: actions/create-release@v1
|
109
|
+
id: create_release
|
110
|
+
env:
|
111
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
112
|
+
with:
|
113
|
+
tag_name: ${{ github.ref }}
|
114
|
+
release_name: ${{ steps.tag-check.outputs.annotation_title }}
|
115
|
+
body_path: /tmp/annotation.body
|
116
|
+
draft: false
|
117
|
+
prerelease: false
|
118
|
+
|
119
|
+
deploy-rubygem:
|
120
|
+
name: Deploy RubyGem Release
|
121
|
+
needs: [ releng-checks ]
|
122
|
+
runs-on: ubuntu-18.04
|
123
|
+
env:
|
124
|
+
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
125
|
+
BUILD_COMMAND: ${{ needs.releng-checks.outputs.build_command }}
|
126
|
+
RELEASE_COMMAND: ${{ needs.releng-checks.outputs.release_command }}
|
127
|
+
steps:
|
128
|
+
- name: Checkout code
|
129
|
+
uses: actions/checkout@v2
|
130
|
+
with:
|
131
|
+
ref: ${{ github.ref }}
|
132
|
+
clean: true
|
133
|
+
- uses: ruby/setup-ruby@v1
|
134
|
+
with:
|
135
|
+
ruby-version: 2.5
|
136
|
+
bundler-cache: true
|
137
|
+
- name: Build RubyGem
|
138
|
+
run: '$BUILD_COMMAND'
|
139
|
+
|
140
|
+
- name: Release RubyGem
|
141
|
+
run: |
|
142
|
+
echo "Setting up gem credentials..."
|
143
|
+
mkdir -p ~/.gem
|
144
|
+
|
145
|
+
cat << EOF > ~/.gem/credentials
|
146
|
+
---
|
147
|
+
:rubygems_api_key: ${RUBYGEMS_API_KEY}
|
148
|
+
EOF
|
149
|
+
chmod 0600 ~/.gem/credentials
|
150
|
+
|
151
|
+
chmod -R go=u-w .
|
152
|
+
|
153
|
+
echo "Running '$RELEASE_COMMAND'..."
|
154
|
+
$RELEASE_COMMAND
|
data/.gitignore
ADDED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
---
|
2
|
+
# Official language image. Look for the different tagged releases at:
|
3
|
+
# https://hub.docker.com/r/library/ruby/tags/
|
4
|
+
image: "ruby:2.5"
|
5
|
+
|
6
|
+
# Cache gems in between builds
|
7
|
+
cache:
|
8
|
+
paths:
|
9
|
+
- .vendor/ruby
|
10
|
+
|
11
|
+
# This is a basic example for a gem or script which doesn't use
|
12
|
+
# services such as redis or postgres
|
13
|
+
before_script:
|
14
|
+
- ruby -v # Print out ruby version for debugging
|
15
|
+
- bundle install -j $(nproc) --path .vendor # Install dependencies into ./vendor/ruby
|
16
|
+
|
17
|
+
# Optional - Delete if not using `rubocop`
|
18
|
+
rubocop:
|
19
|
+
tags:
|
20
|
+
- docker
|
21
|
+
script:
|
22
|
+
- bundle exec rubocop
|
23
|
+
|
24
|
+
rspec:
|
25
|
+
tags:
|
26
|
+
- docker
|
27
|
+
script:
|
28
|
+
- bundle exec rspec spec
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
rubygem-simp-test - An inert gem to test CI
|
2
|
+
|
3
|
+
--
|
4
|
+
|
5
|
+
Per Section 105 of the Copyright Act of 1976, these works are not entitled to
|
6
|
+
domestic copyright protection under US Federal law.
|
7
|
+
|
8
|
+
The US Government retains the right to pursue copyright protections outside of
|
9
|
+
the United States.
|
10
|
+
|
11
|
+
The United States Government has unlimited rights in this software and all
|
12
|
+
derivatives thereof, pursuant to the contracts under which it was developed and
|
13
|
+
the License under which it falls.
|
14
|
+
|
15
|
+
---
|
16
|
+
|
17
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
18
|
+
you may not use this file except in compliance with the License.
|
19
|
+
You may obtain a copy of the License at
|
20
|
+
|
21
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
22
|
+
|
23
|
+
Unless required by applicable law or agreed to in writing, software
|
24
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
25
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
26
|
+
See the License for the specific language governing permissions and
|
27
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Simp::Test
|
2
|
+
|
3
|
+
This gem does nothing; it is used to test CI
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'simp-test'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle install
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install simp-test
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Development
|
26
|
+
|
27
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
28
|
+
|
29
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
|
33
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/simp-test.
|
34
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'simp/test'
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require 'irb'
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/lib/simp/test.rb
ADDED
data/simp-test.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/simp/test/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'simp-test'
|
7
|
+
spec.version = Simp::Test::VERSION
|
8
|
+
spec.authors = ['SIMP Team']
|
9
|
+
spec.email = ['info@simp-project.com']
|
10
|
+
|
11
|
+
spec.summary = 'test gem for CI'
|
12
|
+
spec.homepage = 'https://github.com/simp/rubygem-simp-test'
|
13
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
|
+
|
15
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
16
|
+
spec.metadata['source_code_uri'] = 'https://github.com/simp/rubygem-simp-test'
|
17
|
+
spec.metadata['changelog_uri'] = 'https://github.com/simp/rubygem-simp-test/blob/master/CHANGELOG.md'
|
18
|
+
|
19
|
+
# Specify which files should be added to the gem when it is released.
|
20
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
21
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
22
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
23
|
+
end
|
24
|
+
spec.bindir = 'exe'
|
25
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
+
spec.require_paths = ['lib']
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simp-test
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- SIMP Team
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- info@simp-project.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".github/workflows/pr_glci.yml"
|
21
|
+
- ".github/workflows/pr_glci_cleanup.yml"
|
22
|
+
- ".github/workflows/pr_glci_manual.yml"
|
23
|
+
- ".github/workflows/pr_tests.yml"
|
24
|
+
- ".github/workflows/tag_deploy_rubygem.yml"
|
25
|
+
- ".gitignore"
|
26
|
+
- ".gitlab-ci.yml"
|
27
|
+
- ".rspec"
|
28
|
+
- Gemfile
|
29
|
+
- LICENSE
|
30
|
+
- README.md
|
31
|
+
- Rakefile
|
32
|
+
- bin/console
|
33
|
+
- bin/setup
|
34
|
+
- lib/simp/test.rb
|
35
|
+
- lib/simp/test/version.rb
|
36
|
+
- simp-test.gemspec
|
37
|
+
homepage: https://github.com/simp/rubygem-simp-test
|
38
|
+
licenses: []
|
39
|
+
metadata:
|
40
|
+
homepage_uri: https://github.com/simp/rubygem-simp-test
|
41
|
+
source_code_uri: https://github.com/simp/rubygem-simp-test
|
42
|
+
changelog_uri: https://github.com/simp/rubygem-simp-test/blob/master/CHANGELOG.md
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 2.3.0
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.7.6.2
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: test gem for CI
|
63
|
+
test_files: []
|