Compare commits
	
		
			36 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0f9fb80421 | ||
|   | b7800fe6fd | ||
|   | 6e236fe59d | ||
|   | 53f337dbae | ||
|   | f515c5bf8c | ||
|   | 12054aedfd | ||
|   | 893097890f | ||
|   | afed83d63e | ||
|   | 99533eb7f4 | ||
|   | 9c109c7824 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 6304aa16ae | ||
|   | a82a824586 | ||
|   | e36a9c364b | ||
|   | 8c1b8dc260 | ||
|   | a526790753 | ||
|   | d50edfe977 | ||
|   | a5ba64f65e | ||
|   | 64702f4db1 | ||
|   | e56233ce43 | ||
|   | 1bd3567034 | ||
|   | 52b67bd7c8 | ||
|   | d833f7c2ad | ||
|   | 16d491f0ca | ||
|   | 04f461cc60 | ||
|   | 25aa6aa30c | ||
|   | 1a211c6f27 | ||
|   | 12991b4d6c | ||
|   | 34e505eb5e | ||
|   | 2c57607524 | ||
|   | 26618cd0df | ||
|   | da3da99964 | ||
|   | b7cd11b1fa | ||
|   | 16b2f90c24 | ||
|   | 826c451920 | ||
|   | f37c715508 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | e6dc03b339 | 
							
								
								
									
										4
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							| @@ -6,12 +6,12 @@ Contributions to this project are [released](https://help.github.com/articles/gi | ||||
|  | ||||
| ## Submitting a pull request | ||||
|  | ||||
| 1. [Fork](https://github.com/crazy-max/ghaction-docker-login/fork) and clone the repository | ||||
| 1. [Fork](https://github.com/docker/login-action/fork) and clone the repository | ||||
| 2. Configure and install the dependencies: `yarn install` | ||||
| 4. Create a new branch: `git checkout -b my-branch-name` | ||||
| 5. Make your change | ||||
| 6. Run pre-checkin: `yarn run pre-checkin` | ||||
| 7. Push to your fork and [submit a pull request](https://github.com/crazy-max/ghaction-docker-login/compare) | ||||
| 7. Push to your fork and [submit a pull request](https://github.com/docker/login-action/compare) | ||||
| 8. Pat your self on the back and wait for your pull request to be reviewed and merged. | ||||
|  | ||||
| Here are a few things you can do that will increase the likelihood of your pull request being accepted: | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +0,0 @@ | ||||
| github: crazy-max | ||||
| custom: https://www.paypal.me/crazyws | ||||
							
								
								
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @@ -13,11 +13,11 @@ about: Create a report to help us improve | ||||
|  | ||||
| #### Expected behaviour | ||||
|  | ||||
| > Tell me what should happen | ||||
| > Tell us what should happen | ||||
|  | ||||
| #### Actual behaviour | ||||
|  | ||||
| > Tell me what happens instead | ||||
| > Tell us what happens instead | ||||
|  | ||||
| ### Configuration | ||||
|  | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/SUPPORT.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/SUPPORT.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,8 @@ | ||||
| # Support [](https://isitmaintained.com/project/crazy-max/ghaction-docker-login) | ||||
| # Support [](https://isitmaintained.com/project/docker/login-action) | ||||
|  | ||||
| ## Reporting an issue | ||||
|  | ||||
| Please do a search in [open issues](https://github.com/crazy-max/ghaction-docker-login/issues?utf8=%E2%9C%93&q=) to see if the issue or feature request has already been filed. | ||||
| Please do a search in [open issues](https://github.com/docker/login-action/issues?utf8=%E2%9C%93&q=) to see if the issue or feature request has already been filed. | ||||
|  | ||||
| If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment. | ||||
|  | ||||
| @@ -21,9 +21,9 @@ File a single issue per problem and feature request. | ||||
|  | ||||
| The more information you can provide, the more likely someone will be successful reproducing the issue and finding a fix. | ||||
|  | ||||
| You are now ready to [create a new issue](https://github.com/crazy-max/ghaction-docker-login/issues/new/choose)! | ||||
| You are now ready to [create a new issue](https://github.com/docker/login-action/issues/new/choose)! | ||||
|  | ||||
| ## Closure policy | ||||
|  | ||||
| * Issues that don't have the information requested above (when applicable) will be closed immediately and the poster directed to the support guidelines. | ||||
| * Issues that go a week without a response from original poster are subject to closure at my discretion. | ||||
| * Issues that go a week without a response from original poster are subject to closure at our discretion. | ||||
|   | ||||
| Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB | 
							
								
								
									
										134
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										134
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -7,30 +7,34 @@ on: | ||||
|       - releases/v* | ||||
|  | ||||
| jobs: | ||||
|   dockerhub: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         logout: | ||||
|           - true | ||||
|           - false | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.1 | ||||
|       - | ||||
|         name: Login to DockerHub | ||||
|         uses: ./ | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME_TEST }} | ||||
|           password: ${{ secrets.DOCKERHUB_PASSWORD_TEST }} | ||||
|           logout: ${{ matrix.logout }} | ||||
|       - | ||||
|         name: Clear | ||||
|         if: always() | ||||
|         run: | | ||||
|           rm -f ${HOME}/.docker/config.json | ||||
| #  dockerhub: | ||||
| #    runs-on: ${{ matrix.os }} | ||||
| #    strategy: | ||||
| #      fail-fast: false | ||||
| #      matrix: | ||||
| #        os: | ||||
| #          - ubuntu-20.04 | ||||
| #          - ubuntu-18.04 | ||||
| #          - ubuntu-16.04 | ||||
| #        logout: | ||||
| #          - true | ||||
| #          - false | ||||
| #    steps: | ||||
| #      - | ||||
| #        name: Checkout | ||||
| #        uses: actions/checkout@v2.3.2 | ||||
| #      - | ||||
| #        name: Login to DockerHub | ||||
| #        uses: ./ | ||||
| #        with: | ||||
| #          username: ${{ secrets.DOCKERHUB_USERNAME_TEST }} | ||||
| #          password: ${{ secrets.DOCKERHUB_PASSWORD_TEST }} | ||||
| #          logout: ${{ matrix.logout }} | ||||
| #      - | ||||
| #        name: Clear | ||||
| #        if: always() | ||||
| #        run: | | ||||
| #          rm -f ${HOME}/.docker/config.json | ||||
|  | ||||
|   gpr: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -43,7 +47,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.1 | ||||
|         uses: actions/checkout@v2.3.2 | ||||
|       - | ||||
|         name: Login to GitHub Package Registry | ||||
|         uses: ./ | ||||
| @@ -58,28 +62,58 @@ jobs: | ||||
|         run: | | ||||
|           rm -f ${HOME}/.docker/config.json | ||||
|  | ||||
|   gitlab: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         logout: | ||||
|           - true | ||||
|           - false | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.1 | ||||
|       - | ||||
|         name: Login to GitLab | ||||
|         uses: ./ | ||||
|         with: | ||||
|           registry: registry.gitlab.com | ||||
|           username: ${{ secrets.GITLAB_USERNAME_TEST }} | ||||
|           password: ${{ secrets.GITLAB_PASSWORD_TEST }} | ||||
|           logout: ${{ matrix.logout }} | ||||
|       - | ||||
|         name: Clear | ||||
|         if: always() | ||||
|         run: | | ||||
|           rm -f ${HOME}/.docker/config.json | ||||
| #  gitlab: | ||||
| #    runs-on: ubuntu-latest | ||||
| #    strategy: | ||||
| #      fail-fast: false | ||||
| #      matrix: | ||||
| #        logout: | ||||
| #          - true | ||||
| #          - false | ||||
| #    steps: | ||||
| #      - | ||||
| #        name: Checkout | ||||
| #        uses: actions/checkout@v2.3.2 | ||||
| #      - | ||||
| #        name: Login to GitLab | ||||
| #        uses: ./ | ||||
| #        with: | ||||
| #          registry: registry.gitlab.com | ||||
| #          username: ${{ secrets.GITLAB_USERNAME_TEST }} | ||||
| #          password: ${{ secrets.GITLAB_PASSWORD_TEST }} | ||||
| #          logout: ${{ matrix.logout }} | ||||
| #      - | ||||
| #        name: Clear | ||||
| #        if: always() | ||||
| #        run: | | ||||
| #          rm -f ${HOME}/.docker/config.json | ||||
| # | ||||
| #  ecr: | ||||
| #    runs-on: ${{ matrix.os }} | ||||
| #    strategy: | ||||
| #      fail-fast: false | ||||
| #      matrix: | ||||
| #        os: | ||||
| #          - ubuntu-20.04 | ||||
| #          - ubuntu-18.04 | ||||
| #          - ubuntu-16.04 | ||||
| #        logout: | ||||
| #          - true | ||||
| #          - false | ||||
| #    steps: | ||||
| #      - | ||||
| #        name: Checkout | ||||
| #        uses: actions/checkout@v2.3.1 | ||||
| #      - | ||||
| #        name: Login to ECR | ||||
| #        uses: ./ | ||||
| #        with: | ||||
| #          registry: ${{ secrets.AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com | ||||
| #          username: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
| #          password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
| #          logout: ${{ matrix.logout }} | ||||
| #      - | ||||
| #        name: Clear | ||||
| #        if: always() | ||||
| #        run: | | ||||
| #          rm -f ${HOME}/.docker/config.json | ||||
|   | ||||
							
								
								
									
										7
									
								
								.github/workflows/labels.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/labels.yml
									
									
									
									
										vendored
									
									
								
							| @@ -14,10 +14,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.1 | ||||
|         uses: actions/checkout@v2.3.2 | ||||
|       - | ||||
|         name: Run Labeler | ||||
|         if: success() | ||||
|         uses: crazy-max/ghaction-github-labeler@v2.1.0 | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|         uses: crazy-max/ghaction-github-labeler@v3.0.0 | ||||
							
								
								
									
										30
									
								
								.github/workflows/pre-checkin.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/pre-checkin.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,30 +0,0 @@ | ||||
| name: pre-checkin | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|  | ||||
| jobs: | ||||
|   pre-checkin: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.1 | ||||
|       - | ||||
|         name: Install | ||||
|         run: yarn install | ||||
|       - | ||||
|         name: Pre-checkin | ||||
|         run: yarn run pre-checkin | ||||
|       - | ||||
|         name: Check for uncommitted changes | ||||
|         run: | | ||||
|           if [[ `git status --porcelain` ]]; then | ||||
|             git status --porcelain | ||||
|             echo "::warning::Found changes. Please run 'yarn run pre-checkin' and push" | ||||
|           fi | ||||
							
								
								
									
										40
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| name: test | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|  | ||||
| jobs: | ||||
|   test: | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: | ||||
|           - ubuntu-20.04 | ||||
|           - ubuntu-18.04 | ||||
|           - ubuntu-16.04 | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.2 | ||||
|       - | ||||
|         name: Install | ||||
|         run: yarn install | ||||
|       - | ||||
|         name: Test | ||||
|         run: yarn run test | ||||
|       - | ||||
|         name: Upload coverage | ||||
|         uses: codecov/codecov-action@v1.0.13 | ||||
|         if: success() | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           file: ./coverage/clover.xml | ||||
							
								
								
									
										17
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,17 +0,0 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## 1.1.1 (2020/08/16) | ||||
|  | ||||
| * Typo | ||||
|  | ||||
| ## 1.1.0 (2020/08/15) | ||||
|  | ||||
| * Add tests and examples for GitLab and GitHub Package Registry | ||||
|  | ||||
| ## 1.0.1 (2020/08/15) | ||||
|  | ||||
| * Add LICENSE | ||||
|  | ||||
| ## 1.0.0 (2020/08/15) | ||||
|  | ||||
| * Initial version | ||||
							
								
								
									
										204
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,21 +1,191 @@ | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2020 CrazyMax | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         https://www.apache.org/licenses/ | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|    1. Definitions. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    Copyright 2013-2018 Docker, Inc. | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        https://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
|   | ||||
							
								
								
									
										197
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,57 +1,68 @@ | ||||
| [](https://github.com/crazy-max/ghaction-docker-login/releases/latest) | ||||
| [](https://github.com/docker/login-action/releases/latest) | ||||
| [](https://github.com/marketplace/actions/docker-login) | ||||
| [](https://github.com/crazy-max/ghaction-docker-login/actions?workflow=ci) | ||||
| [](https://github.com/sponsors/crazy-max) | ||||
| [](https://www.paypal.me/crazyws) | ||||
| [](https://github.com/docker/login-action/actions?workflow=ci) | ||||
| [](https://github.com/docker/login-action/actions?workflow=test) | ||||
| [](https://codecov.io/gh/docker/login-action) | ||||
|  | ||||
| ## About | ||||
|  | ||||
| GitHub Action to login against a Docker registry | ||||
| GitHub Action to login against a Docker registry. | ||||
|  | ||||
| If you are interested, [check out](https://git.io/Je09Y) my other :octocat: GitHub Actions! | ||||
| > :bulb: See also: | ||||
| > * [setup-buildx](https://github.com/docker/setup-buildx-action) action | ||||
| > * [setup-qemu](https://github.com/docker/setup-qemu-action) action | ||||
| > * [build-push](https://github.com/docker/build-push-action) action | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ___ | ||||
|  | ||||
| * [Usage](#usage) | ||||
|   * [DockerHub](#dockerhub) | ||||
|   * [GitHub Package Registry](#github-package-registry) | ||||
|   * [GitHub Packages Docker Registry](#github-packages-docker-registry) | ||||
|   * [GitHub Container Registry](#github-container-registry) | ||||
|   * [GitLab](#gitlab) | ||||
|   * [Azure Container Registry (ACR)](#azure-container-registry-acr) | ||||
|   * [Google Container Registry (GCR)](#google-container-registry-gcr) | ||||
|   * [AWS Elastic Container Registry (ECR)](#aws-elastic-container-registry-ecr) | ||||
| * [Customizing](#customizing) | ||||
|   * [inputs](#inputs) | ||||
| * [Keep up-to-date with GitHub Dependabot](#keep-up-to-date-with-github-dependabot) | ||||
| * [Limitation](#limitation) | ||||
| * [How can I help?](#how-can-i-help) | ||||
| * [License](#license) | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| ### DockerHub | ||||
|  | ||||
| To authenticate against [DockerHub](https://hub.docker.com) it's strongly recommended to create a | ||||
| [personal access token](https://docs.docker.com/docker-hub/access-tokens/) as an alternative to your password. | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|     tags: | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Login to DockerHub | ||||
|         uses: crazy-max/ghaction-docker-login@v1 | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_PASSWORD }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| ### GitHub Package Registry | ||||
| ### GitHub Packages Docker Registry | ||||
|  | ||||
| > :warning: GitHub Packages Docker Registry (aka `docker.pkg.github.com`) **is deprecated** and will sunset early next | ||||
| > year. It's strongly advised to [migrate to GitHub Container Registry](https://docs.github.com/en/packages/getting-started-with-github-container-registry/migrating-to-github-container-registry-for-docker-images) | ||||
| > instead. | ||||
|  | ||||
| You can configure the Docker client to use [GitHub Packages to publish and retrieve docker images](https://docs.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages). | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
| @@ -59,24 +70,46 @@ name: ci | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|     tags: | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Login to GitHub Package Registry | ||||
|         uses: crazy-max/ghaction-docker-login@v1 | ||||
|         name: Login to GitHub Packages Docker Registry | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: docker.pkg.github.com | ||||
|           username: ${{ github.repository_owner }} | ||||
|           password: ${{ secrets.GITHUB_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| ### GitHub Container Registry | ||||
|  | ||||
| To authenticate against the [GitHub Container Registry](https://docs.github.com/en/packages/getting-started-with-github-container-registry), | ||||
| you will need to create a new [personal access token (PAT)](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) | ||||
| with the [appropriate scopes](https://docs.github.com/en/packages/getting-started-with-github-container-registry/migrating-to-github-container-registry-for-docker-images#authenticating-with-the-container-registry). | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Login to GitHub Container Registry | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: ghcr.io | ||||
|           username: ${{ github.repository_owner }} | ||||
|           password: ${{ secrets.CR_PAT }} | ||||
| ``` | ||||
|  | ||||
| ### GitLab | ||||
|  | ||||
| ```yaml | ||||
| @@ -85,24 +118,103 @@ name: ci | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|     tags: | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Login to GitLab | ||||
|         uses: crazy-max/ghaction-docker-login@v1 | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: registry.gitlab.com | ||||
|           username: ${{ secrets.GITLAB_USERNAME }} | ||||
|           password: ${{ secrets.GITLAB_PASSWORD }} | ||||
| ``` | ||||
|  | ||||
| ### Azure Container Registry (ACR) | ||||
|  | ||||
| [Create a service principal](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal#create-a-service-principal) | ||||
| with access to your container registry through the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) | ||||
| and take note of the generated service principal's ID (also called _client ID_) and password (also called _client secret_). | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Login to ACR | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: <registry-name>.azurecr.io | ||||
|           username: ${{ secrets.AZURE_CLIENT_ID }} | ||||
|           password: ${{ secrets.AZURE_CLIENT_SECRET }} | ||||
| ``` | ||||
|  | ||||
| > Replace `<registry-name>` with the name of your registry. | ||||
|  | ||||
| ### Google Container Registry (GCR) | ||||
|  | ||||
| Use a service account with the ability to push to GCR and [configure access control](https://cloud.google.com/container-registry/docs/access-control). | ||||
| Then create and download the JSON key for this service account and save content of `.json` file | ||||
| [as a secret](https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets-for-a-repository) | ||||
| called `GCR_JSON_KEY` in your GitHub repo. Ensure you set the username to `_json_key`. | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Login to GCR | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: gcr.io | ||||
|           username: _json_key | ||||
|           password: ${{ secrets.GCR_JSON_KEY }} | ||||
| ``` | ||||
|  | ||||
| ### AWS Elastic Container Registry (ECR) | ||||
|  | ||||
| Use an IAM user with the [ability to push to ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr_managed_policies.html). | ||||
| Then create and download access keys and save `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` [as secrets](https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets-for-a-repository) | ||||
| in your GitHub repo. | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
| jobs: | ||||
|   login: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Login to ECR | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: <aws-account-number>.dkr.ecr.<region>.amazonaws.com | ||||
|           username: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
|           password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
| ``` | ||||
|  | ||||
| > Replace `<aws-account-number>` and `<region>` with their respective values. | ||||
|  | ||||
| ## Customizing | ||||
|  | ||||
| ### inputs | ||||
| @@ -116,19 +228,22 @@ Following inputs can be used as `step.with` keys | ||||
| | `password`       | String  |                             | Password or personal access token used to log against the Docker registry | | ||||
| | `logout`         | Bool    | `true`                      | Log out from the Docker registry at the end of a job | | ||||
|  | ||||
| ## Keep up-to-date with GitHub Dependabot | ||||
|  | ||||
| Since [Dependabot](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot) | ||||
| has [native GitHub Actions support](https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem), | ||||
| to enable it on your GitHub repo all you need to do is add the `.github/dependabot.yml` file: | ||||
|  | ||||
| ```yaml | ||||
| version: 2 | ||||
| updates: | ||||
|   # Maintain dependencies for GitHub Actions | ||||
|   - package-ecosystem: "github-actions" | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       interval: "daily" | ||||
| ``` | ||||
|  | ||||
| ## Limitation | ||||
|  | ||||
| This action is only available for Linux [virtual environments](https://help.github.com/en/articles/virtual-environments-for-github-actions#supported-virtual-environments-and-hardware-resources). | ||||
|  | ||||
| ## How can I help? | ||||
|  | ||||
| All kinds of contributions are welcome :raised_hands:! The most basic way to show your support is to star :star2: | ||||
| the project, or to raise issues :speech_balloon: You can also support this project by | ||||
| [**becoming a sponsor on GitHub**](https://github.com/sponsors/crazy-max) :clap: or by making a | ||||
| [Paypal donation](https://www.paypal.me/crazyws) to ensure this journey continues indefinitely! :rocket: | ||||
|  | ||||
| Thanks again for your support, it is much appreciated! :pray: | ||||
|  | ||||
| ## License | ||||
|  | ||||
| MIT. See `LICENSE` for more details. | ||||
|   | ||||
							
								
								
									
										54
									
								
								__tests__/aws.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								__tests__/aws.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| import * as semver from 'semver'; | ||||
| import * as aws from '../src/aws'; | ||||
|  | ||||
| describe('isECR', () => { | ||||
|   test.each([ | ||||
|     ['registry.gitlab.com', false], | ||||
|     ['gcr.io', false], | ||||
|     ['012345678901.dkr.ecr.eu-west-3.amazonaws.com', true] | ||||
|   ])('given registry %p', async (registry, expected) => { | ||||
|     expect(await aws.isECR(registry)).toEqual(expected); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('getCLI', () => { | ||||
|   it('exists', async () => { | ||||
|     const awsPath = await aws.getCLI(); | ||||
|     console.log(`awsPath: ${awsPath}`); | ||||
|     expect(awsPath).not.toEqual(''); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('execCLI', () => { | ||||
|   it('--version not empty', async () => { | ||||
|     const cliCmdOutput = await aws.execCLI(['--version']); | ||||
|     console.log(`cliCmdOutput: ${cliCmdOutput}`); | ||||
|     expect(cliCmdOutput).not.toEqual(''); | ||||
|   }, 100000); | ||||
| }); | ||||
|  | ||||
| describe('getCLIVersion', () => { | ||||
|   it('valid', async () => { | ||||
|     const cliVersion = await aws.getCLIVersion(); | ||||
|     console.log(`cliVersion: ${cliVersion}`); | ||||
|     expect(semver.valid(cliVersion)).not.toBeNull(); | ||||
|   }, 100000); | ||||
| }); | ||||
|  | ||||
| describe('parseCLIVersion', () => { | ||||
|   test.each([ | ||||
|     ['v1', 'aws-cli/1.18.120 Python/2.7.17 Linux/5.3.0-1034-azure botocore/1.17.43', '1.18.120'], | ||||
|     ['v2', 'aws-cli/2.0.41 Python/3.7.3 Linux/4.19.104-microsoft-standard exe/x86_64.ubuntu.18', '2.0.41'] | ||||
|   ])('given aws %p', async (version, stdout, expected) => { | ||||
|     expect(await aws.parseCLIVersion(stdout)).toEqual(expected); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('getRegion', () => { | ||||
|   test.each([['012345678901.dkr.ecr.eu-west-3.amazonaws.com', 'eu-west-3']])( | ||||
|     'given registry %p', | ||||
|     async (registry, expected) => { | ||||
|       expect(await aws.getRegion(registry)).toEqual(expected); | ||||
|     } | ||||
|   ); | ||||
| }); | ||||
| @@ -1,9 +1,9 @@ | ||||
| # https://help.github.com/en/articles/metadata-syntax-for-github-actions | ||||
| name: 'Docker Login' | ||||
| description: 'GitHub Action to login against a Docker registry' | ||||
| author: 'crazy-max' | ||||
| author: 'docker' | ||||
| branding: | ||||
|   icon: 'log-in' | ||||
|   icon: 'anchor' | ||||
|   color: 'blue' | ||||
|  | ||||
| inputs: | ||||
|   | ||||
							
								
								
									
										3584
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3584
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								jest.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								jest.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| module.exports = { | ||||
|   clearMocks: true, | ||||
|   moduleFileExtensions: ['js', 'ts'], | ||||
|   setupFiles: ["dotenv/config"], | ||||
|   testEnvironment: 'node', | ||||
|   testMatch: ['**/*.test.ts'], | ||||
|   testRunner: 'jest-circus/runner', | ||||
|   transform: { | ||||
|     '^.+\\.ts$': 'ts-jest' | ||||
|   }, | ||||
|   verbose: false | ||||
| } | ||||
							
								
								
									
										24
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								package.json
									
									
									
									
									
								
							| @@ -6,28 +6,42 @@ | ||||
|     "build": "tsc && ncc build", | ||||
|     "format": "prettier --write **/*.ts", | ||||
|     "format-check": "prettier --check **/*.ts", | ||||
|     "test": "jest --coverage", | ||||
|     "pre-checkin": "yarn run format && yarn run build" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/crazy-max/ghaction-docker-login.git" | ||||
|     "url": "git+https://github.com/docker/login-action.git" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "actions", | ||||
|     "docker", | ||||
|     "login" | ||||
|   ], | ||||
|   "author": "CrazyMax", | ||||
|   "author": "Docker", | ||||
|   "contributors": [ | ||||
|     { | ||||
|       "name": "CrazyMax", | ||||
|       "url": "https://crazymax.dev" | ||||
|     } | ||||
|   ], | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.2.4", | ||||
|     "@actions/exec": "^1.0.4" | ||||
|     "@actions/core": "^1.2.5", | ||||
|     "@actions/exec": "^1.0.4", | ||||
|     "@actions/io": "^1.0.2", | ||||
|     "semver": "^7.3.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^26.0.3", | ||||
|     "@types/node": "^14.0.14", | ||||
|     "@zeit/ncc": "^0.22.3", | ||||
|     "@vercel/ncc": "^0.23.0", | ||||
|     "dotenv": "^8.2.0", | ||||
|     "jest": "^26.1.0", | ||||
|     "jest-circus": "^26.1.0", | ||||
|     "jest-runtime": "^26.1.0", | ||||
|     "prettier": "^2.0.5", | ||||
|     "ts-jest": "^26.1.1", | ||||
|     "typescript": "^3.9.5", | ||||
|     "typescript-formatter": "^7.2.2" | ||||
|   } | ||||
|   | ||||
							
								
								
									
										51
									
								
								src/aws.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/aws.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| import * as semver from 'semver'; | ||||
| import * as io from '@actions/io'; | ||||
| import * as execm from './exec'; | ||||
|  | ||||
| export const isECR = async (registry: string): Promise<boolean> => { | ||||
|   return registry.includes('amazonaws'); | ||||
| }; | ||||
|  | ||||
| export const getRegion = async (registry: string): Promise<string> => { | ||||
|   return registry.substring(registry.indexOf('ecr.') + 4, registry.indexOf('.amazonaws')); | ||||
| }; | ||||
|  | ||||
| export const getCLI = async (): Promise<string> => { | ||||
|   return io.which('aws', true); | ||||
| }; | ||||
|  | ||||
| export const execCLI = async (args: string[]): Promise<string> => { | ||||
|   return execm.exec(await getCLI(), args, true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(res.stderr); | ||||
|     } else if (res.stderr != '') { | ||||
|       return res.stderr.trim(); | ||||
|     } else { | ||||
|       return res.stdout.trim(); | ||||
|     } | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| export const getCLIVersion = async (): Promise<string> => { | ||||
|   return parseCLIVersion(await execCLI(['--version'])); | ||||
| }; | ||||
|  | ||||
| export const parseCLIVersion = async (stdout: string): Promise<string> => { | ||||
|   const matches = /aws-cli\/([0-9.]+)/.exec(stdout); | ||||
|   if (!matches) { | ||||
|     throw new Error(`Cannot parse AWS CLI version`); | ||||
|   } | ||||
|   return semver.clean(matches[1]); | ||||
| }; | ||||
|  | ||||
| export const getDockerLoginCmd = async (cliVersion: string, registry: string, region: string): Promise<string> => { | ||||
|   if (semver.satisfies(cliVersion, '>=2.0.0')) { | ||||
|     return execCLI(['ecr', 'get-login-password', '--region', region]).then(pwd => { | ||||
|       return `docker login --username AWS --password ${pwd} ${registry}`; | ||||
|     }); | ||||
|   } else { | ||||
|     return execCLI(['ecr', 'get-login', '--region', region, '--no-include-email']).then(dockerLoginCmd => { | ||||
|       return dockerLoginCmd; | ||||
|     }); | ||||
|   } | ||||
| }; | ||||
							
								
								
									
										17
									
								
								src/context.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/context.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| import * as core from '@actions/core'; | ||||
|  | ||||
| export interface Inputs { | ||||
|   registry: string; | ||||
|   username: string; | ||||
|   password: string; | ||||
|   logout: string; | ||||
| } | ||||
|  | ||||
| export async function getInputs(): Promise<Inputs> { | ||||
|   return { | ||||
|     registry: core.getInput('registry'), | ||||
|     username: core.getInput('username'), | ||||
|     password: core.getInput('password', {required: true}), | ||||
|     logout: core.getInput('logout') | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										60
									
								
								src/docker.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/docker.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| import * as core from '@actions/core'; | ||||
| import * as aws from './aws'; | ||||
| import * as execm from './exec'; | ||||
|  | ||||
| export async function login(registry: string, username: string, password: string): Promise<void> { | ||||
|   if (await aws.isECR(registry)) { | ||||
|     await loginECR(registry, username, password); | ||||
|   } else { | ||||
|     await loginStandard(registry, username, password); | ||||
|   } | ||||
| } | ||||
|  | ||||
| export async function logout(registry: string): Promise<void> { | ||||
|   await execm.exec('docker', ['logout', registry], false).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       core.warning(res.stderr); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function loginStandard(registry: string, username: string, password: string): Promise<void> { | ||||
|   let loginArgs: Array<string> = ['login', '--password-stdin']; | ||||
|   if (username) { | ||||
|     loginArgs.push('--username', username); | ||||
|   } | ||||
|   loginArgs.push(registry); | ||||
|  | ||||
|   if (registry) { | ||||
|     core.info(`🔑 Logging into ${registry}...`); | ||||
|   } else { | ||||
|     core.info(`🔑 Logging into DockerHub...`); | ||||
|   } | ||||
|   await execm.exec('docker', loginArgs, true, password).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(res.stderr); | ||||
|     } | ||||
|     core.info('🎉 Login Succeeded!'); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function loginECR(registry: string, username: string, password: string): Promise<void> { | ||||
|   const cliPath = await aws.getCLI(); | ||||
|   const cliVersion = await aws.getCLIVersion(); | ||||
|   const region = await aws.getRegion(registry); | ||||
|   core.info(`💡 AWS ECR detected with ${region} region`); | ||||
|  | ||||
|   process.env.AWS_ACCESS_KEY_ID = username; | ||||
|   process.env.AWS_SECRET_ACCESS_KEY = password; | ||||
|  | ||||
|   core.info(`⬇️ Retrieving docker login command through AWS CLI ${cliVersion} (${cliPath})...`); | ||||
|   const loginCmd = await aws.getDockerLoginCmd(cliVersion, registry, region); | ||||
|  | ||||
|   core.info(`🔑 Logging into ${registry}...`); | ||||
|   execm.exec(loginCmd, [], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(res.stderr); | ||||
|     } | ||||
|     core.info('🎉 Login Succeeded!'); | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										10
									
								
								src/exec.ts
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/exec.ts
									
									
									
									
									
								
							| @@ -7,13 +7,19 @@ export interface ExecResult { | ||||
|   stderr: string; | ||||
| } | ||||
|  | ||||
| export const exec = async (command: string, args: string[] = [], silent: boolean): Promise<ExecResult> => { | ||||
| export const exec = async ( | ||||
|   command: string, | ||||
|   args: string[] = [], | ||||
|   silent: boolean, | ||||
|   stdin?: string | ||||
| ): Promise<ExecResult> => { | ||||
|   let stdout: string = ''; | ||||
|   let stderr: string = ''; | ||||
|  | ||||
|   const options: ExecOptions = { | ||||
|     silent: silent, | ||||
|     ignoreReturnCode: true | ||||
|     ignoreReturnCode: true, | ||||
|     input: Buffer.from(stdin || '') | ||||
|   }; | ||||
|   options.listeners = { | ||||
|     stdout: (data: Buffer) => { | ||||
|   | ||||
							
								
								
									
										32
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| import * as os from 'os'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as exec from './exec'; | ||||
| import {getInputs, Inputs} from './context'; | ||||
| import * as docker from './docker'; | ||||
| import * as stateHelper from './state-helper'; | ||||
|  | ||||
| async function run(): Promise<void> { | ||||
| @@ -10,25 +11,10 @@ async function run(): Promise<void> { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const registry: string = core.getInput('registry'); | ||||
|     stateHelper.setRegistry(registry); | ||||
|     stateHelper.setLogout(core.getInput('logout')); | ||||
|  | ||||
|     const username: string = core.getInput('username'); | ||||
|     const password: string = core.getInput('password', {required: true}); | ||||
|  | ||||
|     let loginArgs: Array<string> = ['login', '--password', password]; | ||||
|     if (username) { | ||||
|       loginArgs.push('--username', username); | ||||
|     } | ||||
|     loginArgs.push(registry); | ||||
|  | ||||
|     await exec.exec('docker', loginArgs, true).then(res => { | ||||
|       if (res.stderr != '' && !res.success) { | ||||
|         throw new Error(res.stderr); | ||||
|       } | ||||
|       core.info('🎉 Login Succeeded!'); | ||||
|     }); | ||||
|     let inputs: Inputs = await getInputs(); | ||||
|     stateHelper.setRegistry(inputs.registry); | ||||
|     stateHelper.setLogout(inputs.logout); | ||||
|     await docker.login(inputs.registry, inputs.username, inputs.password); | ||||
|   } catch (error) { | ||||
|     core.setFailed(error.message); | ||||
|   } | ||||
| @@ -38,11 +24,7 @@ async function logout(): Promise<void> { | ||||
|   if (!stateHelper.logout) { | ||||
|     return; | ||||
|   } | ||||
|   await exec.exec('docker', ['logout', stateHelper.registry], false).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       core.warning(res.stderr); | ||||
|     } | ||||
|   }); | ||||
|   await docker.logout(stateHelper.registry); | ||||
| } | ||||
|  | ||||
| if (!stateHelper.IsPost) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user